浮動小数点演算の精度の制限
-mpオプションは、宣言された精度を維持しながら、浮動小数点演算を ANSI および IEEE
標準にできるだけ準拠するために、最適化を制限します。
このオプションは、ほとんどのプログラムのパフォーマンスに不利に働きます。目的のアプリケーションにこのオプションが必要かどうかよくわからない場合は、このオプションを指定した場合と指定しない場合で実際にプログラムをコンパイルし、実行して、パフォーマンスと精度に対する効果を評価してみてください。
このオプションを指定すると、プログラムのコンパイルに次のような影響が出ます。
- 浮動小数点型として宣言されたユーザ変数はレジスタに割り当てられません。
- 浮動小数点演算の比較は、NaN (非数)の動作以外はIEEE 754に準拠します。
- 演算は、コード内で指定したとおりに実行します。例えば、除算が「逆数の乗算」に変更されることはありません。
- コンパイラは関連付けを変更せずに、指定した順序で浮動小数点演算を実行します。
- コンパイラは浮動小数点値に関する定数の畳込みによる最適化を行いません。定数の畳込みとは、1を掛けたり、1で割ったり、0の足し引きをしたりといった計算を省くことです。定数の畳込みを実行しないので、例えば、0.0の足し算についても記述したとおりに実行します。また、コンパイル時の浮動小数点演算も実行しません。
これは、浮動小数点例外についてもその状態を変えないようにするためです。
- IA-32 システムでは、スピルされる式は、64ビット(倍精度)ではなく、必ず80ビット(拡張精度)としてスピルされます。浮動小数点演算は、IEEE
754 に準拠します。-O0 を指定しない場合は、精度の追加ビットは必ずしも変数が再利用する前に丸められるわけではありません。
- -xK、-xW、-axK、-axWのうちいずれかのオプションによりベクトル化を有効にしても、リダクション・ループ(ドット積を計算するループ)と、精度の種類がいくつか混在しているループは、ベクトル化されません。