Share via


/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 設定此編譯器選項

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

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

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

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

另請參閱

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