如何在 Visual Studio 2017 15.5 中禁用 AVX?

How to disable AVX in Visual Studio 2017 15.5?

似乎从最近的更新 Visual Studio 2017 (15.5) 开始,它使用 AVX 扩展(对于 x64 构建)生成代码,即使“启用增强指令集”设置为“未设置” ",根据工具提示,它应该只允许 SSE2 指令。 尝试将其设置为 /arch:SSE2 或 /arch:IA32 会导致编译器警告“忽略未知选项‘/arch:IA32’”(或相应的 SSE2),根据 https://connect.microsoft.com/VisualStudio/feedback/details/1217151,这是预期的行为。 那么现在有什么方法可以让编译器不生成 AVX 特定代码吗?

更新

这已在 15.7 中修复

在正常情况下,默认启用循环自动向量化器也可以使用扩展指令集(例如 AVX,即使 arch 明确设置为 SSE2)。

但是,如果 cpu 不支持 AVX,它应该如何工作呢?编译器插入特殊的运行时 ISA 检查(通过 ?) for enhanced instruction set support and choose code path with supported instructions on demand. Looks like it was done similar to SSE4.2 instructions emission 用于现代 cpus,即使 arch 是 SSE2。

在上次更新 (15.5) 中,自动矢量化至少在 x86 / x64 构建中被破坏。编译器不插入运行时 ISA 检查并在循环矢量化期间发出 AVX 指令(在我的例子中是 vpermilps)。

临时解决方案:

正如我在解决方法中所建议的那样,您可以 remove auto-vectorization 为选定的循环使用:

#pragma loop(no_vector)
for / while / do while ...

不幸的是,这是一个快速的 hack,因为可能每个循环都可以矢量化,并且在任何地方插入这样的 pragma 是不切实际的。当然,你也可以获得性能下降。

另一个临时解决方案是尝试 /d2Qvec-sse2only 内部编译器开关在自动矢量化期间仅使用 SSE2(至少,它应该适用于 Visual Studio 2013)。此开关未记录,如有更改,恕不另行通知。

更新: 正如 Cheney Wang 所说,错误已发送给 C++ 团队,因此您可以在 community item.

中跟踪其状态

IA32 选项不适用于 x64 二进制文件,因为 SSE2 是 x86_64 指令集的必需部分。
不设置选项应该针对 SSE2 级别进行编译。