/arch
(x86)
x86 でコード生成のアーキテクチャを指定します。 その他のターゲット アーキテクチャの /arch
の詳細については、「 /arch
(ARM64)、 /arch
(x64)、および /arch
(ARM)」を参照してください。
構文
/arch:
[IA32
|SSE
|SSE2
|AVX
|AVX2
|AVX512
|AVX10.1
]
引数
/arch:IA32
拡張命令なしを指定し、浮動小数点計算に x87 を指定します。
/arch:SSE
Intel Streaming SIMD 拡張機能を有効にします。
/arch:SSE2
Intel Streaming SIMD Extensions 2 を有効にします。 /arch
オプションが指定されていない場合、既定の命令セットは SSE2 です。
/arch:AVX
Intel Advanced Vector Extensions を有効にします。
/arch:AVX2
Intel Advanced Vector Extensions 2 を有効にします。
/arch:AVX512
Intel Advanced Vector Extensions 512 を有効にします。
/arch:AVX10.1
Intel Advanced Vector Extensions 10 バージョン 1 を有効にします。
解説
/arch
オプションを使用すると、Intel および AMD のプロセッサで使用できる、特定の命令セット拡張機能 (特にベクター計算用) の使用が有効または無効になります。 一般に、最近導入されたプロセッサでは、古いプロセッサでサポートされている拡張機能以外の拡張機能がサポートされる場合があります。 命令セット拡張機能を使用してコードを実行する前に、特定のプロセッサのドキュメントを参照するか、 __cpuid
を使用して命令セット拡張機能のサポートをテストする必要があります。 __check_isa_support
組み込みを使用して、より頻繁に使用される CPU 機能を確認することもできます。
/arch
は、ネイティブ関数のコード生成にのみ影響します。 /clr
を使用してコンパイルする場合、/arch
はマネージド関数のコード生成には影響しません。
/arch
オプションは、次の特性を持つ命令セット拡張を参照します。
IA32
は、ベクトル演算を行わず、浮動小数点計算に x87 を使用する従来の 32 ビット x86 命令セットです。SSE
では、最大 4 つの単精度浮動小数点値のベクトルを使用して計算できます。 対応するスカラー浮動小数点命令も追加されました。SSE2
では、単精度、倍精度、1、2、4、または 8 バイトの整数値の 128 ビット ベクトルを使用して計算できます。 倍精度のスカラー命令も追加されました。AVX
ベクトルおよび浮動小数点スカラー命令の代替命令エンコードが導入されました。 これにより、128 ビットまたは 256 ビットのベクトルが可能になり、すべてのベクター結果が完全なベクター サイズに拡張されます。 (従来の互換性のために、SSE スタイルのベクター命令はビット 127 を超えるすべてのビットを保持します)。ほとんどの浮動小数点演算は、256 ビットに拡張されます。AVX2
は、ほとんどの整数演算を 256 ビット ベクトルに拡張し、Fused Multiply-Add (FMA) 命令を使用できるようにします。AVX512
では、512 ビット ベクトル、マスク、埋め込み丸め/ブロードキャスト、および新しい命令を可能にする別の命令エンコード フォームが導入されました。AVX512
の既定のベクトル長は 512 ビットであり、/vlen
フラグを使用して 256 ビットに変更できます。AVX10.1
は、AVX-512
の上にさらに指示を追加します。AVX10.1
の既定のベクトル長は 256 ビットであり、/vlen
フラグを使用して 512 ビットに変更できます。
オプティマイザーは、指定された /arch
に応じて、ベクトル命令を使用するタイミングと方法を選択します。 スカラー浮動小数点計算は、通常、SSE 命令または AVX 命令 (使用可能な場合) で実行されます。 一部の呼び出し規約では、x87 スタックで浮動小数点引数を渡すことが指定されています。その結果、コードで、浮動小数点計算に x87 と SSE/AVX 命令の両方を組み合わせて使用する場合があります。 整数ベクトル命令は、使用可能な場合は一部の 64 ビット整数演算に使うこともできます。
各 /arch
オプションでは、ベクターおよび浮動小数点スカラー命令に加えて、そのオプションに関連付けられている他の非ベクター命令を使用することもできます。 例として、Intel Pentium Pro プロセッサで初めて登場した CMOVcc 命令ファミリがあります。 SSE 命令は後続の Intel Pentium III プロセッサで導入されたため、 /arch:IA32
が指定されている場合を除き、CMOVcc 命令が生成される可能性があります。
通常、x87 コードでは浮動小数点演算は倍精度 (64 ビット) に丸められますが、_controlfp
を使って FP 制御ワードを変更できます。たとえば、精度制御を拡張精度 (80 ビット) や単精度 (32 ビット) に設定することができます。 詳細については、_control87
、_controlfp
、__control87_2
に関する記事を参照してください。 SSE と AVX には、各操作に対して個別の単精度命令と倍精度命令があるため、SSE/AVX コードに相当するものはありません。 浮動小数点演算の結果をユーザー変数に割り当てるのではなく、それ以降の計算で直接使用する場合の結果の丸め方を変更できます。 次の操作を検討してください。
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
// whether x87 stack is used or SSE/SSE2 is used.
/arch
と /QIfist
を一緒に使用することはできません。 /QIfist
オプションは、浮動小数点から整数への変換の丸め動作を変更します。 既定の動作は切り捨て (ゼロに丸める) のに対し、 /QIfist
オプションは 浮動ポイント環境 丸めモードの使用を指定します。 このオプションは、すべての浮動小数点から整数への変換の動作を変更するため、 /QIfist
は非推奨です。 SSE または AVX 用にコンパイルする場合は、組み込み関数シーケンスを使用して浮動小数点環境の丸めモードを使用して、浮動小数点値を整数に丸めることができます。
int convert_float_to_int(float x) {
return _mm_cvtss_si32(_mm_set_ss(x));
}
int convert_double_to_int(double x) {
return _mm_cvtsd_si32(_mm_set_sd(x));
}
_M_IX86_FP
、__AVX__
、__AVX2__
、__AVX512F__
、__AVX512CD__
、__AVX512BW__
、__AVX512DQ__
、__AVX512VL__
、__AVX10_VER__
のマクロは、コンパイラ オプションが使用された/arch
を示します。 詳細については、「定義済みマクロ」を参照してください。 /arch:AVX2
オプションと __AVX2__
マクロは、Visual Studio 2013 Update 2 バージョン 12.0.34567.1 で導入されました。 visual Studio 2017 で /arch:AVX512
の制限付きサポートが追加され、Visual Studio 2019 で拡張されました。 Visual Studio 2022 で /arch:AVX10.1
のサポートが追加されました。
Visual Studio で /arch
コンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「Visual Studio で C++ コンパイラとビルド プロパティを設定する」をご覧ください。
[構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。
[拡張命令セットを有効にする] プロパティを変更します。
このコンパイラ オプションをコードから設定するには
- 以下を参照してください。EnableEnhancedInstructionSet
関連項目
/arch
(最小 CPU アーキテクチャ)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文