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

インテル® プロセッサーでは、浮動小数点計算の制御に、MXCSR レジスターの FTZ (Flush-to-Zero) と DAZ (denormals are zeros) フラグが使用されます。インテル® ストリーミング SIMD (Single Instruction Multiple Data) 拡張命令 (インテル® SSE) およびインテル® SSE 2 命令 (スカラーおよびベクトル命令を含む) は、FTZ および DAZ フラグをそれぞれ有効にすることにより、その恩恵が得られます。これらのインテル® SSE 命令を使用する浮動小数点演算は、 FTZ/DAZ フラグが有効な場合に高速になり、アプリケーションのパフォーマンスが向上します。

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

次の表では、FTZ/DAZ フラグのステータスに基づいて、どのようにコンパイラーがデノーマル値を処理するかを説明しています。

フラグ

ON の場合

OFF の場合

サポートするシステム

FTZ (flush-to-zero)

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

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

IA-64、インテル® 64 アーキテクチャー、およびいくつかの IA-32 アーキテクチャー

DAZ (denormals-are-zero)

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

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

インテル® 64 アーキテクチャー、およびいくつかの IA-32 アーキテクチャー

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

インテル® 64 および IA-32 システムでは、コンパイラーはデフォルトでメインルーチンにコードを挿入し、FTZ および DAZ をセットします。 -ftz または /Qftz オプションを –msse2 あるいは /arch:sse2 オプションとともに IA-32 システムで使用すると、コンパイラーは、ランタイム・プロセッサー・チェックに基づいて条件付きで FTZ/DAZ をセットするコードを挿入します。FTZ/DAZ フラグをセットするコードを挿入しないようにするには、-no-ftz (Linux および Mac OS X) または /Qftz- (Windows) を指定します。

IA-32 アーキテクチャー・ベースのシステムでは、-ftz または /Qftz がインテル® SSE を有効にするオプションとともに使用されると (-msse2/arch:sse2 など)、コンパイラーはメインルーチンにコードを挿入し、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 およびインテル® 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) にあります。

関連情報