如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?
Posted
技术标签:
【中文标题】如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?【英文标题】:How to disable only SIMD auto-vectorization optimization in Visual Studio 2015 (for C++)? 【发布时间】:2017-01-04 10:01:48 【问题描述】:我的问题只是如何在 Visual Studio 2015 中仅禁用 SIMD 自动矢量化优化(保留发布模式的其他优化):
1) 正在编译的整个项目;
2) 部分代码。
在第一种情况下,我想了解如何在整个项目中禁用它。对于第二种情况,我想知道是否也可以对代码的特定区域执行此操作,类似于使用#pragma optimize("", off)
和#pragma optimize("", on)
时所有优化的可能。
这样做的目的是将一些手动优化的代码与编译器的自动 SIMD 矢量化进行性能比较。
【问题讨论】:
关闭 SSE 支持还不够? 你不能在 x64 上这样做,因为所有 x64 都至少有 SSE2。 @Mysticial 所以你的意思是我只有为 x86 编译才能做到这一点? @MSalters 你的意思是指定/arch:IA32
?
@blipblop 正确。 Visual Studio 不允许您在 x64 上禁用 SSE2,因为所有 x64 处理器都有 SSE2。所以从他们的角度来看,在 x64 构建上添加禁用 SSE2 的能力是没有意义的。您的特定用例非常小众。另一种方法是使用没有自动矢量化的旧版本 VS。 (VS2010-ish 和更早的 IIRC)
【参考方案1】:
使用/O2
或/Ox
构建时会自动启用Visual C++ 自动矢量化器。
要查看它在做什么,请使用 /Qvec-report:1
或 /Qvec-report:2
构建。
您可以使用 #pragma loop(no_vector)
为特定循环禁用它
见MSDN
没有记录的方法可以全局禁用自动矢量化器,同时保持启用标准优化。
有关详细信息,请参阅此blog series、此video 和Auto-Vectorization Cookbook
【讨论】:
感谢您的回答。你在哪里找到上面的报价?我在您包含的任何链接中都没有找到(也没有在食谱中)。也许您错过了感兴趣的参考资料? 这不是一个引用,而是一个旁白。没有记录的编译器开关只是禁用自动矢量化器。以上是关于如何在 Visual Studio 2015(用于 C++)中仅禁用 SIMD 自动矢量化优化?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2015 不适用于 Apache Cordova 工具
C# 6.0 功能不适用于 Visual Studio 2015
Visual Studio 2013/2015 测试项目模板 - 用于 NUnit?