【发布时间】:2012-04-18 07:56:55
【问题描述】:
如果一个块中的所有线程绝对需要在代码中的同一点,如果正在启动的线程数等于线程数中的线程数,我们是否需要 __syncthreads 函数?
注意:没有额外的线程或块,只是内核的一个 warp。
示例代码:
shared _voltatile_ sdata[16];
int index = some_number_between_0_and_15;
sdata[tid] = some_number;
output[tid] = x ^ y ^ z ^ sdata[index];
【问题讨论】:
-
我认为这在很大程度上是一个无关紧要的问题,因为如果您在每个块中运行
warpSize(32) 个线程,您最终的性能可能会低于运行您的CPU 上的算法。 -
@RogerDahl 我不确定我是否完全理解,你是说在 warp 中使用 32 个线程总是比任何内核的 CPU 都慢?
-
我没有说“总是”,因为人们可能会想出一组我的陈述不适用的特殊情况。问题是,如果您将
threads per block限制为warpSize,您最终可能会得到极低的占用率(受max blocks per multiprocessor的限制),这意味着性能低下。此外,当您可以简单地增加threads per block并添加__syncthreads()以获得更好的性能时,人为地将threads per block保持在低水平是没有任何意义的。 -
因此,如您所见,使用限制为 16 个线程的算法,您可以做的任何优化都是徒劳的。在 CPU 上运行它会更好。
-
嘿。 SO 告诉我避免在 cmets 中进行扩展讨论,并希望我将其移至聊天。因此,如果您在阅读本文后仍有疑问,请继续并提出一个新问题。引用http.developer.nvidia.com/GPUGems3/gpugems3_ch36.html:但是,因为CBC模式需要前一个步骤的密文来处理下一步,所以在前一个块被加密之前不可能开始加密。所以我们不能指望在这种模式的加密阶段进行并行处理。
标签: parallel-processing cuda synchronization