FTZ フラグと DAZ フラグの設定

インテル(R) プロセッサーでは、浮動小数点計算の制御に、MXCSR レジスターの FTZ (Flush-to-Zero) と DAZ (denormals are zeros) フラグが使用されます。FTZ と DAZ フラグが有効の場合、SIMD (Single Instruction, Multiple Data) 浮動小数点演算は高速になり、アプリケーションのパフォーマンスは向上します。

-ftz (Linux* および Mac OS*) または /Qftz (Windows*) オプションを使用すると、アプリケーションが漸次アンダーフロー・モードの場合、デノーマル結果をゼロにフラッシュできます。このオプションでは、デノーマル値がアプリケーションの動作に影響を与えない場合は、アプリケーションのパフォーマンスが向上することがあります。

-ftz または /Qftz オプションは、FTZ/DAZ ハードウェア・フラグをセットあるいはリセットします。次の表では、FTZ/DAZ フラグのステータスに基づいて、どのようにコンパイラーがデノーマル値を処理するかを説明しています。

フラグ

ON の場合

OFF の場合

アーキテクチャー

FTZ

浮動小数点演算のデノーマル結果はゼロにセットされる

デノーマル結果は変更なし

IA-64

インテル(R) 64

DAZ

浮動小数点への入力として使用されるデノーマル値は、ゼロとして扱われる

正規化されていない命令の入力は変更なし

インテル 64

オプション -ftz/Qftz はパフォーマンス・オプションです。これらのオプションを設定しても、プログラム中のすべてのデノーマル数がゼロにフラッシュされるとは限りません。ランタイム時に生成されるデノーマル数をゼロにフラッシュするだけです。

IA-32 アーキテクチャー・ベースのシステムでは、-ftz または /Qftz が SSE を有効にするオプションとともに使用されると (xWQxW など)、コンパイラーはメインルーチンにコードを挿入し、FTZ および DAZ をセットします。このようなオプションなしに -ftz または /Qftz を使用すると、コンパイラーは、ランタイム・プロセッサー・チェックに基づいて条件付きで FTZ/DAZ をセットするコードを挿入します。FTZ/DAZ をセットするコードを挿入しないようにするには、-no-ftz (Linux および Mac OS) または /Qftz- (Windows) を指定します。

-ftz または /Qftz オプションは、メインプログラムがコンパイルされるときのみ影響を受けます。このオプションは、プロセスに FTZ/DAZ モードをセットします。初期スレッドおよびそのプロセスによってその後に作成されるあらゆるスレッドは、FTZ/DAZ モードで動作します。

IA-64 アーキテクチャー・ベースのシステムでは、最適化オプション O3 は -ftz および /Qftz をセットします。最適化オプション O2 は、-no-ftz (Linux) および /Qftz- (Windows) をセットします。IA-32 およびインテル 64 アーキテクチャー・ベースのシステムでは、O0 以外の O レベル最適化オプションは -ftz/Qftz をセットします。

このオプションがプログラムの数値動作で好ましくない結果を出力した場合、コマンドラインで -no-ftz または /Qftz- を使用することで、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) にあります。

関連情報