如何全局或针对特定
for
循环禁用自动矢量化 (SSE2),而不恢复到 MSVS 2010 中的 /Od?
我已经尝试了
Enable Enhanced Instruction Set
的所有3种可能的选项,包括“未设置”,但无济于事。
P。 S. 奇怪的是,即使 /Od 也没有帮助。
对于特定循环,您可以添加编译指示:
#pragma loop(no_vector)
这实际上记录在MSDN上(虽然我是在了解它之后才在那里找到的..)
如果你不喜欢添加pragma,你可以选择用
/favor:ATOM
来编译。这是一个有点黑客行为,但它允许您禁用自动矢量化,而无需触及源代码,并且仍然可以优化速度。
还有两种优化策略
/O1
“优化大小”和/Os
“偏爱小代码”。自动矢量化会生成更多的代码,因此如果您优化大小,自动矢量化将被禁用。
我最近通过阅读自动矢量化食谱了解到了这一切。请参阅“循环体规则”部分的最后一行。
免责声明:我实际上还没有使用VS2012编译器(需要支持Win XP),所以我还没有对此进行测试。此外,编译器开关在 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
选项)。遗憾的是,它的粒度仅限于整个源文件。
尝试确保未设置 /arch 编译器选项。
哪个编译器? AFAIK,VS 从版本 11 开始将实现自动向量化。VS 使用 SSE 指令进行浮点运算,但这并不意味着它实际上对循环进行向量化。
您可以使用最新的 VS2022 尝试未记录的选项 -
/d2Qvec-
。