【问题标题】:Warp threads not SIMD synchronousWarp 线程不是 SIMD 同步的
【发布时间】:2020-09-12 00:43:43
【问题描述】:

我正在经历并行缩减example from 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 上相同问题的解决方案已经发布 (see),但它使用指针和 volatile 关键字。 Directcompute 没有指针,也不允许在全局内存上使用 volatile 关键字。

【问题讨论】:

  • 您使用的是什么硬件?请注意,NVidia 示例假定您使用扭曲大小至少为 32 的 GPU - 这对于大多数硬件都是正确的,但不能保证对所有硬件都是正确的。尤其是 Intel 的集成 GPU 的扭曲尺寸往往为 4(至少是我迄今为止测试过的那些)
  • 对不起,我应该提到这一点。英伟达

标签: parallel-processing gpgpu hlsl compute-shader directcompute


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 2020-01-02
    • 2012-11-22
    • 2019-06-03
    • 2012-01-31
    • 2014-04-30
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多