CUDA样本 - 使用__shfl_up进行前缀扫描 - 写得效率低(额外评估)?

时间:2013-07-10 12:53:19

标签: cuda

下面是使用__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;在运行示例时会产生相同的结果,但是,我想确保我不会错过一些不起作用的特殊情况。

0 个答案:

没有答案