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

时间:2012-01-17 20:17:29

标签: c++ visual-c++ vectorization compiler-optimization

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

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

P上。 S.奇怪的是,偶数/ Od没有帮助。

4 个答案:

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

答案 1 :(得分:2)

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

#pragma loop(no_vector) 

这实际上是documented on MSDN(虽然我在了解它之后才发现它。)

如果您不想添加编译指示,可以选择使用/favor:ATOM进行编译。这有点破解,但它允许你禁用自动矢量化,而不接触源,否则仍然优化速度。

或者,有两种优化策略/O1“优化大小”和/Os“支持小代码”。自动矢量化会生成更多代码,因此如果您针对大小进行优化,则会禁用自动矢量化。

我最近通过阅读auto-vectorization cookbook了解了这一切。请参阅“循环体规则”部分的最后一行。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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