visual Microsoft C++编译器:如何使用/O2禁用自动矢量化
visual Microsoft C++ compiler: how to disable auto-vectorization with /O2?
如何全局禁用自动向量化(SSE2)或针对特定的for
循环禁用,而不在MSVS 2010中恢复到/Od?
我已经尝试了Enable Enhanced Instruction Set
的所有3个可能选项,包括"未设置",但都没有成功。
第页。S.奇怪的是,即使/Od也无济于事。
对于特定的循环,您可以添加一个pragma:
#pragma loop(no_vector)
这实际上是在MSDN上记录的(尽管我是在了解它之后才在那里找到的。)
如果您不喜欢添加杂注,可以选择使用/favor:ATOM
进行编译。这有点破解,但它将允许您在不接触源的情况下禁用自动矢量化,并在其他情况下优化速度。
另外还有两种优化策略/O1
"优化大小"和/Os
"支持小代码"。自动向量化会生成更多的代码,所以如果针对大小进行优化,则会禁用自动向量化。
我最近通过阅读自动矢量化食谱了解到了这一切。请参阅"循环体规则"一节的最后一行。
免责声明:我实际上还没有使用VS2012编译器(需要支持WinXP),所以我还没有测试过。此外,编译器开关在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
选项)。遗憾的是,它的粒度仅限于一个完整的源文件。
您可以在最新的VS2022中尝试未记录的选项-/d2Qvec-
。
请确保未设置/arch编译器选项。
哪个编译器?AFAIK,VS将从版本11开始实现自动矢量化。VS使用SSE指令进行浮点运算,但这并不意味着它实际上对循环进行了矢量化。
- 普通环路未使用gcc 4.8.5自动矢量化
- 阵列火矢量化
- 使用矢量化c++的矩阵乘法
- 循环中标量乘积的自动矢量化
- 如何在clang++中禁用矢量化
- 加权外积的矢量化
- 手动矢量化/SSE 用于 C++ 中的复杂问题
- 包含比较的循环的自动矢量化
- pcl_ros::transformPointCloud的矢量化
- 迭代卡拉苏巴算法在C++中使用OpenACC并行化和矢量化
- (如何)我可以使用openmp矢量化"std::complex<double>"吗?
- C 矩阵乘法自动矢量化
- 矢量化 :乘以_m256i元素
- 是否可以使用 SSE 对此嵌套进行矢量化?
- 为什么内联函数中的循环无法正确自动矢量化
- 是否保证 OpenMP 矢量化
- AVX,SSE总和比gcc自动矢量化慢
- 嵌套矢量化 OpenMP 循环,在最内层循环中具有多行代码
- 模乘法的矢量化
- visual Microsoft C++编译器:如何使用/O2禁用自动矢量化