【CUDA】Warp Sum & Warp Scan
Warp Sum
各Warpの持つ値の合計を計算する。 例:[1, 2, 3, 4] -> [10, 10, 10, 10]
for (int i = 1; i < warpSize; i *= 2) value += __shfl_xor(value, i);
Warp Scan
各Warpの持つ値の累積を計算する。 例:[1, 2, 3, 4] -> [1, 3, 6, 10]
for (int i = 1; i < warpSize; i *= 2) { int n = __shfl_up(value, i); if (laneId >= i) value += n; }
サンプルコード
2017/12/11追記
warpSize
はどうやらコンパイル時定数ではないみたいです。
そのため、サンプルコードのように書くとループ展開が行われない可能性があります。
パフォーマンスを気にするのであれば warpSize
→ 32
とした方が良さそうです。