5

私は g++ 4.7.3 コンパイラを持っています。私は最適化フラグの説明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.htmlに従おうとしていますが、次の問題があります:

-O2 フラグと -O3 フラグで異なる時間を与えるプログラムがあります。-O2 は -O3 よりも 2 倍高速です。時間は O2 で 8ms、O3 で 16ms です。

ですから、何が違いを生むのかを正確に理解したいと思います。上記のリンクでは、次のように表示されます。

「O3 Optimize さらに。-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と同等である必要があります。なぜ時間が違うのですか?どこで何か間違ったことをしますか?

PS すべての結果は 1 ミリ秒の精度で完全に再現可能です。


を使用してオプションを確認しました

g++ -c -Q -Ox --help=optimizers

そして、O3 にはもう 1 つの追加オプション、-ftree-loop-distribute-patterns があることがわかりました。しかし、オプションセットを追加すると:

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

速度はまだ30msです。

4

1 に答える 1

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..
于 2013-10-28T21:02:10.633 に答える