【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;
}

サンプルコード

CUDA Warp's Sum and Scan

2017/12/11追記

warpSizeはどうやらコンパイル時定数ではないみたいです。 そのため、サンプルコードのように書くとループ展開が行われない可能性があります。 パフォーマンスを気にするのであれば warpSize32 とした方が良さそうです。