/arch (最小限の CPU アーキテクチャ)
更新 : 2007 年 11 月
ストリーミング SIMD 拡張命令 (SSE) およびストリーミング SIMD 拡張命令 2 (SSE2) を使用したコードの生成のアーキテクチャを指定します。
/arch:[SSE|SSE2]
解説
メモ : |
---|
/arch は、x86 プラットフォーム用にコンパイルするときだけ利用できます。このコンパイラ オプションは、x64 または Itanium 用にコンパイルするときは使用できません。 |
SSE は、さまざまな Pentium プロセッサおよび AMD Athlon プロセッサに組み込まれています。SSE2 は、Pentium 4 プロセッサだけに使用されています。
コンパイラは、/arch:SSE を指定すると SSE を使用でき、/arch:SSE2 を指定すると SSE2 を使用できます。
_M_IX86_FP は、/arch コンパイラ オプションがある場合はどれが使用されたかを示します。詳細については、「Predefined Macros」を参照してください。
/arch を指定した場合、SSE および SSE2 をいつどのように利用するかは、オプティマイザによって選択されます。SSE と SSE2 は、SSE/SSE2 命令およびレジスタを使用する方が x87 浮動小数点レジスタ スタックを使用するよりも高速であると判断された場合に、一部のスカラ浮動小数点演算に使用されます。したがって、実際のコードでは、浮動小数点演算に x87 と SSE/SSE2 の両方を組み合わせて使用します。また、/arch:SSE2 を指定した場合は、SSE2 を一部の 64 ビット整数演算に使用できます。
コンパイラは、SSE と SSE2 の使用に加え、SSE および SSE2 をサポートするプロセッサ リビジョンに組み込まれているその他の命令も使用します。例としては、Intel プロセッサの Pentium Pro リビジョンで初めて導入された CMOV 命令が挙げられます。
/clr (共通言語ランタイムのコンパイル) を指定してコンパイルした場合、/arch はマネージ関数のコード生成に影響しません。/arch はネイティブ関数のコード生成にだけ影響します。
/arch と /QIfist (_ftol を呼び出さない) は、同じコンパイル単位では使用できません。
特に、ユーザーが _controlfp を使用して FP 制御ワードを変更しない場合、ランタイム スタートアップ コードでは x87 FPU 制御ワードの精度制御フィールドが 53 ビットに設定されるため、式内のすべての浮動小数点演算と倍精度浮動小数点演算は、53 ビットの有効桁と 15 ビットの指数部によって行われます。ただし、すべての SSE 単精度浮動小数点演算では、24 ビットの有効桁と 8 ビットの指数部が使用され、SSE2 倍精度浮動小数点演算は、53 ビットの有効桁と 11 ビットの指数部が使用されます。詳細については、「_control87、_controlfp、__control87_2」を参照してください。
これらの差異は、次の例のように、ユーザーの代入が各部分式の後に行われる場合ではなく、単一の式ツリー内で発生する可能性があります。
r = f1 * f2 + d; // Different results are possible on SSE/SSE2.
以下と比較してください。
t = f1 * f2; // Do f1 * f2, round to the type of t.
r = t + d; // This should produce the same overall result
// regardless whether x87 stack or SSE/SSE2 is used.
controlfp は、MXCSR 制御ビットを変更しないため、/arch:SSE2 を指定した場合、controlfp の使用に依存する機能はすべて無効になります。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダをクリックします。
[コード生成] プロパティ ページをクリックします。
[拡張命令セットを有効にする] プロパティを変更します。
このコンパイラ オプションをコードから設定するには
- EnableEnhancedInstructionSet を参照してください。