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

4

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

我已经尝试了所有三个可以选择的启用增强指令集选项,包括“未设置”,但都无效。

附注:奇怪的是,即使使用/Od也没有帮助。


2
@DanielFischer:我为什么要禁用向量化?有两个原因:一是为了评估使用SSE2的性能提升,二是为了允许与没有SSE的机器进行一致且有意义的性能比较。 - Violet Giraffe
2
也许以下内容会有帮助:https://dev59.com/LnM_5IYBdhLWcg3wNgKY - NPE
1
这真是太有道理了。谢谢你满足了我的好奇心。我希望我也能回报一些。 - Daniel Fischer
5个回答

4

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

#pragma loop(no_vector) 

实际上,这在MSDN上有记录(尽管我是在学习之后才发现的..)

如果您不想添加pragma,可以选择使用/favor:ATOM编译。 这有点像黑客行为,但它将允许您禁用自动矢量化,而不会触及源代码,并且仍然优化速度。

另外还有两种优化策略/O1“优化大小”和/Os“偏爱小型代码”。 自动矢量化生成的代码要多得多,因此,如果您优化大小,则会禁用自动矢量化。

我最近从自动矢量化手册中读到了所有这些内容。 请参见“循环体规则”的最后一行。

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


谢谢提供链接!顺便问一下,你有没有看到专门为XP设计的vc11运行库?我相信这就是你可以在XP上使用2012编译器和运行库的方法。 - Violet Giraffe

2
你可以尝试在最新的VS2022中使用未记录的选项/d2Qvec-

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

谢谢,那应该可以解决了 - 在/Od中进行向量化只会在x64上发生(为什么?),但这并不完全是我想要的,因为在/Od中循环计数器甚至没有被锁定在寄存器中。性能影响不仅仅是由于向量化引起的。 - Violet Giraffe

0

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


0

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


VC 2010。你的意思是我误解了“向量化”这个术语吗? - Violet Giraffe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接