5

CUDAプログラミングガイドのwrt-use-fast-math最適化をざっと見ました。付録Cでは、除算を組み込みに変換する方法について言及していますが、乗算については言及していません。私がこの質問をする理由は、私のカーネルにはたくさんの乗算があるからです。NVCCが乗算と加算を融合しようとすることを認識しています(通常の「*」および「+」演算子が使用されている場合、および組み込み関数がFMAD演算にマージされることはありません)。しかし、私のコードが乗算が重い場合、SP組み込み関数のような四捨五入を__fmul_rn使用すると利点がありますか?

したがって、2つの質問があります。

  1. -use-fast-mathオプションは、「*」演算子を使用した乗算を__fmul_rnのようなSP本能に変換しますか?

  2. __fmul_rnを明示的に使用するために乗算を手動でコーディングすることでパフォーマンス上の利点がありますか?例またはいくつかの数字は私が理解するのに役立ちます。

4

1 に答える 1

3

「スタンドアロン」単精度乗算は、常にハードウェア命令(「組み込み関数」)にコンパイルされます。他のタイプの浮動小数点乗算命令はありません。nvccの-use_fast_mathオプションは、計算機能1.xターゲットに対して発行される浮動小数点乗算命令には影響しません。計算2.xおよび3.xターゲットでは、コンパイラーが互換モードになり、すべての単精度乗算命令がmul.ftz.f32(ゼロにフラッシュ)されます。

あなたが言及する浮動小数点の本質(__fmul_{rm,rn,rp,rz,ftz,sat})は、IEEEの丸め動作を明示的に制御するだけです。FermiまたはKeplerGPUのいずれでもスループットに違いはないと思います。

于 2012-07-16T17:07:15.390 に答える