GPUプログラミング

GPUで同じデータの浮動小数点数の総和を求めたところ、実行するたびに結果の最後の桁がわずかに違った。最も考えられる原因はどれか。

  1. AGPUの演算器が壊れているから
  2. BデータがGPUの中で毎回書き換わっているから
  3. Cアトミック演算などで足す順番が実行ごとに変わり、浮動小数点の足し算は順番によって丸めの結果が変わるから
答えと解説を見る

正解:C. アトミック演算などで足す順番が実行ごとに変わり、浮動小数点の足し算は順番によって丸めの結果が変わるから

浮動小数点の足し算は毎回丸めが入るので、(a+b)+cとa+(b+c)の結果がわずかに違うことがあります。並列の総和では、どのスレッドの値がどの順番で足されるかが、スレッドの実行の順番やアトミック演算の到着の順番で変わります。その結果、最後の桁が実行ごとに変わります。結果を毎回同じにしたい場合は、足す順番を固定したリダクションを使います。

  • A. 壊れていなくても起こる、正常な現象です。
  • B. データは変わっていません。
  • C. 正しい。浮動小数点の足し算では結合法則が成り立ちません。
この分野を解く 分野ページへ

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

  1. CUDAで1ブロックあたりのスレッドの数を決めるときの一般的な目安として正しいものはどれか。
  2. 上のようなループ(グリッドストライドループ)でカーネルを書く利点として正しいものはどれか。
  3. CUDAの定数メモリ(コンスタントメモリ)が特に速く働くのはどのようなアクセスのときか。
  4. GPUのキャッシュについて、CPUと比べた一般的な特徴として正しいものはどれか。
  5. NVIDIA以外のGPUでも使える、GPUなどの並列計算のためのプログラミングの仕組みの例として正しいものはどれか。