僅使用暫存器進行單經線並行縮減

通常,減少是在全域性或共享陣列上執行的。但是,當縮小是在非常小的範圍內執行時,作為更大的 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);
}

此版本適用於可交換和非交換運算子。