GPUプログラミング

非常に小さなカーネルを何千回も続けて起動するプログラムが遅いとき、改善の方法として最も適切なものはどれか。

  1. A複数の小さなカーネルを1つにまとめる(融合する)などして、起動の回数を減らす
  2. Bカーネルの起動の間に待ち時間を入れる
  3. Cブロックあたりのスレッド数を1にする
答えと解説を見る

正解:A. 複数の小さなカーネルを1つにまとめる(融合する)などして、起動の回数を減らす

カーネルの起動には、CPU側の処理とGPUの準備で数マイクロ秒ほどの固定の時間がかかります。カーネルの中身がそれより短いと、起動の手間ばかりが目立ちます。複数の処理を1つのカーネルにまとめると、起動の回数が減るうえ、途中の結果をメモリに書いて読み直す手間も省けます。起動の並びをまとめて記録して一度に送る仕組み(CUDA Graphsなど)も使われます。

  • A. 正しい。起動ごとの固定の手間を減らします。
  • B. 待ち時間を入れると、さらに遅くなります。
  • C. GPUの並列性を捨てることになります。
この分野を解く 分野ページへ

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

  1. CUDAのユニファイドメモリ(統合メモリ)の説明として正しいものはどれか。
  2. GPUで2つの大きな配列の要素ごとの足し算(c[i] = a[i] + b[i])を行うとき、性能を主に決めるものはどれか。
  3. 家庭用のゲーム向けGPUの多くで、倍精度(FP64)の計算性能が単精度(FP32)よりずっと低い(数十分の一など)理由として最も適切なものはどれか。
  4. 最近のGPUに搭載されているテンソルコア(行列演算ユニット)の特徴として正しいものはどれか。
  5. GPUの混合精度の計算で、掛け算をFP16などの低い精度で行い、足し合わせ(累積)をFP32で行うことが多い理由として正しいものはどれか。