【问题标题】:OpenCL - Impact of barrier on performanceOpenCL - 障碍对性能的影响
【发布时间】:2011-12-05 20:28:21
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: performance opencl


    【解决方案1】:

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

    您必须在您或您的用户感兴趣的平台和实现上进行衡量。

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

    【讨论】:

      【解决方案2】:

      取决于计算这些公共值的复杂性,以及有多少工作项能够并行运行。

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

      • 选项1和单线程和1000个工作项:1000A + 1000B
      • 选项 2 和单线程和 1000 个工作项:A + AO + 1000B + 1000BO
      • 具有 1000 个线程和 1000 个工作项的选项 1:A + B
      • 选项 2 有 1000 个线程和 1000 个工作项:A + AO + B + BO

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

      真相可能在中间的某个地方。

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

      【讨论】:

      • 其实没那么简单,因为不能保证所有线程都可以并行执行,所以1000个线程可以是nA+nB对于选项 1,而对于选项 2 是 A+nAO+nB+n*BO。我不得不承认我不明白单线程示例的意义。为什么一个线程会重新计算 A 1000 次,而它甚至不需要屏障来与自己同步?
      • 此外,根据架构和 A 的精确计算方式,当多个线程尝试并行执行时(例如,因为它们都试图访问相同的内存和架构无法处理广播),对于 m>=1 的选项 1 来说,它是 mnA+n*B。因此,如果不考虑架构、线程数量以及计算 A 的成本与屏障成本的关系,最后真的不可能给出任何答案
      猜你喜欢
      • 2011-10-16
      • 2018-10-23
      • 2011-11-09
      • 2011-12-04
      • 2015-08-14
      • 2013-08-30
      • 2021-03-09
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多