在Visual Studio 2013中,项目Configuration Properties > C/C++ > Code Generation
页面中有一个名为Enable Enhanced Instruction Set
的标志。它可以设置为SSE
、SSE2
、AVX
、AVX2
或IA32
。
IA32
被指定为发出"无增强指令"。
如果我编译并运行一个使用AVX
指令的项目,同时将标志设置为IA32
,它仍然有效。运行该程序也可以正常工作。
编译器在这种情况下做什么?它是否保持AVX
指令原样,因为它们是"硬编码"而不是编译器生成的指令?还是编译器将这些AVX
SIMD 指令替换为 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支持这些功能。