当 Visual C++ 编译器遇到 AVX 指令而禁用"增强指令集"标志时会发生什么情况?



在Visual Studio 2013中,项目Configuration Properties > C/C++ > Code Generation页面中有一个名为Enable Enhanced Instruction Set的标志。它可以设置为SSESSE2AVXAVX2IA32

IA32被指定为发出"无增强指令"。

如果我编译并运行一个使用AVX指令的项目,同时将标志设置为IA32,它仍然有效。运行该程序也可以正常工作。

编译器在这种情况下做什么?它是否保持AVX指令原样,因为它们是"硬编码"而不是编译器生成的指令?还是编译器将这些AVXSIMD 指令替换为 SISD 指令?

值得考虑的是,旧的 x87 FPU 操作在 x64 二进制文件中无效,因此如果您启用了 64 位输出,设置 IA-32 将被忽略,SSE2 将用作默认值。如果您碰巧在为 AVX(或先前的指令集(编译的应用中使用 AVX2 内部函数,AVX2 指令仍将在二进制文件中发出,这将导致应用在不支持 AVX2 的 CPU 上硬崩溃。例如,请参阅以下内容:

https://godbolt.org/z/6VZhp-

即使我们要求x87,f((也是使用SSE2编译的(因此movss v.s. fld(,g((使用AVX2指令(例如vmovss(编译。

因此,实际上,Visual Studio允许您将AVX2 intrisincs插入到SSE二进制文件中,但是在运行该代码之前,您必须进行自己的cpuid检查以确保CPU支持这些功能。

最新更新