Net*_*ger 6 avx visual-studio-2017
看起来,从最新更新的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 检查(通过__isa_available?)以增强指令集支持,并根据需要选择具有受支持指令的代码路径。看起来它的完成方式与现代 cpu 的 SSE4.2指令发射类似,即使 arch 是 SSE2。
在上次更新 (15.5) 中,自动矢量化至少在 x86 / x64 版本中被破坏。编译器不会插入运行时 ISA 检查并在循环矢量化期间发出 AVX 指令(在我的例子中是vpermilps)。
临时解决方案:
正如我在解决方法中建议的那样,您可以使用以下方法删除选定循环的自动矢量化:
#pragma loop(no_vector)
for / while / do while ...
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是一个快速破解,因为可能每个循环都可以向量化,并且在任何地方插入这样的编译指示是不切实际的。当然,你也可能会遇到性能下降的情况。
另一个临时解决方案是尝试/d2Qvec-sse2only内部编译器开关,以在自动矢量化期间仅使用 SSE2(至少,它应该与 Visual Studio 2013 一起使用)。此开关没有记录,可以更改,恕不另行通知。
更新:正如 Cheney Wang 所提到的,错误已发送给 C++ 团队,因此您可以在社区项目中跟踪其状态。
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |