/arch (x86)

x86 でコード生成のアーキテクチャを指定します。 他のターゲット アーキテクチャの/arch詳細については、「(ARM64)、(x64)/archおよび/arch(ARM)」を参照してください。/arch

構文

/arch:[IA32|SSE|SSE2|AVX|AVX2|AVX512]

引数

/arch:IA32
拡張命令なしを指定し、浮動小数点計算に x87 を指定します。

/arch:SSE
SSE 命令の使用を有効にします。

/arch:SSE2
SSE2 命令の使用を有効にします。 このオプションは、オプションが指定されていない /arch 場合に x86 プラットフォームで設定される既定の命令です。

/arch:AVX
Advanced Vector Extensions 命令の使用を有効にします。

/arch:AVX2
Advanced Vector Extensions 2 命令の使用を有効にします。

/arch:AVX512
Intel Advanced Vector Extensions 512 命令の使用を有効にします。

解説

このオプションは /arch 、特定の命令セット拡張の使用を有効または無効にします。特にベクター計算では、Intel および AMD のプロセッサで使用できます。 一般に、最近導入されたプロセッサでは、古いプロセッサでサポートされている拡張機能以外の拡張機能がサポートされる場合があります。 命令セット拡張機能を使用 __cpuid してコードを実行する前に、特定のプロセッサのドキュメントを参照するか、命令セット拡張機能のサポートをテストする必要があります。

/arch は、ネイティブ関数のコード生成にのみ影響します。 コンパイルに使用 /clr する場合、 /arch マネージド関数のコード生成には影響しません。

オプションは /arch 、次の特性を持つ命令セット拡張を参照します。

  • IA32 は、ベクトル演算を行わず、浮動小数点計算に x87 を使用する従来の 32 ビット x86 命令セットです。

  • SSE では、最大 4 つの単精度浮動小数点値のベクトルを使用して計算できます。 対応するスカラー浮動小数点命令も追加されました。

  • SSE2 では、単精度、倍精度、1、2、4、または 8 バイトの整数値の 128 ビット ベクトルを使用して計算できます。 倍精度のスカラー命令も追加されました。

  • AVX ベクトルおよび浮動小数点スカラー命令の代替命令エンコードが導入されました。 これにより、128 ビットまたは 256 ビットのベクトルが可能になり、すべてのベクター結果が完全なベクター サイズに拡張されます。 (従来の互換性のために、S Standard Edition スタイルのベクター命令では、ビット 127 以降のすべてのビットが保持されます)。ほとんどの浮動小数点演算は、256 ビットに拡張されます。

  • AVX2 は、ほとんどの整数演算を 256 ビット ベクトルに拡張し、Fused Multiply-Add (FMA) 命令を使用できるようにします。

  • AVX512 では、512 ビット ベクトルを使用できる別の命令エンコード 形式と、その他のオプション機能が導入されました。 その他の操作の手順も追加されました。

オプティマイザーは、指定されたベクトル命令に応じて、いつどのように使用するかを /arch 選択します。 スカラー浮動小数点計算は、使用可能であれば SSE または AVX 命令を使って実行されます。 一部の呼び出し規約では、x87 スタックで浮動小数点引数を渡すことが指定されています。その結果、コードで、浮動小数点計算に x87 と SSE/AVX 命令の両方を組み合わせて使用する場合があります。 整数ベクトル命令は、使用可能な場合は一部の 64 ビット整数演算に使うこともできます。

/arch オプションでは、ベクターおよび浮動小数点スカラー命令に加えて、そのオプションに関連付けられている他の非ベクター命令を使用することもできます。 例として、Intel Pentium Pro プロセッサで初めて登場した CMOVcc 命令ファミリがあります。 S Standard Edition 命令は後続の Intel Pentium III プロセッサで導入されたため、CMOVcc 命令は指定されている場合/arch:IA32を除いて生成される場合があります。

通常、x87 コードでは浮動小数点演算は倍精度 (64 ビット) に丸められますが、_controlfp を使って FP 制御ワードを変更できます。たとえば、精度制御を拡張精度 (80 ビット) や単精度 (32 ビット) に設定することができます。 詳細については、_control87_controlfp__control87_2 に関する記事を参照してください。 S Standard Edition と AVX には、各操作に対して個別の単精度命令と倍精度命令があるため、S Standard Edition/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 非推奨となりました。 S Standard Edition または 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));
}

__AVX____AVX2____AVX512F____AVX512CD____AVX512DQ____AVX512BW__、および__AVX512VL__マクロは_M_IX86_FP、コンパイラ オプションが使用された場合に/arch指定します。 詳細については、「定義済みマクロ」を参照してください。 このオプションと__AVX2__マクロは/arch:AVX2、Visual Studio 2013 Update 2 バージョン 12.0.34567.1 で導入されました。 Visual Studio 2017 で制限付き /arch:AVX512 サポートが追加され、Visual Studio 2019 で拡張されました。

Visual Studio で AVX、AVX2、AVX512、IA32、SSE、または SSE2 に対してこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳しくは、「Visual Studio で C++ コンパイラとビルド プロパティを設定する」をご覧ください。

  2. [構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。

  3. [拡張命令セットを有効にする] プロパティを変更します。

このコンパイラ オプションをコードから設定するには

関連項目

/arch (最小 CPU アーキテクチャ)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文