インテル® Fortran コンパイラー 16.0 ユーザー・リファレンス・ガイド
インテル® プロセッサーでは、浮動小数点計算の制御に、MXCSR レジスターの FTZ (Flush-to-Zero) と DAZ (denormals are zeros) フラグが使用されます。インテル® ストリーミング SIMD 拡張命令 (インテル® SSE) とインテル® アドバンスト・ベクトル・エクステンション (インテル® AVX) (スカラーおよびベクトル命令を含む) は、FTZ および DAZ フラグをそれぞれ有効にすることにより、その恩恵が得られます。これらのインテル® SSE 命令およびインテル® AVX を使用する浮動小数点演算は、FTZ/DAZ フラグが有効な場合に高速になり、アプリケーションのパフォーマンスが向上します。
[Q]ftz オプションを使用すると、アプリケーションが漸次アンダーフロー・モードの場合、デノーマル結果をゼロにフラッシュできます。このオプションでは、デノーマル値がアプリケーションの動作に影響を与えない場合は、アプリケーションのパフォーマンスが向上することがあります。[Q]ftz オプションは、メインプログラムに使用されると、FTZ/DAZ ハードウェア・フラグをセットします。[Q]ftz オプションの否定形はフラグをそのままにします。
次の表では、FTZ/DAZ フラグのステータスに基づいて、どのようにコンパイラーがデノーマル値を処理するかを説明しています。
フラグ |
ON の場合 |
OFF の場合 |
サポートするシステム |
---|---|---|---|
FTZ (flush-to-zero) |
浮動小数点演算のデノーマル結果はゼロにセットされる |
デノーマル結果は変更なし |
インテル® 64 アーキテクチャー、およびいくつかの IA-32 アーキテクチャー |
DAZ (denormals-are-zero) |
浮動小数点への入力として使用されるデノーマル値は、ゼロとして扱われる |
正規化されていない命令の入力は変更なし |
インテル® 64 アーキテクチャー、およびいくつかの IA-32 アーキテクチャー |
DAZ および FTZ フラグは IEEE 規格 754 に準拠していません。IEEE 規格に完全に準拠する必要がない場合のみ、これらのフラグを有効にすることを検討してください。
[Q]ftz はパフォーマンス・オプションです。これらのオプションを設定しても、プログラム中のすべてのデノーマル数がゼロにフラッシュされるとは限りません。ランタイム時に生成されるデノーマル数をゼロにフラッシュするだけです。
インテル® 64 および IA-32 システムでは、コンパイラーはデフォルトでメインルーチンにコードを挿入し、FTZ および DAZ をセットします。[Q]ftz オプションを -msse2 オプションあるいは /arch:sse2 オプションとともに IA-32 システムで使用すると、コンパイラーは、ランタイム・プロセッサー・チェックに基づいて条件付きで FTZ/DAZ をセットするコードを挿入します。FTZ/DAZ をセットするコードを挿入しないようにするには、[Q]ftz の否定形を指定します。
IA-32 アーキテクチャー・ベースのシステムでは、[Q]ftz がインテル® SSE を有効にするオプションとともに使用されると (-msse2 や /arch:sse2 など)、コンパイラーはメインルーチンにコードを挿入し、FTZ および DAZ をセットします。このようなオプションなしに [Q]ftz を使用すると、コンパイラーは、ランタイム・プロセッサー・チェックに基づいて条件付きで FTZ/DAZ をセットするコードを挿入します。FTZ/DAZ をセットするコードを挿入しないようにするには、[Q]ftz の否定形を指定します。
[Q]ftz オプションは、メインプログラムがコンパイルされるときのみ影響を受けます。このオプションは、プロセスに FTZ/DAZ モードをセットします。初期スレッドおよびそのプロセスによってその後に作成されるあらゆるスレッドは、FTZ/DAZ モードで動作します。
IA-32 およびインテル® 64 アーキテクチャー・ベースのシステムでは、O0 以外の O レベル最適化オプションは [Q]ftz をセットします。
このオプションがプログラムの数値動作で好ましくない結果を出力した場合、コマンドラインで [Q]ftz の否定形を使用することで、O3 最適化の利点を活用したままで、FTZ/DAZ モードをオフにできます。
次のインテル® Fortran 組込み関数を使用して、フラグを手動でセットすることができます。
例 |
---|
RESULT = FOR_SET_FPE (FOR_M_ABRUPT_UND) |