/arch
(x86)
在 x86 上,為程式碼產生指定架構。 如需其他目標架構的詳細資訊 /arch
,請參閱 /arch
(ARM64) 、 /arch
(x64) 和 /arch
(ARM)。
語法
/arch:
[IA32
|SSE
|SSE2
|AVX
|AVX2
|AVX512
]
引數
/arch:IA32
指定沒有增強的指令,同時指定用於浮點數計算的 x87。
/arch:SSE
啟用 SSE 指令的使用。
/arch:SSE2
啟用 SSE2 指令的使用。 如果未 /arch
指定任何選項,此選項是在 x86 平臺上設定的預設指令。
/arch:AVX
啟用 Intel Advanced Vector Extensions 指令的使用。
/arch:AVX2
啟用 Intel Advanced Vector Extensions 2 指令的使用。
/arch:AVX512
啟用 Intel 進階向量延伸模組 512 指示的使用。
備註
此選項 /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 位向量,以及某些其他選擇性功能。 也會新增其他作業的指示。
優化器會根據 /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));
}
、、、、、 __AVX512CD__
__AVX512DQ__
__AVX512BW__
和 __AVX512VL__
宏會指出使用編譯器選項時, /arch
會指出哪一個。 __AVX512F__
__AVX2__
__AVX__
_M_IX86_FP
如需詳細資訊,請參閱 預先定義的宏 。 選項 /arch:AVX2
和 __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 設定此編譯器選項
開啟專案的 [ 屬性頁 ] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性。
選取 [ 組態屬性 > C/C++ > 程式碼產生 ] 屬性頁。
修改 [啟用增強指令集 ] 屬性。
若要以程式方式設定這個編譯器選項
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應