C++ 对gcc O3优化标志的质疑
我有g++4.7.3编译器。我正在尝试按照优化标志描述进行操作,但遇到了下一个问题: 我有一个程序,它用-O2和-O3标志给出不同的时间-O2比-O3快两倍。O2和O3的时间分别为8ms和16ms 所以我想了解到底是什么造成了不同。在上面的链接中,我看到: “O3优化更多。-O3打开-O2指定的所有优化,还打开-finline函数、-funswitch循环、-fppredictive commoning、-fgcse after reload、-ftree矢量化和-fipa cp clone选项。” 所以我只需要取-O2并添加所有描述的标志:C++ 对gcc O3优化标志的质疑,c++,optimization,options,C++,Optimization,Options,我有g++4.7.3编译器。我正在尝试按照优化标志描述进行操作,但遇到了下一个问题: 我有一个程序,它用-O2和-O3标志给出不同的时间-O2比-O3快两倍。O2和O3的时间分别为8ms和16ms 所以我想了解到底是什么造成了不同。在上面的链接中,我看到: “O3优化更多。-O3打开-O2指定的所有优化,还打开-finline函数、-funswitch循环、-fppredictive commoning、-fgcse after reload、-ftree矢量化和-fipa cp clone选项
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone
时间是30毫秒但这组选项应等同于-O3。为什么时间不同?我在哪里做错了什么
另外,所有结果完全可重复,精度为1ms
我已使用检查选项
g++ -c -Q -Ox --help=optimizers
看到O3还有一个附加选项:—ftree循环分布模式。但当我将其添加到选项集时:
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns
速度仍然为30毫秒。您可以获取
g++
以显示使用-Q
选项激活的选项:
g++ -c -Q -O3 --help=optimizers
输出类似于:
-O<number>
-Ofast
-Os
-falign-functions [enabled]
-falign-jumps [enabled]
-falign-labels [enabled]
-falign-loops [enabled]
-fasynchronous-unwind-tables [enabled]
-fbranch-count-reg [enabled]
-fbranch-probabilities [disabled]
-fbranch-target-load-optimize [disabled]
-fbranch-target-load-optimize2 [disabled]
-fbtr-bb-exclusive [disabled]
-fcaller-saves [enabled]
-fcombine-stack-adjustments [enabled]
-fcommon [enabled]
-fcompare-elim [enabled]
-fconserve-stack [disabled]
-fcprop-registers [enabled]
-fcrossjumping [enabled]
-fcse-follow-jumps [enabled]
-fcx-fortran-rules [disabled]
-fcx-limited-range [disabled]
-fdata-sections [disabled]
-fdce [enabled]
ETC..
-O
-过去
-操作系统
-falign功能[已启用]
-falign跳转[已启用]
-fallign标签[已启用]
-falign循环[已启用]
-fasynchronous unwind tables[已启用]
-fbranch count reg[已启用]
-fbranch概率[禁用]
-fbranch目标负载优化[禁用]
-fbranch-target-load-optimize2[已禁用]
-fbtr bb专用[禁用]
-fcaller保存[已启用]
-fcombine堆栈调整[启用]
-fcommon[已启用]
-fcompare elim[已启用]
-fconserve堆栈[已禁用]
-fcprop寄存器[已启用]
-fcrossjumping[已启用]
-fcse跟随跳跃[启用]
-fcx fortran规则[已禁用]
-fcx限制范围[禁用]
-fdata节[已禁用]
-fdce[已启用]
等
优化不是一门完美的科学。没有明确的理由认为您做错了任何事情(但由于您没有提供进行这些测量的方法,因此无法知道您也没有做错任何事情)。至少GCC优化选项不能保证性能选项集的性能更快。有很多事情,更小的大小可以更快地提高性能,例如缓存命中率、分支预测等。值得一提的是,文档没有明确指出-O3是-O2加上一些额外的选项-除了打开这些优化标志之外,他们可能会做完全不同的事情,至少从您发布的文档措辞来看,如果不了解您的代码的功能,甚至很难推测为什么您的代码在-O3中比在-O2中慢。但较大的代码运行较慢并非不可能,这可能是因为代码缓存命中率较低,或者是因为“编译器没有正确地完成它的工作”-或者是因为编译器中的某些错误导致在遇到某些特定情况时生成坏代码。@Mats Perersson,我的问题根本不是关于代码,它是关于优化标志的。我不是问它为什么慢,我是问为什么时间可以不同?谢谢。因此,它显示了O3:-ftree循环分布模式的另一个选项。当我将其添加到选项集时,速度仍然是30毫秒。