GPUプログラミング

要素数1000の配列を、1ブロック256スレッドで1スレッド1要素ずつ処理したい。起動するブロックの数として正しいものはどれか。

  1. A3
  2. B4
  3. C1000
答えと解説を見る

正解:B. 4

1000÷256≒3.9なので、切り捨てて3ブロックにすると256×3=768要素までしか処理できず、残りが漏れます。切り上げて4ブロック(1024スレッド)を起動し、余った24スレッドは何もしないようにします。一般に「(n + 256 - 1) / 256」のように計算して切り上げます。余ったスレッドが配列の外を読み書きしないよう、カーネルの中で番号を確かめる必要があります。

  • A. 3ブロックでは768要素しか処理できません。
  • B. 正しい。1000÷256を切り上げると4です。
  • C. ブロックの数とスレッドの数を取り違えています。
この分野を解く 分野ページへ

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

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