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

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

-xN、-xB、または -xP によるサポートされたプロセッサのチェック

実行エラーを防ぐために、コンパイラはプログラム中に正しいプロセッサが使用されていることをチェックするコードを挿入します。 -xN-xB、または -xP オプションを使用してコンパイルされたプログラムは、インテル® Pentium® 4 プロセッサ、インテル® Pentium® M プロセッサ、ストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル Pentium 4 プロセッサ、またはこれらと互換性のあるインテル® プロセッサ上で実行されているかどうか、ランタイム時にチェックされます。プログラムがこれらのいずれかのプロセッサ上で実行されていない場合、プログラムはエラーを出力して終了します。

ストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル Pentium 4 プロセッサ用にプログラム prog.cpp を最適化するには、次のコマンドを使用します:

prompt>icpc -xP prog.cpp

生成されたプログラムがインテル Pentium III プロセッサやインテル Pentium 4 プロセッサなどの、ストリーミング SIMD 拡張命令 3 (SSE3) に対応したインテル Pentium 4 プロセッサをサポートしていないプロセッサ上で実行されると、プログラムは終了します。

プログラムを複数の IA-32 プロセッサ上で実行する場合は、プロセッサ固有の最適化を行う -x{} オプションではなく、プロセッサ固有のコードと汎用コードを生成する -ax{} オプションを使用してください。

FTZ と DAZ フラグの設定

これまで、IA-32 プロセッサでは FTZ (ゼロ・フラッシュ) と DAZ (denormals are zeros) フラグはデフォルトでオフになっていました。しかし、これらのフラグをオンにすると、IEEE 準拠ではなくなりますが、最新の IA-32 プロセッサ上で実行される漸次アンダーフロー・モードでデノーマルな浮動小数点値が使用され、プログラムのパフォーマンスが大幅に向上します。    このため、インテル Pentium III プロセッサ、インテル Pentium 4 プロセッサ、インテル Pentium M プロセッサ、ストリーミング SIMD 拡張命令 3 (SSE3) をサポートするインテル Pentium 4 プロセッサ、および互換性のある IA-32 プロセッサの場合、コンパイラはデフォルトでこれらのフラグをオンにするように変更されました。コンパイラは、プログラムがこれらのインテル・プロセッサのいずれかで実行されていることを確認するため、プロセッサのランタイム・チェックを実行するコードをプログラム中に挿入します。

これらのフラグは、サポートが確認されたインテル・プロセッサによってのみオンにされます。

インテル以外のプロセッサの場合、次のマクロを使用してフラグを手動で設定することができます:

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) にあります。