关于gcc O3优化标志的疑问

时间:2013-10-28 20:31:18

标签: c++ optimization options

我有g ++ 4.7.3编译器。我正在尝试按照优化标记说明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.html进行操作,并遇到下一个问题:

我有一个程序,它给出了-O2和-O3标志的不同时间。 -O2比-O3快两倍。 O2时间为8ms,O3时间为16ms。

所以我想了解到底有什么不同。在上面的链接中,我看到:

“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

时间是30ms。 但是这组选项应该等效到-O3。为什么时间不同?我在哪里做错了什么?

P.S。所有结果均可完美再现,精度为1ms。


我已经使用

检查了选项
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

速度仍然是30ms。

1 个答案:

答案 0 :(得分:7)

您可以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..