仅使用寄存器进行单经线并行缩减
通常,减少是在全局或共享阵列上执行的。但是,当缩小是在非常小的范围内执行时,作为更大的 CUDA 内核的一部分,它可以用单个 warp 执行。当发生这种情况时,在 Keppler 或更高版本的架构上(CC> = 3.0),可以使用 warp-shuffle 函数来避免使用共享内存。
例如,假设 warp 中的每个线程都包含单个输入数据值。所有线程一起有 32 个元素,我们需要总结(或执行其他关联操作)
__device__ int sumSingleWarpReg(int value) {
value += __shfl_down(value, 1);
value += __shfl_down(value, 2);
value += __shfl_down(value, 4);
value += __shfl_down(value, 8);
value += __shfl_down(value, 16);
return __shfl(value,0);
}
此版本适用于可交换和非交换运算符。