1

我正在查看来自 Nvidia 的并行缩减示例。如果tid < 32那么线程都意味着在同一个warp中,那么指令应该是SIMD同步的,所以我们可以假设sdata[tid] += sdata[tid + 32];之前的所有线程都完成了sdata[tid] += sdata[tid + 16];,依此类推。但这对我来说并没有发生。

for (unsigned int s=groupDim_x/2; s>32; s>>=1) 
{ 
    if (tid < s) sdata[tid] += sdata[tid + s]; 
    GroupMemoryBarrierWithGroupSync(); 
}
if (tid < 32)
{ 
    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]; 
}

Cuda 上相同问题的解决方案已经发布(参见),但它使用指针和 volatile 关键字。Directcompute 没有指针,也不允许在全局内存上使用 volatile 关键字。

4

1 回答 1

2

Directcompute 没有指针,也不允许在全局内存上使用 volatile 关键字。

确实,但它公开了与内在函数相当的功能。用内在函数替换+=你的循环,看看会发生什么。但是,该函数仅适用于整数。InterlockedAdd

于 2020-09-23T00:14:33.930 回答