分享方式:


/arch (x86)

在 x86 上,為程式碼產生指定架構。 如需其他目標架構的詳細資訊/arch,請參閱/arch (ARM64)/arch(x64)/arch (ARM)。

語法

/arch:[IA32AVX10.1|AVX512|AVX2|||AVX|SSESSE2]

引數

/arch:IA32
指定沒有增強的指令,同時指定用於浮點數計算的 x87。

/arch:SSE
啟用 Intel 串流 SIMD 擴充功能。

/arch:SSE2
啟用 Intel 串流 SIMD 擴充功能 2。 如果未 /arch 指定任何選項,則預設指令集為 SSE2。

/arch:AVX
啟用 Intel 進階向量延伸模組。

/arch:AVX2
啟用 Intel 進階向量延伸模組 2。

/arch:AVX512
啟用 Intel 進階向量延伸模組 512。

/arch:AVX10.1
啟用 Intel 進階向量延伸模組 10 第 1 版。

備註

此選項 /arch 可啟用或停用特定指令集延伸模組的使用,特別是用於 Intel 和 AMD 處理器中提供的向量計算。 一般而言,最近引進的處理器可能會支援超出舊處理器所支援延伸模組。 您應該先參閱特定處理器或測試的檔,以取得指示集延伸模組支援, __cpuid 再使用指令集延伸模組執行程序代碼。

/arch 只會影響原生函式的程式代碼產生。 當您使用 /clr 來編譯時, /arch 對 Managed 函式的程式代碼產生沒有任何影響。

這些 /arch 選項會參考具有下列特性的指令集擴充功能:

  • IA32 是不含任何向量作業且使用 x87 進行浮點計算的舊版 32 位 x86 指令集。

  • SSE 允許使用最多四個單精度浮點值的向量進行計算。 也已新增對應的純量浮點指令。

  • SSE2 允許使用單精度、雙精確度和 1、2、4 或 8 位元組整數值的 128 位向量進行計算。 也新增了雙精確度純量指令。

  • AVX 引進了向量和浮點純量指令的替代指令編碼。 它允許128位或256位的向量,而零會將所有向量結果延伸至完整向量大小。 (針對舊版相容性,SSE 樣式向量指令會保留位 127 以外的所有位。大部分的浮點運算都會延伸至256位。

  • AVX2 將大部分的整數作業延伸至 256 位向量,並可讓您使用 Fused Multiply-Add (FMA) 指示。

  • AVX512 引進了另一種指令編碼形式,允許512位向量、遮罩、內嵌四捨五入/廣播,以及新的指令。 的預設向量長度 AVX512 為512位,而且可以使用旗標變更為256位 /vlen

  • 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 處理器中引進的,因此 CMOVcc 指令可能會產生,但指定時 /arch:IA32 除外。

浮點運算通常會四捨五入為 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____AVX512CD____AVX512F____AVX512VL____AVX512DQ____AVX512BW____AVX10_VER__ 巨集會指出使用編譯程式選項時,/arch會指出哪一個。 如需詳細資訊,請參閱 預先定義的巨集。 Visual /arch:AVX2 Studio 2013 Update 2 12.0.34567.1 版中引進了選項和 __AVX2__ 巨集。 Visual Studio 2017 已新增有限的支援 /arch:AVX512 ,並在 Visual Studio 2019 中擴充。 Visual Studio 2022 已新增對 /arch:AVX10.1 的支援。

在 Visual Studio 中設定 /arch 編譯程式選項

  1. 開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [組態屬性>C/C++>Code 產生] 屬性頁。

  3. 修改 [啟用增強指令集] 屬性。

若要以程式方式設定這個編譯器選項

另請參閱

/arch (最低 CPU 架構)
MSVC 編譯器選項
MSVC 編譯器命令列語法