Image processing 什么';并行化代码的最快方法是什么?

Image processing 什么';并行化代码的最快方法是什么?,image-processing,parallel-processing,Image Processing,Parallel Processing,我有一个图像处理程序,我相信它可以很快地实现并行化。每个像素需要在其上执行大约2k个操作,而不依赖于在相邻像素上执行的操作,因此将工作分成不同的单元是相当简单的 我的问题是,实现这一变化的最佳方式是什么,以使我能以最快的速度加速 理想情况下,我正在寻找的库/方法应满足以下标准: 5年后仍然存在。在不久的将来,像CUDA或ATI的变体这样的产品可能会被一种不太特定于硬件的解决方案所取代,所以我想要一种对时间更健壮的产品。如果我对CUDA的印象是错误的,我欢迎纠正 快速实施。我已经写了这段代码,它在

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

我的问题是,实现这一变化的最佳方式是什么,以使我能以最快的速度加速

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

  • 5年后仍然存在。在不久的将来,像CUDA或ATI的变体这样的产品可能会被一种不太特定于硬件的解决方案所取代,所以我想要一种对时间更健壮的产品。如果我对CUDA的印象是错误的,我欢迎纠正
  • 快速实施。我已经写了这段代码,它在串行模式下工作,尽管速度很慢。理想情况下,我只需要将代码重新编译为并行代码,但我认为这可能是一种幻想。如果我只是使用不同的范例(例如,作为着色器或其他东西)重写它,那么也可以
  • 不需要太多的硬件知识。我希望能够不必指定线程或操作单元的数量,而是根据所使用的机器自动为我计算出所有这些
  • 可以在廉价硬件上运行。这可能意味着一张150美元的显卡,或者别的什么
  • 可以在Windows上运行。像GCD这样的东西可能是正确的选择,但我瞄准的客户群不会很快转向Mac或Linux。请注意,这确实使对问题的回答与对问题的回答有所不同
  • 我应该看哪些库/方法/语言?我看过OpenMP、CUDA、GCD等,但我想知道是否还有其他东西我遗漏了


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

    你看过英特尔(开源)吗

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

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


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

    我没有使用它,但请看一看。他们队里的一个大人物是查尔斯·E·莱瑟森;他是世界上使用最广泛/最受尊敬的算法书籍《L》中的“L”。 我认为它很符合你的要求


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

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

    根据您的要求:

  • OpenMP在高性能计算中得到了广泛应用,它背后有很多“分量”,还有一个活跃的开发社区——www.OpenMP.org

  • >p>如果你足够幸运地选择C、C++或FORTRAN,那么就足够快实现。

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

  • 在您已有的硬件上运行,不需要昂贵或便宜的额外图形卡

  • 是的,有针对Windows系统的实现

  • 当然,如果你不明智,在开始时没有选择C、C++或FORTRAN,那么很多建议只会在你重新编写成这些语言之后应用。p> 问候


    Mark

    我还建议使用线程构建块。我们在我工作的公司里用它做图像分析

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

    “英特尔集成性能原件”(Ipp)针对vision优化了库。其中大多数是多线程的。对于IPP中不包含的我们需要的函数,我们使用TBB对它们进行线程化


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

    我没有,我会检查一下。我会看一下。OpenCL是否要求我指定内核的数量?我有点希望把所有的东西都分解成“工作单元”,就这样吧。好吧,只需开发你的算法,使其能够在任意数量的核上运行。我熟悉IPP,但发现了多线程/TIL