代码之家  ›  专栏  ›  技术社区  ›  mmr

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

  •  3
  • mmr  · 技术社区  · 15 年前

    我有一个图像处理程序,我相信可以很快使非常并行。每个像素需要在其上执行大约2k个操作,而不依赖于在相邻像素上执行的操作,因此将工作分成不同的单元相当简单。

    理想情况下,我正在寻找的库/方法应该满足以下条件:

    1. 五年后还在。在不久的将来,CUDA或ATI的变种可能会被一个硬件较少的解决方案所取代,所以我想要一个对时间更健壮的解决方案。如果我对库达的印象是错误的,我欢迎更正。
    2. 不需要太多的硬件知识。我希望不必指定线程或操作单元的数量,而是根据所使用的机器自动计算出所有这些。
    3. 在廉价的硬件上运行。这可能意味着一张150美元的显卡,或者别的什么。
    4. 在Windows上运行。像GCD这样的东西可能是正确的选择,但我的目标客户群不会很快转向Mac或Linux。请注意,这确实使对问题的回答与对 this other question

    我应该看哪些库/方法/语言?我已经看过OpenMP、CUDA、GCD等等,但是我想知道我是否还缺少其他东西。

    我现在倾向于使用shaders和opengl 2.0,但这可能不是正确的调用,因为我不确定我可以通过这种方式访问多少内存——那些2k操作需要通过多种方式访问所有相邻像素。

    5 回复  |  直到 7 年前
        1
  •  1
  •   CookieOfFortune    15 年前

    最简单的方法可能是将图片分成可以并行处理的部分(4、8、16,取决于核心)。然后对每个部分运行不同的进程。

    具体来说,看看OpenCL。因为它不是特定于供应商的,而且NVidia和ATI都希望支持它,所以希望它能存在更长的时间。

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

        2
  •  1
  •   Ed_S    15 年前

    Intel® Integrated Performance Primitives 在我工作的公司做图像分析。

    线程构建块(TBB)类似于OpenMP和Cilk。它使用OpenMP进行多线程处理,只是封装在一个更简单的接口中。有了它,您不必担心要创建多少线程,只需定义任务。如果可以的话,它会分割任务,让一切都保持忙碌,并为您实现负载平衡。

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

        3
  •  0
  •   sbi    15 年前

    你看过英特尔(开源)的吗 Threading Building Blocks

        4
  •  0
  •   Imran.Fanaswala    15 年前

    我没用过,不过看看 Cilk . 他们队里的一个大人物是查尔斯·雷瑟森,他是队里的“L” CLRS ,是地球上使用最广泛/最受尊敬的算法书。

    根据我的简短阅读,你所要做的就是“标记”你的 现有的 代码,然后通过编译器运行它,编译器将自动/无缝地并行化代码。这是它们最大的卖点,所以您不必从头开始考虑并行性,这与其他选项(如OpenMP)不同。

        5
  •  0
  •   High Performance Mark    15 年前

    如果你已经在C、C++或FORTRAN中有一个工作序列代码,你应该认真考虑OpenMP。它相对于许多其他并行化库/语言/系统/任何东西的一大优势是,您可以一次并行一个循环,这意味着您可以获得有用的速度,而无需重新编写或(更糟的是)重新设计您的程序。

    根据您的要求:

    1. 如果你足够幸运地选择C、C++或FORTRAN,就足够快地实现。

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

    3. 运行在您已经拥有的硬件上,不需要昂贵或廉价的额外图形卡。

    当然,如果你不明智,在开始时没有选择C、C++或FORTRAN,那么许多建议只会在你重新编写成一种语言之后应用。

    当做