如何在MSVS 2010中全局或针对特定的for
循环禁用自动矢量化(SSE2),而不需要返回到/Od?
我已经尝试了所有三个可以选择的启用增强指令集
选项,包括“未设置”,但都无效。
附注:奇怪的是,即使使用/Od也没有帮助。
如何在MSVS 2010中全局或针对特定的for
循环禁用自动矢量化(SSE2),而不需要返回到/Od?
我已经尝试了所有三个可以选择的启用增强指令集
选项,包括“未设置”,但都无效。
附注:奇怪的是,即使使用/Od也没有帮助。
针对特定循环,您可以添加一个编译指示:
#pragma loop(no_vector)
实际上,这在MSDN上有记录(尽管我是在学习之后才发现的..)
如果您不想添加pragma,可以选择使用/favor:ATOM
编译。 这有点像黑客行为,但它将允许您禁用自动矢量化,而不会触及源代码,并且仍然优化速度。
另外还有两种优化策略/O1
“优化大小”和/Os
“偏爱小型代码”。 自动矢量化生成的代码要多得多,因此,如果您优化大小,则会禁用自动矢量化。
我最近从自动矢量化手册中读到了所有这些内容。 请参见“循环体规则”的最后一行。
免责声明:我实际上还没有使用VS2012编译器(需要支持Win XP),因此我还没有测试过。 此外,编译器开关在2013年或更高版本中可能会有所不同。
/d2Qvec-
。#pragma optimize
对其进行优化:// Disable all optimizations
#pragma optimize("", off)
// your function here
// Enable them back
#pragma optimize("", on)
/Od
相同的效果,只是针对特定函数,所以可能没有帮助。/arch:SSE2
选项)。不幸的是,它的粒度仅限于整个源文件。使用哪个编译器?据我所知,从11版本开始,VS将实现自动向量化。VS使用SSE指令进行浮点运算,但这并不意味着它实际上会向量化循环。