GPUプログラミング

CUDAで、ブロックとSM(ストリーミングマルチプロセッサ)の関係として正しいものはどれか。

  1. A1つのブロックのスレッドは、すべてのSMに分散して実行される
  2. BSMの数とブロックの数は、必ず同じでなければならない
  3. C各ブロックは1つのSMに割り当てられて最後までそこで実行され、1つのSMには複数のブロックが同時に載ることがある
答えと解説を見る

正解:C. 各ブロックは1つのSMに割り当てられて最後までそこで実行され、1つのSMには複数のブロックが同時に載ることがある

GPUは多数のSMを持ち、カーネルのブロックを空いているSMに順に割り当てます。1つのブロックは1つのSMで実行されるので、ブロックの中のスレッドはそのSMの共有メモリを使い、同期も取れます。ブロックの数をSMの数より十分に多くしておくと、GPUの規模が違っても全部のSMに仕事が行き渡り、終わったSMには次のブロックが割り当てられます。

  • A. ブロックは1つのSMの中で実行されます。
  • B. ブロックの数はSMの数よりずっと多くてかまいません。
  • C. 正しい。だからブロックの中では共有メモリが使えます。
この分野を解く 分野ページへ

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

  1. CUDAで、カーネルの途中で、ほかのすべてのブロックの計算が終わるのを待ってから次の段階に進みたい。一般的な方法はどれか。
  2. GPUで画素の値のヒストグラムを作るとき、全スレッドがグローバルメモリの256個のビンにatomicAddで直接足すと遅いことがある。改善の方法として正しいものはどれか。
  3. GPUで多数の値の総和を求めるとき、木の形のリダクション(隣どうしを足して半分にすることを繰り返す)を使う理由として正しいものはどれか。
  4. 1024個の値を木の形のリダクションで合計するとき、必要な段の数はいくつか。
  5. 単体のGPUを使うプログラムで、CPU側のメモリとGPU側のメモリについて一般的に正しいものはどれか。