プロセッサー固有の最適化はランタイム時に効果を発揮します。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) オプションを使用してください。
コンパイラーの以前のバージョンでは、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 ビットをクリアするコードを記述することで、漸次アンダーフローを有効にすることができます。
コンパイラーは、プログラムがこれらのインテル・プロセッサーのいずれかで実行されていることを確認するため、プロセッサーのランタイムチェックを実行するコードをプログラム中に挿入します。
インテル Pentium III プロセッサー上でプログラムを実行すると、FTZ フラグは有効になりますが、DAZ フラグは有効になりません。
インテル Pentium M プロセッサーまたはストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル Pentium 4 プロセッサー上でプログラムを実行すると、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) にあります。