-mp および -mp1 オプションは、それぞれ浮動小数点精度を維持および制限しますがアプリケーションのパフォーマンスに影響します。-mp1 オプションは、-mp オプションよりもパフォーマンスに及ぼす影響は少ないです。-mp1 では、超越関数のオペランドの範囲外チェックを実現し、浮動小数点演算の比較精度を向上させます。IA-32 システムの場合、-mp オプションは -mp1 を含意し、-mp1 オプションは -fp_port を含意します。 -mp を使用するとパフォーマンスが最も低下し、-fp_port を使用するとパフォーマンス低下を最小限に抑えられます。
-mp オプションを指定すると、精度は宣言された水準が保たれます。また、浮動小数点演算の処理は、ANSI および IEEE* 標準にほぼ準拠する結果となります。このオプションを使用すると、メモリへの頻繁な保存や、または一部のデータのレジスタ割り当て失敗が発生します。インテル® アーキテクチャは、 通常、浮動小数点結果をレジスタに維持します。これらのレジスタは、80 ビット長で、倍精度の数よりも大きな精度を保ちます。結果をメモリに保存する必要がある場合は、丸めが起こります。これで、「予測される」精度の結果を得ることができますが、速度が遅くなります。 -pc{32|64|80} オプション (IA-32 のみ) は、さまざまなプロセッサの IEEE フラグに合わせて、浮動小数点の精度および丸めを制御するのに使用されます。
ほとんどのプログラムでは、-mp オプションを指定するとパフォーマンスの低下につながります。目的のアプリケーションにこのオプションが必要かどうかよくわからない場合は、このオプションを指定した場合と指定しない場合で実際にプログラムをコンパイルし、実行して、パフォーマンスと精度に対する効果を評価してみてください。
このオプションを指定すると、プログラムのコンパイルに次の影響が生じます:
IA-32 システム上で、浮動小数点型として宣言された浮動小数点ユーザ変数は、レジスタに割り当てられません。
Itanium® ベース・システムでは、浮動小数点ユーザ変数は、レジスタに割り当てられることがあります。式は、ソース・オペランドの精度を使用して評価されます。コンパイラは、積和/積差演算を 1 つの演算命令で実行する浮動小数点積和 (FMA) 命令を使用しません。これは、-IPF_fma オプションを使用して有効にできます。コンパイラは、コンピュータの浮動小数点演算の状態に影響を及ぼすような浮動小数点演算のスペキュレーションを行いません。詳細については、「Itanium® ベース・システムの浮動小数点演算の精度」を参照してください。
浮動小数点演算比較は、IEEE 754 に準拠します。
演算はコードで指定したとおりに実行されます。例えば、除算が逆数の乗算に変換はされません。
コンパイラは関連付けを変更せずに、指定された順序で浮動小数点演算を実行します。
コンパイラは浮動小数点値に関する定数保持による最適化を行いません。定数保持の最適化では、1 による乗算、1 による除算、0 の加算、あるいは 0 の減算も除外されます。例えば、ある数値に 0.0 を加算するコードはそのとおりに実行します。また、コンパイル時の浮動小数点演算も実行しません。これは、浮動小数点例外についてもその状態を変えないようにするためです。
IA-32 システムでは、式がスピルする場合、64 ビット (DOUBLE PRECISION) ではなく、80 ビット (extended precision) としてスピルされます。浮動小数点演算は、IEEE 754 に準拠します。REAL 型および DOUBLE PRECISION 型への代入を行うと、その精度は、80 ビット (extended) から 32 ビット (REAL) か 64 ビット (DOUBLE PRECISION) に丸められます。-O0 を指定しなければ、精度が丸められずに変数が再使用される場合もあります。
-x{K|W|N|B|P} オプションによってベクトル化が有効になっている場合でも、コンパイラはリダクション・ループ (ドット積を計算するループ) および精度型が混在しているループはベクトル化しません。同様に、コンパイラは特定のループ変換を有効にしません。例えば、コンパイラは、部分和またはループ交換を実行するためにリダクション・ループを変換しません。