【发布时间】:2016-05-11 06:49:46
【问题描述】:
我正在尝试进行Nvidia Reduction 中看到的所有优化。我已经实现了前四个部分,但我被第 22 号幻灯片的第 5 部分卡住了。
我无法理解为什么提供的代码可以在没有任何同步线程()的情况下工作的原因。线程可以访问输出中的相同内存位置。
此外,幻灯片表明,如果变量未设置为 volatile,则代码将无法工作。不稳定在这方面有什么帮助?如果我不想调用内核,最好的编程方法是什么?
我也将这段代码放在这里以供参考。
__device__ void warpReduce(volatile int* sdata, int tid) {
sdata[tid] += sdata[tid + 32];
sdata[tid] += sdata[tid + 16];
sdata[tid] += sdata[tid + 8];
sdata[tid] += sdata[tid + 4];
sdata[tid] += sdata[tid + 2];
sdata[tid] += sdata[tid + 1];
}
for (unsigned int s=blockDim.x/2; s>32; s>>=1) {
if (tid < s)
sdata[tid] += sdata[tid + s];
__syncthreads();
}
if (tid < 32) warpReduce(sdata, tid);
提前感谢您的帮助。如果需要更多信息,请发表评论。
【问题讨论】: