インテル® C++ コンパイラー 19.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 オプションの否定形である -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 モードをオフにできます。
次のマクロを使用して、フラグを手動でセットすることができます。
機能 |
例 |
---|---|
FTZ を有効にする |
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON) |
DAZ を有効にする |
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON) |
これらのマクロのプロトタイプは、xmmintrin.h (FTZ) および pmmintrin.h (DAZ) にあります。