プロセッサー固有のランタイムチェック (IA-32 システム)

プロセッサー固有の最適化はランタイム時に効果を発揮します。IA-32 システムでは、コンパイラーはメインルーチン中に記述されているランタイムチェックを実行するコードセグメントを挿入して、プロセッサー固有の最適化を強化します。

対応プロセッサーのチェック

実行エラーを防ぐために、コンパイラーはメインルーチン中に正しいプロセッサーが使用されていることをチェックするコードを挿入します。

-xN-xB-xP のいずれか (Linux*)、あるいは /QxK/QxW/QxN/QxB/QxP オプションのいずれか (Windows*) を使用してコンパイルされたプログラムは、関連付けられたプロセッサーまたはこれらと互換性のあるインテル(R) プロセッサー上で実行されているかどうか、ランタイム時にチェックされます。プログラムがこれらのいずれかのプロセッサー上で実行されていない場合、プログラムはエラーを出力して終了します。

Mac OS* システムでは、-x および -ax オプションで有効な値は P のみです。

次の例では、ストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル(R) Pentium(R) 4 プロセッサーのランタイムチェック用にプログラムを最適化する方法を示します。

プラットフォーム

Linux

icpc -xP prog.cpp

Windows

icl /QxP prog.cpp

このプログラムがストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル Pentium 4 プロセッサーと互換性のないプロセッサー上で実行されると、プログラムは終了します。

プログラムを複数の IA-32 プロセッサー上で実行する場合は、-x (Linux) または /Qx (Windows) オプションではなく、プロセッサー固有のコードと汎用コードを生成する -ax (Linux) または /Qax (Windows) オプションを使用してください。

FTZ と DAZ フラグの設定

コンパイラーの以前のバージョンでは、IA-32 プロセッサーの FTZ (Flush-to-Zero) と DAZ (Denormals-are-Zero) フラグはデフォルトでオフになっていました。これらのフラグをオンにすると、IEEE 準拠ではなくなりますが、最新の IA-32 プロセッサー上で実行される漸次アンダーフロー・モードでデノーマルな浮動小数点値が使用され、プログラムのパフォーマンスが大幅に向上します。

Mac OS: -ftz オプションはサポートされていません。

デフォルトでは、-O3 (Linux)、/O3 (Windows) オプションは FTZ モードを有効にします。対照的に、-O2 (Linux)、/O2 (Windows) オプションは FTZ モードを無効にします。代わりに、-no-ftz (Linux)、/Qftz- (Windows) を使用して、デノーマル結果をゼロにフラッシュしないようにすることもできます。

SSE 命令が使用されると、-no-ftz (Linux) および /Qftz- (Windows) は無視されます。メインプログラムに MXCSR の 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) にあります。