visual Microsoft C++编译器:如何使用/O2禁用自动矢量化

visual Microsoft C++ compiler: how to disable auto-vectorization with /O2?

本文关键字:O2 矢量化 何使用 C++ Microsoft 编译器 visual      更新时间:2023-10-16

如何全局禁用自动向量化(SSE2)或针对特定的for循环禁用,而不在MSVS 2010中恢复到/Od?

我已经尝试了Enable Enhanced Instruction Set的所有3个可能选项,包括"未设置",但都没有成功。

第页。S.奇怪的是,即使/Od也无济于事。

对于特定的循环,您可以添加一个pragma:

#pragma loop(no_vector) 

这实际上是在MSDN上记录的(尽管我是在了解它之后才在那里找到的。)

如果您不喜欢添加杂注,可以选择使用/favor:ATOM进行编译。这有点破解,但它将允许您在不接触源的情况下禁用自动矢量化,并在其他情况下优化速度。

另外还有两种优化策略/O1"优化大小"和/Os"支持小代码"。自动向量化会生成更多的代码,所以如果针对大小进行优化,则会禁用自动向量化。

我最近通过阅读自动矢量化食谱了解到了这一切。请参阅"循环体规则"一节的最后一行。

免责声明:我实际上还没有使用VS2012编译器(需要支持WinXP),所以我还没有测试过。此外,编译器开关在2013年或更高版本的工作方式可能会有所不同。

您可以在一个单独的函数中隔离for循环,并尝试使用#pragma optimize

// Disable all optimizations
#pragma optimize("", off)
// your function here
// Enable them back
#pragma optimize("", on)

但这应该与/Od在该特定函数上具有相同的效果,因此可能没有帮助。

如果您是为x86(而不是x86_64编译,因为它没有任何作用),您也可以将SSE2指令集作为一个整体禁用(删除/arch:SSE2选项)。遗憾的是,它的粒度仅限于一个完整的源文件。

您可以在最新的VS2022中尝试未记录的选项-/d2Qvec-

请确保未设置/arch编译器选项。

哪个编译器?AFAIK,VS将从版本11开始实现自动矢量化。VS使用SSE指令进行浮点运算,但这并不意味着它实际上对循环进行了矢量化。