GPUプログラミング

CUDAのカーネルで上の式により各スレッドの番号iを求める。blockIdx.x=2、blockDim.x=256、threadIdx.x=5のスレッドのiはいくらか。

int i = blockIdx.x * blockDim.x + threadIdx.x;
  1. A517
  2. B263
  3. C2565
答えと解説を見る

正解:A. 517

blockIdx.xはグリッドの中でのブロックの番号、blockDim.xはブロックあたりのスレッドの数、threadIdx.xはブロックの中でのスレッドの番号です。ブロック0が0〜255、ブロック1が256〜511を担当するので、ブロック2の5番目のスレッドは2×256+5=517になります。この式で、すべてのスレッドに重ならない通し番号を付け、担当する配列の要素を決めます。

  • A. 正しい。2×256+5=517です。
  • B. blockIdx.xを掛けずに足しています。
  • C. 数字を並べただけで、計算になっていません。
この分野を解く 分野ページへ

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

  1. 要素数1000の配列を、1ブロック256スレッドで1スレッド1要素ずつ処理したい。起動するブロックの数として正しいものはどれか。
  2. 上のCUDAのカーネルで「if (i < n)」を入れている理由として正しいものはどれか。
  3. NVIDIAのGPUで、32本のスレッドを1つの束にして、同じ命令を一斉に実行する単位を何と呼ぶか。
  4. GPUのSIMT(単一命令・複数スレッド)の方式と、CPUのSIMD命令の違いとして正しいものはどれか。
  5. 1つのワープの中で、条件分岐によってスレッドの半分がif側、残りの半分がelse側に分かれた(ワープダイバージェンス)。一般にどう実行されるか。