下面是使用__shfl_up
命令(ComputeCapability>=3.0
)的前缀sum(在一个warp中)的标准代码。在shfl_scan.cu
示例中,CUDA
中出现了这种方式,称为“带有随机内在函数的CUDA并行前缀和(SHFL_Scan)”,以及互联网中的其他位置。
我无法理解为什么在for循环中测试是i <= width
而不是 i < width
(请记住我在所有示例中width=warpSize=32
看到了,包括我在这里提到的样本)。毕竟,如果i==width
那么总和就准备好了 - 当我相等width/2
时,它们已经在上一步准备好了。此外,我们假设width=warpSize=32
,然后__shfl_up(value,32)
绝对没有做任何事情,因为所有通道ID都小于32.在这种情况下,条件lane_id >= i
的计算结果为false,并且完全跳过if ,即没有再做一次,所以整个迭代绝对没有。
我错过了什么吗?
__global__ void shfl_prefix_sum(int *data, int width=32)
{
int id = ((blockIdx.x * blockDim.x) + threadIdx.x);
int lane_id = id % warpSize;
int value = data[id];
// Now accumulate in log2(32) steps
for(int i=1; i<=width; i*=2) {
int n = __shfl_up(value, i);
if(lane_id >= i) value += n;
}
// Write out our result
data[id] = value;
}
编辑:更改&gt; =至&gt;在运行示例时会产生相同的结果,但是,我想确保我不会错过一些不起作用的特殊情况。