GPUプログラミング
GPUのカーネルを書くときに守るべき前提として正しいものはどれか。
- Aスレッドは必ず番号の小さい順に1本ずつ実行される
- Bブロック0が終わるまで、ブロック1は必ず始まらない
- Cスレッドやブロックがどの順番で実行されるかは決まっていないので、結果が実行の順番に左右されないように書く
答えと解説を見る
正解:C. スレッドやブロックがどの順番で実行されるかは決まっていないので、結果が実行の順番に左右されないように書く
GPUはスレッドとブロックを空いている資源に次々と割り当てるので、実行の順番はGPUの機種や負荷によって変わります。あるスレッドが別のスレッドの書いた値を当てにすると、たまたま正しく動いても別の環境では誤ります。順番が必要な場合は、ブロックの中なら__syncthreads()、ブロックの間ならカーネルを分ける、足し合わせならアトミック演算やリダクションを使います。
- A. 多数のスレッドが同時に、順番の保証なく動きます。
- B. ブロックは同時に、どの順番でも実行されえます。
- C. 正しい。順番が必要なら同期を使います。