如何在全局或特定for
循环中禁用自动向量化(SSE2),而不在MSVS 2010中恢复为/ Od?
我已尝试Enable Enhanced Instruction Set
的所有3种可能选项,包括“未设置”,但无济于事。
P上。 S.奇怪的是,偶数/ Od没有帮助。
答案 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指令进行浮点运算,但这并不意味着它实际上是向量化循环。