经纱不是SIMD同步的



我将介绍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关键字。

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

的确如此,但它将类似的功能公开为内部函数。用InterlockedAdd内在函数替换循环中的+=,看看会发生什么。然而,该函数仅适用于整数。

相关内容

  • 没有找到相关文章

最新更新