对于一个令人尴尬的并行问题,最好的解决方案是什么?

时间:2010-06-21 19:29:01

标签: parallel-processing

对于模糊的主题问题感到抱歉,但我正在研究一些学术视频处理程序。这些算法是用MATLAB编写的,虽然它可以用于开发目的,但它处理的视频大约为60spf,或大约为0.0166fps。毋庸置疑,这对于演示等都不够,所以我的暑期工作就是将常规转换为运行速度更快的程序。

我已经重写了CUDA代码中最慢的部分,即nvidia的GPGPU解决方案。但是,还有很大一部分代码似乎在CPU上做得更好,因为它是相对串行的。问题是,我给的机器有2个Xeon处理器,共有8个逻辑核心,通过仅编码单核来编码GPU代码似乎是一种耻辱。视频转换过程的功能在于每个帧都不依赖于其他帧,所以我认为某种异步队列/流最好。

这就是我的问题:实现这种并行性的最佳方法是什么才能以最快的速度提高产量?

我看过的一些解决方案是OpenMP,.net TPL和简单的pthreads。

我只对异步编程有基本的接触,所以我宁愿使用库或其他东西,而不是乱用互斥和障碍,并多次射击自己。我不介意学习,因为这是我今年夏天的目标之一,但与此同时,并行性很难。但是,如果速度差实际上非常明显,我愿意把头发拉出几个星期。 :P

提前致谢。

2 个答案:

答案 0 :(得分:3)

如果最大限度地提高产量是你的目标,我建议你看一下.NET中的TPL。这可能是实现这一目标的最简单方法。根据您的代码执行的操作,您可以构建管道,或者甚至在每个“框架”上使用Parallel.For(或ForEach)。

话虽这么说,如果你想坚持原生的非托管代码,一个好的选择可能是微软的新Parallel Patterns LibraryIntel's Threading Building Blocks。它们都具有与新TPL相似的结构,特别是对于数据并行,并且只要“每帧不依赖于其他帧”仍然如此,这将使这很容易并行化。

答案 1 :(得分:1)

我的建议是以逐步的方式解决这个问题。

  1. 首先,证明您有一个功能非MATLAB实现。这是非常重要的,坦率地说,我认为你应该计划在考虑表现之前先花费100%的大脑周期来获得正确性。

  2. 对解决方案进行分区:证明您可以采用您认为与实现的其余部分分离的例程,并在语法上将其与其余代码隔离开来。例如,如果您正在谈论光线跟踪器,您可以从单个视点将数据从单个像素拍摄到公共环境中。这也是非常重要的,因为它需要您考虑实际上常见的内容(例如,环境的几何形状,纹理贴图等)以及特定于特定情况的内容(例如,从眼睛到像素的光线) 。性能分析是你的朋友。

  3. 确定您感兴趣的库或框架的语法,这些库或框架是并行创建线程/进程所需的,启动它们并在完成后加入其结果。注意:您需要对共享数据等进行互斥。例如,在Java世界中,这将是java.util.concurrency

  4. 尝试创建两个(仅两个)线程,将您的工作分成两半。编写基准测试,允许您测量初始解决方案,N = 2个线程的解决方案,并对结果进行剖析。

  5. 只有这样你才能考虑进一步的并行化。

  6. 如果您按照这些步骤进行操作,您将(a)成功完成您的实际任务(来自MATLAB的端口),(b)具有适用于某些已知性能指标的内容,以及(c)如果您有明确的前进路径我想进一步利用平等机会。