GPUプログラミング

GPUのカーネルを書くときに守るべき前提として正しいものはどれか。

  1. Aスレッドは必ず番号の小さい順に1本ずつ実行される
  2. Bブロック0が終わるまで、ブロック1は必ず始まらない
  3. Cスレッドやブロックがどの順番で実行されるかは決まっていないので、結果が実行の順番に左右されないように書く
答えと解説を見る

正解:C. スレッドやブロックがどの順番で実行されるかは決まっていないので、結果が実行の順番に左右されないように書く

GPUはスレッドとブロックを空いている資源に次々と割り当てるので、実行の順番はGPUの機種や負荷によって変わります。あるスレッドが別のスレッドの書いた値を当てにすると、たまたま正しく動いても別の環境では誤ります。順番が必要な場合は、ブロックの中なら__syncthreads()、ブロックの間ならカーネルを分ける、足し合わせならアトミック演算やリダクションを使います。

  • A. 多数のスレッドが同時に、順番の保証なく動きます。
  • B. ブロックは同時に、どの順番でも実行されえます。
  • C. 正しい。順番が必要なら同期を使います。
この分野を解く 分野ページへ

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

  1. GPUで大きな行列を転置する(b[j][i] = a[i][j])とき、共有メモリを経由させる主な目的はどれか。
  2. CUDAで、CPU側のプログラムがカーネルを起動した直後の動作として一般に正しいものはどれか。
  3. CPUとGPUの設計の考え方の違いとして正しいものはどれか。
  4. GPUで速く処理できる仕事の特徴として最も適切なものはどれか。
  5. GPUで実行すると効率が悪くなりやすい処理はどれか。