当 "Enhanced Instruction Set" 标志被禁用时,Visual C++ 编译器遇到 AVX 指令时会发生什么?
What happens when the Visual C++ compiler encounters AVX instructions while the "Enhanced Instruction Set" flag is disabled?
在 Visual Studio 2013 年,项目 Configuration Properties > C/C++ > Code Generation
页面中有一个名为 Enable Enhanced Instruction Set
的标记。可以设置为 SSE
、SSE2
、AVX
、AVX2
或 IA32
.
IA32
指定为 "No Enhanced Instructions".
如果我编译并 运行 一个使用 AVX
指令的项目,同时将标志设置为 IA32
,它仍然有效。 运行 该程序也运行良好。
编译器在这种情况下做了什么?它是否保持 AVX
指令原样,因为它们是 "hardcoded" 而不是编译器生成的指令?或者编译器是否将这些 AVX
SIMD 指令替换为 SISD 指令?
值得考虑的是,旧的 x87 FPU 操作在 x64 二进制文件中无效,因此如果您启用了 64 位输出,IA-32 设置将被忽略,SSE2 将用作默认设置。如果您碰巧在为 AVX(或先前的指令集)编译的应用程序中使用 AVX2 内在函数,AVX2 指令仍将在二进制文件中发出,这将导致应用程序在 CPU 上硬崩溃支持AVX2。参见例如:
即使我们要求 x87,f() 也是使用 SSE2 编译的(因此是 movss v.s.fld),而 g() 是使用 AVX2 指令(例如 vmovss)编译的。
所以实际上,Visual Studio 允许您将 AVX2 指令插入 SSE 二进制文件,但您必须自己进行 cpuid 检查以确保 CPU 在 [= 之前支持这些功能23=] 那个代码。
在 Visual Studio 2013 年,项目 Configuration Properties > C/C++ > Code Generation
页面中有一个名为 Enable Enhanced Instruction Set
的标记。可以设置为 SSE
、SSE2
、AVX
、AVX2
或 IA32
.
IA32
指定为 "No Enhanced Instructions".
如果我编译并 运行 一个使用 AVX
指令的项目,同时将标志设置为 IA32
,它仍然有效。 运行 该程序也运行良好。
编译器在这种情况下做了什么?它是否保持 AVX
指令原样,因为它们是 "hardcoded" 而不是编译器生成的指令?或者编译器是否将这些 AVX
SIMD 指令替换为 SISD 指令?
值得考虑的是,旧的 x87 FPU 操作在 x64 二进制文件中无效,因此如果您启用了 64 位输出,IA-32 设置将被忽略,SSE2 将用作默认设置。如果您碰巧在为 AVX(或先前的指令集)编译的应用程序中使用 AVX2 内在函数,AVX2 指令仍将在二进制文件中发出,这将导致应用程序在 CPU 上硬崩溃支持AVX2。参见例如:
即使我们要求 x87,f() 也是使用 SSE2 编译的(因此是 movss v.s.fld),而 g() 是使用 AVX2 指令(例如 vmovss)编译的。
所以实际上,Visual Studio 允许您将 AVX2 指令插入 SSE 二进制文件,但您必须自己进行 cpuid 检查以确保 CPU 在 [= 之前支持这些功能23=] 那个代码。