GPUプログラミング
CUDAで、__syncthreads()を「if (threadIdx.x < 16)」の中に書き、一部のスレッドだけが通るようにした。起こりうることとして正しいものはどれか。
- A16本のスレッドだけで同期が取れ、正しく動く
- Bほかのスレッドが永久に到着しないので、ブロックが止まったり、結果が不定になったりする
- C__syncthreads()は自動で無視されるので、何も起こらない
答えと解説を見る
正解:B. ほかのスレッドが永久に到着しないので、ブロックが止まったり、結果が不定になったりする
__syncthreads()はブロックのすべてのスレッドの到着を待つので、一部のスレッドしか通らない分岐の中に書くと、待っても来ないスレッドがいることになります。仕様では動作が定義されず、実際には止まってしまったり、たまたま動いても結果がおかしくなったりします。同期は分岐の外側、すべてのスレッドが必ず通る場所に書くのが原則です。
- A. ブロックの全員の到着を待つ命令です。
- B. 正しい。ブロックの全員が通る場所に書く必要があります。
- C. 無視されることはありません。