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(至少是我目前测试的那些),对不起,我应该提到这一点。英伟达