在 x86 上为代码生成指定体系结构。 这些开关适用于编译器的 x86 (32 位) 目标版本。 有关其他目标体系结构的 /arch 的详细信息,请参阅 /arch (ARM64)、/arch (x64) 和 /arch (ARM)。
语法
/arch:[IA32AVX10.2|AVX10.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:AVX10.2
启用 Intel 高级矢量扩展 10 版本 2。
注解
可以通过 /arch 选项来允许或不允许使用某些指令集扩展,尤其是对 Intel 和 AMD 处理器中提供的矢量计算而言。 一般情况下,最近引入的处理器支持的扩展范围可能比旧处理器支持的扩展范围要广。 在使用指令集扩展执行代码之前,应查阅文档来了解特定的处理器,或使用 __cpuid 来测试指令集扩展支持。 还可以使用 __check_isa_support 内部函数检查更频繁使用的 CPU 功能。
/arch 仅影响本机函数的代码生成。 当使用 /clr 进行编译时,/arch 对托管函数的代码生成没有影响。
/arch 选项引用具有以下特征的指令集扩展:
IA32是旧版 32 位 x86 指令集,没有任何矢量运算,使用 x87 进行浮点计算。SSE允许使用具有最多四个单精度浮点值的矢量进行计算。 此外,还添加了相应的标量浮点指令。SSE2允许使用单精度的、双精度的和 1、2、4 或 8 字节整数值的 128 位矢量进行计算。 此外,还添加了双精度标量指令。AVX为矢量和浮点标量指令引入了替代指令编码。 它允许 128 位或 256 位的矢量,并将所有矢量结果零扩展到整个矢量大小。 (考虑到旧版兼容性,SSE 样式矢量指令保留第 127 位以外的所有位。)大多数浮点运算扩展到 256 位。AVX2将大多数整数运算扩展到 256 位矢量,允许使用混合乘加运算 (FMA) 指令。AVX512引入了另一种指令编码形式,允许 512 位矢量、掩码、嵌入式舍入/广播和新指令。 默认矢量长度AVX512为 512 位,可以使用标志更改为 256 位/vlen。AVX10.1在AVX-512上面添加更多说明。 默认矢量长度AVX10.1为 256 位,可以使用标志更改为 512 位/vlen。 此选项是在 Visual Studio 2022 17.13 中引入的。AVX10.2展开中AVX10.1引入的指令集。 默认矢量长度AVX10.2为 256 位,可以使用标志增加到 512 位/vlen。AVX10.2添加对旧指令和媒体加速指令增强的说明。 有关新指令的详细信息,请参阅 Intel 高级矢量扩展 10.2 体系结构规范中的 3.1.4 部分:该文档中的 AI 相关说明通过 MSVC 内部函数支持,而不是直接发出,因为 MSVC 不支持其数据类型。 Visual Studio 2026 中引入了此编译器选项。
优化器根据指定了哪个 /arch 来选择何时以及如何使用矢量指令。 标量浮点计算通常在可用时使用 SSE 或 AVX 指令执行。 某些调用约定指定在 x87 堆栈上传递浮点参数,因此,代码可能会混合使用 x87 和 SSE/AVX 指令进行浮点计算。 整数矢量指令也可用于一些 64 位整数运算(如果可用)。
除了向量和浮点标量指令外,每个 /arch 选项还可能允许使用与该选项关联的其他非函数指令。 例如,在 Intel Pentium Pro 处理器中首次出现的 CMOVcc 指令系列。 由于 SSE 指令随后续 IntelPentum 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__、__AVX512F__、__AVX512CD__、__AVX512BW____AVX512DQ__、和__AVX512VL____AVX10_VER__宏指示使用了哪个编译器选项(如果有/arch)。 有关详细信息,请参阅预定义宏。 Visual Studio 2013 Update 2 版本 12.0.34567.1 中引入了该 /arch:AVX2 选项和 __AVX2__ 宏。 在 Visual Studio 2017 中添加了对 /arch:AVX512 的有限支持,并在 Visual Studio 2019 中对其进行了扩展。 Visual Studio 2022 中添加了对 /arch:AVX10.1 的支持。
在 Visual Studio 中设置 /arch 编译器选项
打开项目的“属性页”对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”“C/C++”>“代码生成”属性页面>。
修改“启用增强指令集”属性。