【问题标题】:OpenCL, TBB, OpenMPOpenCL、待定、OpenMP
【发布时间】:2011-08-19 19:42:55
【问题描述】:

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

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

【问题讨论】:

  • 你的算法是什么?你的操作系统和编译器是什么?

标签: multithreading opencl openmp tbb


【解决方案1】:

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

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

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

【讨论】:

  • 我在所有情况下都使用英特尔编译器,因此我使用“icc -O0”选项编译了我的所有应用程序,以禁用编译器的自动优化。所以我想我停止了编译器进行 SIMD 等自动优化,但有人告诉我 OpenCL 需要 clBuildProgram 函数中的“-cl-opt-disable”选项来禁用 OpenCL 自动优化;但是当我尝试这样做时,它给我的错误是“未定义 -cl-opt-disable”,我使用的是最新的 AMD OpenCL SDK,为什么会出现这个问题?英特尔的 -O0 选项是否有助于禁用 OpenCL 自动优化?
  • 如果您在 C 代码上使用 -O0,编译器肯定不会尝试向量化。事实上,我不会花时间担心带有 -O0 的代码编译器的性能。将代码的性能与 -O3 的编译器优化进行比较会更有趣。
  • @AkhtarAli,您将 OpenCL 代码与未经优化的 OpenMP 和 TBB 进行了比较。真是太傻了!
  • OpenMP 4 支持 SIMD。有关详细信息,请参阅规范。英特尔编译器现在肯定支持此功能。
【解决方案2】:

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

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

【讨论】:

  • 我研究过使用 TBB 代替 OpenMP。我一直在寻找的主要功能是一种定义线程拓扑(内核、套接字、逻辑处理器……)的方法,因为 OpenMP 对此没有直接支持,但 TBB 似乎也没有?此外,TBB 是基于任务的,而不是基于线程的,因此与其给我更多的低级控制,不如给我更少的控制。我不是要批评。我想知道我是否误解了 TBB,是否应该再次考虑 TBB。
  • TBB 提供 task_arena 和 task_scheduler_observer。拥有这些和编程黑带,您可以根据需要固定工作线程并将工作分配限制为您想要的。实际上,这些特性是由 OpenCL 的裂变特性驱动的。基于线程的编程是不可组合的,它对嵌套算法不利,对库不利。由于更好的负载平衡,TBB 经常击败 OpenMP。
  • 更好的负载平衡是一个非常诱人的功能。我想我会再次研究 TBB。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多