GPUプログラミング

1つのワープの中で、条件分岐によってスレッドの半分がif側、残りの半分がelse側に分かれた(ワープダイバージェンス)。一般にどう実行されるか。

  1. A両方の側を同時に実行するので、速さは変わらない
  2. Belse側のスレッドは実行されずに捨てられる
  3. Cif側とelse側を順番に実行し、それぞれの間は該当しないスレッドが休むので、効率が下がる
答えと解説を見る

正解:C. if側とelse側を順番に実行し、それぞれの間は該当しないスレッドが休むので、効率が下がる

ワープの32本のスレッドは同じ命令を実行するので、分岐が分かれると、まずif側の命令をif側のスレッドだけを有効にして実行し、次にelse側を残りのスレッドで実行します。結果は正しいものの、それぞれの間は半分のスレッドが何もしないので、時間は両方の経路の合計になります。ワープの中で分岐がそろうように、データやスレッドの並べ方を工夫すると効率が上がります。

  • A. 1つのワープは同時に1つの命令しか実行しません。
  • B. どちらのスレッドも正しく実行されます。
  • C. 正しい。両方の経路の時間がかかります。
この分野を解く 分野ページへ

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

  1. 上の(1)と(2)は、どちらもスレッドの半分にA、残りにBを実行させる。ワープの効率の点で正しい説明はどれか(1ワープ32スレッドとする)。
  2. GPUのメモリ合体アクセス(コアレッシング)の説明として正しいものはどれか。
  3. 各スレッドの番号をiとして、上のように32要素おきに配列を読むと、a[i]を読む場合に比べて遅くなる。主な理由はどれか。
  4. 粒子の位置x、y、zを持つデータをGPUで処理するとき、メモリ合体アクセスの点で有利な並べ方はどれか。
  5. CUDAの共有メモリ(シェアードメモリ)の特徴として正しいものはどれか。