2

-O1最適化なしではなく、コンパイルした方がはるかに優れた小さなプログラムがあります。コンパイラによって行われた最適化がこの高速化につながっていることを知りたいです。

私がやろうと思ったのは-O1、(man ページと の両方から取得した) と同等の最適化フラグのリストを取得gcc -Q -vし、そのリストを取り出して、パフォーマンスがどのように変化するかを確認することです。

私が見つけたのは、最適化のリスト全体を含めても、-O1 最適化されたものと同じように機能するプログラムが得られないということです。

言い換えると

gcc -O0 -fcprop-registers -fdefer-pop -fforward-propagate -fguess-branch-probability \
    -fif-conversion -fif-conversion2 -finline -fipa-pure-const -fipa-reference \
    -fmerge-constants -fsplit-wide-types -ftoplevel-reorder -ftree-ccp -ftree-ch \
    -ftree-copy-prop -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse \
    -ftree-fre -ftree-sink -ftree-sra -ftree-ter myprogram.c

と同じではありません

gcc -O1 myprogram.c

gcc バージョン 4.5.3 を使用しています

マニュアルに-O1関連付けられている最適化フラグのリストに含まれていないものは他にありますか?-O1

4

2 に答える 2

2

生成されたアセンブラを-Sオプションで確認してみてはいかがでしょうか。

「my_program.c」も使用した2つの実験から、提案されたアルゴリズムの長いリストに関係なく、-O0オプションはすべての最適化を無効にしているようです。

于 2012-10-07T13:28:24.240 に答える
1

これは予想されるものであり、バグではありません: https://gcc.gnu.org/wiki/FAQ#optimization-options

マニュアルの -O1 に関連付けられている最適化フラグのリストに含まれていない、 -O1 が行うことは他にありますか?

はい、最適化をオンにします。個々の-fxxxフラグを指定しても、そうはなりません。

-O1-O2-O3-Ofast、または-Og最適化オプションのいずれかを使用しない(および を使用しない-O0) 場合、最適化はまったく行われないため、アクティブな最適化パスを調整ても何も起こりません。

-O1どの最適化パスが違いを生むかを見つけるには、違いを生む最適化パスが見つかるまで、個々の最適化パスをオンにしてから無効にします。

つまり、次の代わりに:

gcc -fxxx -fyyy -fzzz ...

使用する:

gcc -O1 -fno-xxx -fno-yyy -fno-zzz ...
于 2018-02-12T12:48:38.947 に答える