/arch
(x86)
在 x86 上,為程式碼產生指定架構。 如需其他目標架構的詳細資訊/arch
,請參閱/arch
(ARM64)、/arch
(x64)和 /arch
(ARM)。
語法
/arch:
[IA32
AVX10.1
|AVX512
|AVX2
|||AVX
|SSE
SSE2
]
引數
/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
編譯程式選項
開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [組態屬性>C/C++>Code 產生] 屬性頁。
修改 [啟用增強指令集] 屬性。