【发布时间】:2011-12-05 20:28:21
【问题描述】:
在 OpenCL 中,所有线程都需要计算几个公共值。以下两种情况哪一种更快? 1.所有线程计算值,存储在私有内存中,线程之间不需要同步。 2. 一个线程计算并存储在本地内存中。由屏障同步。工作组的所有线程都访问本地内存中的值。
谢谢。
【问题讨论】:
标签: performance opencl
在 OpenCL 中,所有线程都需要计算几个公共值。以下两种情况哪一种更快? 1.所有线程计算值,存储在私有内存中,线程之间不需要同步。 2. 一个线程计算并存储在本地内存中。由屏障同步。工作组的所有线程都访问本地内存中的值。
谢谢。
【问题讨论】:
标签: performance opencl
考虑到执行 OpenCL 的设备范围(例如各种 GPU、各种 CPU 和 Cell BE),对此是否有任何正确答案? CPU 和 GPU 之间的性能特征会有很大差异,GPU 供应商和型号之间也可能存在差异。
您必须在您或您的用户感兴趣的平台和实现上进行衡量。
在您的情况下,是否可以预先计算主机上的几个常用值,并将它们作为动态参数传递给 OpenCL 内核,或者作为编译时参数传递给 OpenCL 内核?
【讨论】:
取决于计算这些公共值的复杂性,以及有多少工作项能够并行运行。
假设计算公共值的时间是 A,进行其余计算的时间是 B,屏障的开销是 AO & BO(A 部分和 B 部分)。我们可以计算每个选项的时间。
当您拥有与工作项一样多的线程时,选项 2 显然会更慢。 当你有一个单线程时,如果 BO 比 A 小,选项 2 可能更快。
真相可能在中间的某个地方。
选项 3 是让主机计算这些值并将结果放入常量内存中。如果您这样做,并使用一点双缓冲,您可能会在等待 OpenCL 进行当前计算时隐藏计算下一组常用值的时间。
【讨论】: