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