GPUプログラミング

GPUで2つの大きな配列の要素ごとの足し算(c[i] = a[i] + b[i])を行うとき、性能を主に決めるものはどれか。

  1. Aメモリの帯域(1要素あたり12バイトを読み書きするのに対し、計算は足し算1回だけなので)
  2. B演算器の数
  3. Cクロックの周波数だけ
答えと解説を見る

正解:A. メモリの帯域(1要素あたり12バイトを読み書きするのに対し、計算は足し算1回だけなので)

floatの足し算1回につき、aとbを4バイトずつ読み、cに4バイト書くので、12バイトの転送で1回の計算です。GPUは1秒間に何十兆回も計算できますが、メモリの帯域は数TB/sほどなので、この処理は帯域で上限が決まります。こうした処理を速くするには、データの読み書きの回数を減らす、複数の処理を融合して途中の結果をメモリに書かない、などが有効です。

  • A. 正しい。演算強度が低い、メモリ律速の処理です。
  • B. 演算器は待っている時間がほとんどです。
  • C. 周波数を上げても、メモリが追いつきません。
この分野を解く 分野ページへ

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

  1. 家庭用のゲーム向けGPUの多くで、倍精度(FP64)の計算性能が単精度(FP32)よりずっと低い(数十分の一など)理由として最も適切なものはどれか。
  2. 最近のGPUに搭載されているテンソルコア(行列演算ユニット)の特徴として正しいものはどれか。
  3. GPUの混合精度の計算で、掛け算をFP16などの低い精度で行い、足し合わせ(累積)をFP32で行うことが多い理由として正しいものはどれか。
  4. GPUで同じデータの浮動小数点数の総和を求めたところ、実行するたびに結果の最後の桁がわずかに違った。最も考えられる原因はどれか。
  5. CUDAで1ブロックあたりのスレッドの数を決めるときの一般的な目安として正しいものはどれか。