GPUプログラミング

CUDAで、__syncthreads()を「if (threadIdx.x < 16)」の中に書き、一部のスレッドだけが通るようにした。起こりうることとして正しいものはどれか。

  1. A16本のスレッドだけで同期が取れ、正しく動く
  2. Bほかのスレッドが永久に到着しないので、ブロックが止まったり、結果が不定になったりする
  3. C__syncthreads()は自動で無視されるので、何も起こらない
答えと解説を見る

正解:B. ほかのスレッドが永久に到着しないので、ブロックが止まったり、結果が不定になったりする

__syncthreads()はブロックのすべてのスレッドの到着を待つので、一部のスレッドしか通らない分岐の中に書くと、待っても来ないスレッドがいることになります。仕様では動作が定義されず、実際には止まってしまったり、たまたま動いても結果がおかしくなったりします。同期は分岐の外側、すべてのスレッドが必ず通る場所に書くのが原則です。

  • A. ブロックの全員の到着を待つ命令です。
  • B. 正しい。ブロックの全員が通る場所に書く必要があります。
  • C. 無視されることはありません。
この分野を解く 分野ページへ

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

  1. CUDAの共有メモリのバンク競合の説明として正しいものはどれか。
  2. 32×32のfloatの表を共有メモリに置き、ワープの32本で列の方向(縦)に読むとバンク競合が起きる。よく使われる対策はどれか。
  3. GPUで大きな行列の積を計算するとき、行列を小さなタイルに分けて共有メモリに読み込む理由として正しいものはどれか。
  4. GPUのカーネルで、1スレッドあたりのレジスタの使用量が多すぎると起こりうることとして正しいものはどれか。
  5. GPUの占有率(オキュパンシー)の説明として正しいものはどれか。