在OpenCL中,所有线程都需要计算一些常见值。以下哪两种情况更快? 1.所有线程计算值,存储在私有内存中,线程之间不需要同步。 2.一个线程计算并存储在本地存储器中。由障碍同步。工作组的所有线程都访问本地内存中的值。
感谢。
答案 0 :(得分:2)
考虑到OpenCL执行的设备范围(例如各种GPU,各种CPU和Cell BE),对此有没有正确的答案? CPU和GPU之间的性能特征差别很大,也可能在GPU供应商和型号之间存在很大差异。
您必须衡量您或您的用户感兴趣的平台和实施。
在您的情况下是否可以预先计算主机上的少数公共值,并将它们作为动态参数传递给OpenCL内核,或者作为OpenCL内核的编译时参数传递?
答案 1 :(得分:2)
取决于计算这些常用值的复杂性,以及能够并行运行的工作项数量。
让我们说计算公共值的时间是A,其余计算的时间是B,屏障的开销是AO& BO(A部分和B部分)。我们可以计算每个选项的时间。
当您拥有与工作项一样多的线程时,选项2显然较慢。 当你有一个单独的线程时,如果BO比A小,那么选项2可能更快。
事实可能就在中间。
选项3让主机计算这些值并将结果放在恒定的内存中。如果你这样做,并使用一点双缓冲,你可能会在等待OpenCL进行当前计算时隐藏计算下一组常用值的时间。