【发布时间】:2020-09-13 06:02:18
【问题描述】:
我正试图了解 Mark Harris 的 reduction in CUDA 中的减少技术 #5。
Reduction #5 通过应用最后的 warp 展开改进了之前的 reduction #4。
幻灯片 21 提到:“我们不需要 __syncthreads()”,这是我不明白的部分。
下面是主要逻辑的代码:
__device__ void warpReduce(volatile int* sdata, int tid) {
sdata[tid] += sdata[tid + 32]; // line A
sdata[tid] += sdata[tid + 16]; // line B
sdata[tid] += sdata[tid + 8];
sdata[tid] += sdata[tid + 4];
sdata[tid] += sdata[tid + 2];
sdata[tid] += sdata[tid + 1];
}
// later...
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);
我不明白为什么行 A 和行 B 之间没有__syncthreads()(以及下一行之间)。
我的问题:是否有可能在同一个warp 中,一个线程在另一个线程执行A 行之前执行B 行? (好像是不可能的,有谁能确认一下并详细说明)
【问题讨论】:
标签: cuda synchronization nvidia