Parallel processing 非SIMD同步的扭曲线程

Parallel processing 非SIMD同步的扭曲线程,parallel-processing,gpgpu,hlsl,compute-shader,directcompute,Parallel Processing,Gpgpu,Hlsl,Compute Shader,Directcompute,我正在进行平行归约。如果tid32;s>>=1) { 如果(tid

我正在进行平行归约。如果
tid<32
,则所有线程都将处于相同的扭曲中,因此指令假定为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]; 
}
for(unsigned int s=groupDim\u x/2;s>32;s>>=1)
{ 
如果(tid
Cuda上相同问题的解决方案已经发布(),但它使用指针和volatile关键字。Directcompute没有指针,并且不允许全局内存中使用volatile关键字

Directcompute没有指针,并且不允许全局内存中使用volatile关键字


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

您使用的是什么硬件?注意,英伟达示例假定使用的GPU的翘曲尺寸至少为32,这对于大多数硬件来说是正确的,但对于所有硬件来说都不保证是正确的。特别是Intels集成GPU的翘曲尺寸往往为4(至少是我目前测试的那些),对不起,我应该提到这一点。英伟达