読者です 読者をやめる 読者になる 読者になる

x87 FPU で厳密な単精度演算を行うコスト (2)

DirectX

そうそう書き忘れてましたが, add や sub に比べて一部の multi や div が数十倍速くなっているのは,実際にはコンパイル時に浮動小数点数のループ計算が行われていて,その結果が直接埋め込まれるからです.実行時に計算しているわけじゃないので速度比較では注意しないといけませんね.

/fp:strictの結果

typeadd(ms)sub(ms)multi(ms)div(ms)計算結果
double962.3962.821.720.40
flaot947.1943.7998.44210.8-1.67772e+007
double(template)938.8947.120.117.40
float (template)945.2945.5996.94251.5-1.67772e+007
double(template specialization)1021.91021.725.123.50
float(template specialization)1078.41063.71132.94979.7-1.67772e+007

floatの乗算・除算が目も当てられない状態になってしまいました。

多分実際に実行時に計算を行うとその,「目も当てられない状態」は結構真実に近いんじゃないかと.
詳しくはこのあたりを参照のこと.

コンパイル時計算の回避方法については,ちょっと知識に怪しいところがあったのでまた後ほど.



(追記)

fenv_access を ON にして /fp:precise を使用すると、浮動小数点式のコンパイル時間の評価などの一部の最適化が無効になります。

Using /fp:precise with fenv_access ON disables some optimizations such as compile-time evaluations of floating point expressions.

浮動小数点プラグマの使い方が無効です: fenv_access プラグマは precise モードでのみ操作します

とあるので,precise モードで fenv_access ON とすると,コンパイル時評価“も”無効になるようですね.