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

问题描述 投票:0回答:5

如何全局或针对特定

for
循环禁用自动矢量化 (SSE2),而不恢复到 MSVS 2010 中的 /Od?

我已经尝试了

Enable Enhanced Instruction Set
的所有3种可能的选项,包括“未设置”,但无济于事。

P。 S. 奇怪的是,即使 /Od 也没有帮助。

c++ visual-c++ vectorization compiler-optimization
5个回答
3
投票

对于特定循环,您可以添加编译指示:

#pragma loop(no_vector) 

这实际上记录在MSDN上(虽然我是在了解它之后才在那里找到的..)

如果你不喜欢添加pragma,你可以选择用

/favor:ATOM
来编译。这是一个有点黑客行为,但它允许您禁用自动矢量化,而无需触及源代码,并且仍然可以优化速度。

还有两种优化策略

/O1
“优化大小”和
/Os
“偏爱小代码”。自动矢量化会生成更多的代码,因此如果您优化大小,自动矢量化将被禁用。

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

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


2
投票

您可以将

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
选项)。遗憾的是,它的粒度仅限于整个源文件。


0
投票

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


0
投票

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


0
投票

您可以使用最新的 VS2022 尝试未记录的选项 -

/d2Qvec-

© www.soinside.com 2019 - 2024. All rights reserved.