0

我在 OpenMP、TBB 和 OpenCL 中实现了一些正常的循环应用程序。在所有这些应用程序中,当我只在 CPU 上运行 OpeCL 而没有在内核中进行特定优化时,OpeCL 的性能也比其他应用程序好得多。OpenMP 和 TBB 也提供了良好的性能,但远低于 OpenCL,这可能是什么原因,因为它们都是 CPU 专用框架,并且应该至少提供与 OpenMP/TBB 相等的性能。

我的第二个担忧是,当涉及到 OpenMP 和 TBB 时,OpenMP 在我的实现中总是比 TBB 性能更好,因为我不是那么专家,所以我没有调整它以获得非常好的优化。OpenMP 在性能上通常比 TBB 更好是有原因的吗?因为我认为他们都甚至 OpenCL 也在低级别使用相同类型的线程池......任何专家意见?谢谢

4

3 回答 3

4

OpenCL 相对于 TBB 和 OpenMP 的优势之一是它可以更好地利用硬件中的 SIMD 并行性。一些 OpenCL 实现将运行您的代码,以便每个工作项在机器的 SIMD 矢量通道中运行,以及在单独的内核上运行。根据算法,这可以提供很多性能优势。

C 编译器也可以利用 SIMD 并行性,使用自动向量化,但 C 中的内存别名规则在某些情况下很难实现这一点。由于 OpenCL 要求程序员显式调用工作项和隔离内存访问,因此 OpenCL 编译器可能更具侵略性。

最后,这取决于您的代码。人们可以找到一种算法,其中任何一种 OpenCL、OpenMP 或 TBB 都是最好的。

于 2011-08-20T04:24:46.800 回答
2

英特尔提供的用于 CPU 和 MIC 的 OpenCL 运行时在底层使用 TBB。它远不只是“低级别的线程池”,因为它利用了 TBB 提供的复杂调度和分区算法来实现更好的负载平衡,从而更好地利用 CPU。

至于 TBB 与 OpenMP。通常,它归结为不正确的测量。例如,TBB 没有像 OpenMP 中那样的隐式屏障,因此热身循环是不够的。您必须确保创建了所有线程,并且此开销不包含在您的测量中。另一个例子:有时,编译器不能用 TBB 向量化相同的代码,而 TBB 是用 OpenMP 向量化的。

于 2014-09-30T10:03:45.723 回答
0

OpenCL 内核是为给定的硬件编译的。供应商/硬件特定优化的潜力是巨大的。

于 2011-08-19T23:39:26.507 回答