2011-08-19 65 views
0

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

我的第二个问题是,当涉及到OpenMP和TBB时,OpenMP在性能上总是比TBB好,因为在我的实现中,我没有对它进行优化,因为我并不那么专业。 OpenMP性能通常比TBB更好吗?因为我认为他们两个甚至是OpenCL都会在低层使用相同类型的线程池......任何专家意见?谢谢

+2

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

回答

0

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

3

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

C编译器也可以利用SIMD并行机制的一些优势,使用自动矢量化,但是C中的内存别名规则使得它在某些情况下很难工作。由于OpenCL要求程序员明确地调出工作项目并隔离内存访问,所以OpenCL编译器可能更具侵略性。

最后,这取决于你的代码。我们可以找到OpenCL,OpenMP或TBB都是最好的算法。

+0

我在所有情况下都使用了intel编译器,因此我使用“icc -O0”选项编译了我的所有应用程序以禁用编译器的自动优化。所以我想我停止了像SIMD等自动优化的编译器,但是有人告诉我OpenCL需要在clBuildProgram函数中使用“-cl-opt-disable”选项来禁用OpenCL自动优化;但是当我尝试的时候,它给了我错误为“undefined -cl-opt-disable”,我正在使用最新的AMD OpenCL SDK,为什么我会遇到这个问题?英特尔的-O0选项有助于禁用OpenCL自动优化? –

+1

如果您在C代码上使用-O0,编译器当然不会尝试进行矢量化。实际上,我不会花时间担心-O0代码编译器的性能。在-O3比较代码的性能和编译器优化更有趣。 – boiler96

+1

@AkhtarAli,您将OpenCL代码与OpenMP和TBB进行了比较,没有进行优化。真是太傻了! –

1

Intel提供的CPU和MIC的OpenCL运行时使用TBB。它远不仅仅是'低级别的线程池',因为它利用了TBB提供的复杂的调度和分区算法,以实现更好的负载均衡和更好的CPU利用率。

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

+0

我考虑使用TBB而不是OpenMP。我一直在寻找的主要特征是定义线程拓扑(核心,套接字,逻辑处理器......)的一种方法,因为OpenMP没有直接的支持,但TBB似乎也不是。此外,TBB是基于任务的而不是基于线程的,所以不是给我更少的低级控制。我不是要批评。我想知道我是否误解了TBB,应该再考虑TBB。 –

+1

TBB提供task_arena和task_scheduler_observer。在编程中拥有这些和黑带,您可以根据需要固定工作线程,并根据需要限制工作分配。实际上,这些功能是由OpenCL的裂变功能驱动的。基于线程的编程不可组合,这对嵌套算法不利,对库不好。由于更好的负载平衡,TBB经常击败OpenMP。 – Anton

+1

更好的负载平衡是一个非常诱人的功能。我想我会再看看TBB。 –