OpenCL - 障碍对绩效的影响

时间:2011-10-12 05:45:01

标签: performance opencl

在OpenCL中,所有线程都需要计算一些常见值。以下哪两种情况更快? 1.所有线程计算值,存储在私有内存中,线程之间不需要同步。 2.一个线程计算并存储在本地存储器中。由障碍同步。工作组的所有线程都访问本地内存中的值。

感谢。

2 个答案:

答案 0 :(得分:2)

考虑到OpenCL执行的设备范围(例如各种GPU,各种CPU和Cell BE),对此有没有正确的答案? CPU和GPU之间的性能特征差别很大,也可能在GPU供应商和型号之间存在很大差异。

您必须衡量您或您的用户感兴趣的平台和实施。

在您的情况下是否可以预先计算主机上的少数公共值,并将它们作为动态参数传递给OpenCL内核,或者作为OpenCL内核的编译时参数传递?

答案 1 :(得分:2)

取决于计算这些常用值的复杂性,以及能够并行运行的工作项数量。

让我们说计算公共值的时间是A,其余计算的时间是B,屏障的开销是AO& BO(A部分和B部分)。我们可以计算每个选项的时间。

  • 选项1和单个线程以及1000个工作项:1000A + 1000B
  • 选项2和单个线程以及1000个工作项:A + AO + 1000B + 1000BO
  • 选项1包含1000个主题和1000个工作项:A + B
  • 选项2包含1000个主题和1000个工作项:A + AO + B + BO

当您拥有与工作项一样多的线程时,选项2显然较慢。 当你有一个单独的线程时,如果BO比A小,那么选项2可能更快。

事实可能就在中间。

选项3让主机计算这些值并将结果放在恒定的内存中。如果你这样做,并使用一点双缓冲,你可能会在等待OpenCL进行当前计算时隐藏计算下一组常用值的时间。