このセクションで説明されているオプションはすべて、IA-32 および Itanium® アーキテクチャの浮動小数点 (FP) 演算のさまざまな精度での最適化を提供します。
-mp1 (IA-32 のみ) および -mp オプションは、浮動小数点精度を向上しますがアプリケーションのパフォーマンスに影響します。 これらのオプションについての詳細は、「浮動小数点演算の精度の向上と制限」を参照してください。
FP オプションは、浮動小数点演算のさまざまな精度の最適化を提供します。これらの最適化を無効にするには、-O0 オプションを指定します。
-mp オプションで、最適化を制限し、宣言された精度を維持します。例えば、インテル® Fortran コンパイラでは、分母の逆数によって浮動小数点数の除算計算を乗算に変えられます。ただし、これによって、浮動小数点数の除算計算の結果が多少変わることがあります。-mp スイッチを使用すると、実行速度が多少遅くなる場合があります。詳細は、「浮動小数点演算の精度の向上と制限」を参照してください。
-mp1 オプションは、-mp オプションよりもパフォーマンスへの影響が少なく、浮動小数点精度を宣言された精度に近づけるために制限します。このオプションでは、超越関数のオペランドの範囲外チェックを実現し、浮動小数点演算の比較精度を向上させます。
-ftz[-] オプションは、アプリケーションが漸次アンダーフロー・モードの場合に、デノーマル結果をゼロにフラッシュします。-ftz でデノーマル値をフラッシュすると、アプリケーションのパフォーマンスが向上する場合があります。
デフォルトの状態では、-ftz- はオフです。デフォルトでは、コンパイラは結果を漸次アンダーフローにします。デフォルトの -O2 オプションでは、-ftz[-] がオフになっています。
Itanium ベース・システムの場合のみ、-O3 オプションを使用すると -ftz がオンになります。
-ftz オプションにより、プログラムの数値動作で好ましくない結果が出力された場合、次のようにコマンドラインで -ftz- を使用して FTZ (ゼロ・フラッシュ) モードをオフに設定できます。これにより、-O3 最適化の利点をそのまま活用できます。
ifort -O3 -ftz- myprog.f
使用方法:
このオプションは、デノーマル値がアプリケーション動作に影響を与えない場合に使用します。
FTZ モードをオンにするには、-ftz[-] オプションを main プログラムが含まれているソースに対してのみ使用する必要があります。初期スレッドおよびそのプロセスによってその後に作成されるあらゆるスレッドは、FTZ モードで動作します。
-ftz[-] オプションは浮動小数点アンダーフローの結果に対して次のような影響を与えます:
ゼロへの漸次アンダーフロー (gradual underflow) における -ftz- の結果: 浮動小数点アンダーフローの結果は正規化されていない数またはゼロになります。
ゼロへの突発アンダーフロー (abrupt underflow) における -ftz の結果: 浮動小数点アンダーフローの結果はゼロに設定され、プログラムはそのまま実行されます。-ftz は演算でゼロとして扱われる、正規化されていない値も生成するため、無効な浮動小数点例外は発生しません。Itanium ベース・システムの場合、-O3 オプションを使用すると突発アンダーフロー (abrupt underflow) がゼロに設定されます (-ftz がオン)。より低い最適化レベルでは、ゼロへの漸次アンダーフロー(gradual underflow) が Itanium ベース・システムのデフォルトになります。
IA-32 システムでは、-ftz で突発アンダーフロー (abrupt underflow) を設定すると SSE/SSE2 命令のパフォーマンスが向上することがありますが、x87 命令のパフォーマンスや数値的動作には影響を与えません。したがって -ftz は、比較的新しい IA-32 インテル・プロセッサの命令を有効にする -x または -ax オプションを選択しない限り効果がありません。
Itanium ベース・プロセッサでは、ゼロへの漸次アンダーフロー (gradual underflow) が発生するとパフォーマンスが低下します。高い最適化レベルを使用してデフォルトを突発アンダーフロー (abrupt underflow) にするか、明示的に、-ftz を設定することで、パフォーマンスを改善することができます。
-ftz を使用すると、特に単精度のコードの場合、実際にアンダーフローが発生しなくても、Itanium 2 プロセッサのパフォーマンスが向上することがあります。
-fpen オプションを使用して、例外の処理を制御します。 -fpen オプションは、n の値に応じて浮動小数点例外を制御します。
浮動小数点例外には次のような種類があります。
浮動小数点オーバーフロー: 演算の結果が浮動小数点データ型よりも大きすぎた場合、 例外値 (適切な正または負の無限大) になります。例えば、1E30 * 1E30 は単精度の浮動小数点値をオーバーフローし、結果は正の無限大に、-1E30 * 1E30 の結果は負の無限大になります。
ゼロによる浮動小数点除算: 演算が 0.0 / 0.0 の場合、結果は、演算が成功しなかったことを意味する例外値 NaN (Not a Number、非数) になります。分子が 0.0 ではない場合、結果は符号付きの無限大になります。
浮動小数点アンダーフロー: 演算の結果が浮動小数点データ型よりも小さすぎた場合。各浮動小数点型 (32 ビット、64 ビット、および 128 ビット) には、精度が少し失われることを表す非常に小さな正規化されていない範囲があります。例えば、正規化されている単精度浮動小数点値の下限は約 1E-38 で、正規化されていない単精度浮動小数点値の下限は約 1E-45 です。1E-30 / 1E10 は正規化されている範囲ではアンダーフローになりますが、正規化されていない範囲ではアンダーフローにならないため、結果は正規化されていない例外値 1E-40 になります。1E-30 / 1E30 はすべての範囲でアンダーフローになるため、結果はゼロになります。これは、0 (ゼロ) への漸次アンダーフロー と呼ばれます。
無効な浮動小数点: 演算の入力として例外値 (符号付き無限大、NaN、正規化されていない数) が使用されると、結果も NaN になります。
-fpen オプションを使用すると、メイン・プログラムのランタイム時に処理される浮動小数点例外の結果をある程度制御することができます。
-fpe0 は、浮動小数点例外を次のように制限します:
浮動小数点オーバーフロー、ゼロによる浮動小数点除算、および無効な浮動小数点が発生した場合、プログラムはエラー・メッセージを表示して終了します。
浮動小数点アンダーフローが発生した場合、結果はゼロに設定され、プログラムはそのまま実行されます。これは、0 (ゼロ) への突発アンダーフローと呼ばれます。
-fpe1 は、浮動小数点アンダーフローのみを制限します:
浮動小数点オーバーフロー、ゼロによる浮動小数点除算、および無効な浮動小数点が発生した場合、結果は例外値 (NaN および符号付き無限大) になり、プログラムはそのまま実行されます。
浮動小数点アンダーフローが発生した場合、結果はゼロに設定され、プログラムはそのまま実行されます。
デフォルトでは、IA-32 アーキテクチャと Itanium アーキテクチャの両方で -fpe3 が使用されます。このオプションは、浮動小数点例外動作を制限しません。
浮動小数点オーバーフロー、ゼロによる浮動小数点除算、および無効な浮動小数点が発生した場合、結果は例外値 (NaN および符号付き無限大) になり、プログラムはそのまま実行されます。
浮動小数点アンダーフローは漸次アンダーフローで、結果はゼロになるまで正規化されていない値になります。
-fpen オプションは、Fortran メイン・プログラムにのみ影響します。Fortran メイン・プログラムによって設定された浮動小数点例外動作は、全プログラムの実行に影響します。メイン・プログラムが Fortran ではない場合、ユーザは Fortran 組込み関数 FOR_SET_FPE を使用して浮動小数点例外動作を設定することができます。
プログラムに含まれる各ルーチンを別々にコンパイルする際は、-fpen オプションで同じ n 値を使用してください。
詳細については、『Linux* 版インテル® Fortran コンパイラ・ユーザーズ・ガイド Vol I』の「浮動小数点例外の制御」を参照してください。