インテル(R) プロセッサーでは、浮動小数点計算の制御に、MXCSR レジスターの FTZ (Flush-to-Zero) と DAZ (denormals are zeros) フラグが使用されます。FTZ フラグと DAZ フラグが有効の場合、SIMD (Single Instruction, Multiple Data) 浮動小数点演算は高速になり、アプリケーションのパフォーマンスは向上します。
-ftz (Linux* および Mac OS* X) または /Qftz (Windows*) オプションを使用すると、アプリケーションが漸次アンダーフロー・モードの場合、デノーマル結果をゼロにフラッシュできます。このオプションでは、デノーマル値がアプリケーションの動作に影響を与えない場合は、アプリケーションのパフォーマンスが向上することがあります。
-ftz または /Qftz オプションは、FTZ/DAZ ハードウェア・フラグをセットあるいはリセットします。次の表では、FTZ/DAZ フラグのステータスに基づいて、どのようにコンパイラーがデノーマル値を処理するかを説明しています。
フラグ |
ON の場合 |
OFF の場合 |
サポートするシステム |
---|---|---|---|
FTZ |
浮動小数点演算のデノーマル結果はゼロにセットされる |
デノーマル結果は変更なし |
IA-64、インテル(R) 64 アーキテクチャー |
DAZ |
浮動小数点への入力として使用されるデノーマル値は、ゼロとして扱われる |
正規化されていない命令の入力は変更なし |
インテル(R) 64 アーキテクチャー |
FTZ および DAZ は、すべての IA-32 アーキテクチャーでサポートされていません。IA-64 アーキテクチャー・ベースのシステムでは、FTZ は常に動作しますが、IA-32 およびインテル(R) 64 アーキテクチャー・ベースのシステムでは SSE 命令のみ適用されます。そのため、アプリケーションが x87 命令を使ってデノーマル数を生成した場合は、FTZ は適用されません。
DAZ および FTZ フラグは IEEE 規格 754 に準拠していません。IEEE 規格に完全に準拠する必要がなく、アプリケーションのパフォーマンスが精度よりも重要な場合のみ、これらのフラグを有効にすることを検討してください。
オプション -ftz と /Qftz はパフォーマンス・オプションです。これらのオプションを設定しても、プログラム中のすべてのデノーマル数がゼロにフラッシュされるとは限りません。ランタイム時に生成されるデノーマル数をゼロにフラッシュするだけです。
IA-32 アーキテクチャー・ベースのシステムでは、-ftz または /Qftz が SSE を有効にするオプションとともに使用されると (-xW や /QxW など)、コンパイラーはメインルーチンにコードを挿入し、FTZ および DAZ をセットします。このようなオプションなしに -ftz または /Qftz を使用すると、コンパイラーは、ランタイム・プロセッサー・チェックに基づいて条件付きで FTZ/DAZ をセットするコードを挿入します。FTZ/DAZ をセットするコードを挿入しないようにするには、-no-ftz (Linux および Mac OS X) または /Qftz- (Windows) を指定します。
-ftz または /Qftz オプションは、メインプログラムがコンパイルされるときのみ影響を受けます。このオプションは、プロセスに FTZ/DAZ モードをセットします。初期スレッドおよびそのプロセスによってその後に作成されるあらゆるスレッドは、FTZ/DAZ モードで動作します。
IA-64 アーキテクチャー・ベースのシステムでは、最適化オプション O3 は -ftz および /Qftz をセットします。最適化オプション O2 は、-no-ftz (Linux) および /Qftz- (Windows) をセットします。IA-32 およびインテル(R) 64 アーキテクチャー・ベースのシステムでは、O0 以外の O レベル最適化オプションは -ftz と /Qftz をセットします。
このオプションがプログラムの数値動作で好ましくない結果を出力した場合、コマンドラインで -no-ftz または /Qftz- を使用することで、O3 最適化の利点を活用したままで、FTZ/DAZ モードをオフにできます。
インテル以外のいくつかのプロセッサーでは、次のインテル(R) Fortran 組み込み関数を使用して、フラグを手動でセットすることができます。
例 |
---|
RESULT = FOR_SET_FPE (FOR_M_ABRUPT_UND) |
『Intel(R) 64 and IA-32 Architectures Software Developer's Manual, Volume 1: Basic Architecture』(英語)