【发布时间】: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