什么是最快的代码并行化方法?

时间:2009-11-11 21:44:47

标签: image-processing parallel-processing

我有一个图像处理程序,我相信可以非常快速地使其非常平行。每个像素需要以不依赖于对邻居进行的操作的方式对其进行大约2k次操作,因此将工作分成不同的单位是相当简单的。

我的问题是,采用这种变化的最佳方式是什么,以便我获得最快的加速效果?

理想情况下,我正在寻找的图书馆/方法应符合以下标准:

  1. 还有5年左右的时间。在不太遥远的未来,像CUDA或ATI这样的变体可能会被一个特定于硬件的解决方案所取代,所以我想要一些时间更健壮的东西。如果我对CUDA的印象错误,我欢迎更正。
  2. 快速实施。我已经编写了这段代码,它在串行模式下运行,虽然速度很慢。理想情况下,我只需要将我的代码重新编译为并行,但我认为这可能是一种幻想。如果我只是使用不同的范例(即着色器或其他东西)重写它,那么那也没关系。
  3. 不需要太多的硬件知识。我希望能够不必指定线程或操作单元的数量,而是根据所使用的机器自动计算出所有这些内容。
  4. 可以在便宜的硬件上运行。这可能意味着150美元的显卡,或其他什么。
  5. 可以在Windows上运行。像GCD这样的东西可能是正确的电话,但我所针对的客户群不会很快切换到Mac或Linux。请注意,这确实使问题的响应与this other question略有不同。
  6. 我应该关注哪些图书馆/方法/语言?我已经看过像OpenMP,CUDA,GCD等等,但我想知道是否还有其他我缺少的东西。

    我现在正倾向于像着色器和opengl 2.0这样的东西,但这可能不是正确的调用,因为我不确定我可以通过这种方式访问​​多少内存 - 这些2k操作需要访问所有相邻的像素在很多方面。

5 个答案:

答案 0 :(得分:1)

最简单的方法可能是将您的图片划分为可以并行处理的部分数量(4,8,16,具体取决于核心)。然后为每个部分运行不同的过程。

具体来说,请看一下OpenCL。它有望持续更长时间,因为它不是供应商特定的,NVidia和ATI都希望支持它。

一般情况下,由于您不需要共享太多数据,因此该过程非常简单。

答案 1 :(得分:1)

我还建议使用线程构建模块。我们将Intel® Integrated Performance Primitives用于我工作的公司的图像分析。

线程构建模块(TBB)类似于OpenMP和Cilk。它使用OpenMP进行多线程处理,它只是包含在一个更简单的界面中。有了它,您不必担心要创建多少个线程,只需定义任务即可。如果可以,它将分割任务,以保持一切忙碌,并为您进行负载平衡。

英特尔集成性能基元(Ipp)针对视觉优化了库。其中大多数是多线程的。对于我们需要的不在IPP中的函数,我们使用TBB对它们进行线程化。

使用这些,我们在使用IPP方法创建图像时获得最佳结果。它的作用是填充每一行,以便任何给定的缓存行完全包含在一行中。然后我们不会跨越线程在图像中划分一行。这样我们就不会从试图写入同一缓存行的两个线程中进行错误共享。

答案 2 :(得分:0)

你见过英特尔(开源)Threading Building Blocks吗?

答案 3 :(得分:0)

我没有使用它,但请看Cilk。他们团队中最大的假发之一是Charles E. Leiserson;他是CLRS中的“L”,是地球上最受广泛/最受尊敬使用的算法书。 我认为它很适合您的要求。

从我的简短读物中,您所要做的就是“标记”您的现有代码,然后通过编译器运行它,这将自动/无缝地并行化代码。这是他们的主要卖点,因此您不需要考虑并行性而不是其他选项(如OpenMP)。

答案 4 :(得分:0)

如果您已经在C,C ++或Fortran中使用了一个可用的串行代码,那么您应该认真考虑OpenMP。与许多其他并行化库/语言/系统/无论什么相比,它的一大优势是,您可以一次并行化一个循环,这意味着您可以获得有用的加速而无需重写,或者更糟糕的是, - 设计,你的程序。

根据您的要求:

  1. OpenMP在高性能计算中被广泛使用,它背后有很多“重量”,还有一个活跃的开发社区 - www.openmp.org。

  2. 如果你有幸选择了C,C ++或Fortran,那么实施得足够快。

  3. OpenMP实现了并行计算的共享内存方法,因此在“不需要理解硬件”这一论点中有很大的优势。您可以让程序计算出它在运行时有多少处理器,然后将计算分布在任何可用的处理器上,另外加上另外一个。

  4. 在您已有的硬件上运行,无需昂贵或廉价的附加图形卡。

  5. 是的,有Windows系统的实现。

  6. 当然,如果你在一开始就没有选择C,C ++或Fortran,那么很多这样的建议只有在你把它重新编写成其中一种语言之后才适用!

    此致

    标记