GPUプログラミング

GPUで多数の値の総和を求めるとき、木の形のリダクション(隣どうしを足して半分にすることを繰り返す)を使う理由として正しいものはどれか。

  1. A1つのスレッドが順番に足すよりも、足し算の回数が大きく減るから
  2. B各段で多くのスレッドが同時に足し算でき、n個の値をlog2 n段で合計できるから
  3. C浮動小数点の誤差が必ず0になるから
答えと解説を見る

正解:B. 各段で多くのスレッドが同時に足し算でき、n個の値をlog2 n段で合計できるから

1つのスレッドが順に足すとn-1段かかりますが、木の形にすると、1段目でn/2本のスレッドが隣どうしを足し、2段目でn/4本が…と繰り返して、log2 n段で終わります。足し算の総回数は変わりませんが、段数が少ないので並列に速く計算できます。ブロックの中では共有メモリで段を進め、ブロックごとの結果を最後にまとめて合計します。

  • A. 足し算の回数はどちらもn-1回です。
  • B. 正しい。並列に足せる形に組み替えています。
  • C. 誤差はなくなりません(小さくなることはあります)。
この分野を解く 分野ページへ

GPUプログラミングのほかの問題

  1. 1024個の値を木の形のリダクションで合計するとき、必要な段の数はいくつか。
  2. 単体のGPUを使うプログラムで、CPU側のメモリとGPU側のメモリについて一般的に正しいものはどれか。
  3. 配列の要素を1回だけ足し算するような軽い処理のためにデータをGPUへ送ると、CPUで計算するより遅くなることがある。主な理由はどれか。
  4. CPUのメモリをピン留め(ページロック)してからGPUへ転送すると速くなる理由として正しいものはどれか。
  5. CUDAのストリームを複数使う主な目的はどれか。