我正在开发一个程序,该程序不断从视频流接收帧并计算每对帧之间的运动估计值。

由于硬件限制,我必须在CPU中计算运动估计(ME)算法,每次计算大约需要2秒。因此,我想用多线程实现ME算法。这个想法是在另一个线程中计算运动值时从主线程中的流中接收下一个帧。

我在每个任务中都使用一个线程来完成它,也就是说,每次接收到一对帧时,我都会创建一个新线程来计算运动值。但是,由于运动计算的时间过长,因此创建并运行了许多线程,我认为这不是很有效。

我认为重新实现此目标的最佳方法是使用线程池。例如,一方面有一个主线程接收帧并将它们存储在缓冲区或队列中,另一方面有4个或8个线程并发运行并从接收缓冲区中读取数据,如果我没有记错的话,应该加以保护通过互斥。但是,主线程接收帧的速度比一个运动计算结束要快得多,我不知道该如何处理。

我对C ++和线程非常陌生,因此,如果您能以伪代码为我提供一些解决方案来开始重新实现,我将不胜感激。

非常感谢

最佳答案

在这种情况下,我将避免使用线程池。从wikipedia(重点是我):


  [线程池]可提高性能并避免由于频繁创建和销毁短期任务的线程而导致的执行延迟。


您长时间运行的计算使创建和销毁线程所需的时间相形见,,因此对我来说,为每个任务创建线程似乎是合理的。您可以避免互斥量和数量越多越好。至于一次运行多个线程,在线程之间切换所花费的时间也比计算时间相形见,,因此限制使用的线程数只会给您很小的加速比1。

您可能遇到问题的地方是您的计算机是否无法足够快地完成计算以跟上传入数据的速度。如果您所有的CPU内核都以100%的速度运行,那么您唯一可以做的就是提高计算效率(也许降低视频帧的采样率?)或获得更大的计算能力。




  它们是30fps实时传入的帧。


1我应该注意,对于实时应用程序,应将使用的线程数限制为内核数(或对其配置一个或两个以上)。这将减少接收帧与产生结果之间的等待时间,而不会影响整体性能。

10-08 02:24