疑问:关于gcc O3优化标志

6
我有一个g++ 4.7.3编译器。我想要遵循优化标志说明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html,但遇到了以下问题:
我有一个程序,在使用-O2和-O3标志时给出不同的时间。-O2比-O3快两倍。时间为8毫秒(O2)和16毫秒(O3)。
因此,我想了解到底是什么导致了差异。在上面的链接中,我看到:
“O3更加优化。-O3开启-O2指定的所有优化,并且还开启了-finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize和-fipa-cp-clone选项。”
所以,我只需取-O2并添加所有描述的标志:
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone

时间是30毫秒。但是这组选项应该与-O3等效。为什么时间不同?我做错了什么吗?
附言:所有结果的可重复性都非常好,精度为1毫秒。
我已经使用...检查了选项。
g++ -c -Q -Ox --help=optimizers

我看到O3有一个额外的选项:-ftree-loop-distribute-patterns。但是当我将其添加到选项集中时:

-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns

速度仍然是30毫秒。


3
优化并非完美的科学。没有确切的理由认为你在做任何错误的事情(但由于你没有提供记录这些测量值的方法,因此无法知道你是否也存在错误)。 - mah
2
至少GCC优化选项不能保证性能设置的更快速。有许多因素,较小的尺寸可能会更加提高性能,例如缓存命中、分支预测等。 - πάντα ῥεῖ
1
说实话,文档并没有明确说明 -O3 是 -O2 加上一些额外的选项 - 它们可能完全做不同的事情,除了打开这些优化标志之外,至少根据你所发布的文档措辞来看。 - CmdrMoozy
1
好的,那么问题的答案在我的评论中:不同的编译器选项会产生不同的代码。有时候“更好”的优化结果却更差。 - Mats Petersson
1
@klm123:一个原因是 -O3 有时会导致更大的代码,无法适应缓存,而 -O2 的代码则可以适应。这很重要。非常重要。 - JimR
显示剩余4条评论
1个回答

7
你可以通过-Q选项让g++显示当前的活动选项:
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..

谢谢。因此,使用O3会显示一个额外选项:-ftree-loop-distribute-patterns。当我将其添加到选项集时,速度仍然为30毫秒。 - klm123

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