似乎从最近的更新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中修复
答案 0 :(得分:1)
在正常情况下,默认情况下启用循环自动矢量化程序也可以使用扩展指令集(例如,即使将arch显式设置为SSE2时也是AVX)。
但是,如果cpu不支持AVX,它应该如何工作呢?编译器插入特殊运行时ISA检查(通过__isa_available?)以获得增强的指令集支持,并根据需要选择支持指令的代码路径。看起来像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 ...
不幸的是,它是一个快速的黑客,因为可能每个循环都可以被矢量化,并且在任何地方插入这样的pragma是不切实际的。当然,您也可以降低性能。
另一个临时解决方案是尝试/d2Qvec-sse2only内部编译器切换在自动矢量化期间仅使用SSE2(至少,它应该与Visual Studio 2013一起使用)。此开关没有记录,可以在不事先通知的情况下进行更改。
更新:正如Cheney Wang所提到的,错误已发送给C ++团队,因此您可以在community item中跟踪其状态。
答案 1 :(得分:1)
IA32选项不适用于x64二进制文件,因为SSE2是x86_64指令集的必需部分。
不设置选项应编译为SSE2级别。