g ++ 4.7.3コンパイラがあります。私は最適化フラグの説明http://gcc.gnu.org/onlinedocs/gcc-4.7.3/gcc/Optimize-Options.htmlに従い、次の問題を抱えようとしています:gcc O3最適化フラグに関する疑問
私は、-O2と-O3フラグで異なる時間を与えるプログラムを持っています。 -O2は-O3より2倍速い。時間はO2では8ms、O3では16msです。
私は正確に何が違うのか理解したいと思います。 -O3は、-O2で指定されたすべての最適化をオンにし、-finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-functionsをオンにします。 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は、1つの以上の追加の選択肢があることを見てきた:-ftree・ループ・配布・パターンを。しかし、私がそれを追加すると、オプションが設定されます:
-O2 -finline-functions -funswitch-loops -fpredictive-commoning -fgcse-after-reload -ftree-vectorize -fipa-cp-clone -ftree-loop-distribute-patterns
速度はまだ30msです。
最適化が完全で科学ではありません。
出力のようなものがあります。間違ったことをしていると考える明確な理由はありません(ただし、測定を行うための方法論を提供していないため、間違ったことをしていないことを知る方法はありません)。 – mah
少なくともGCCの最適化オプションは、パフォーマンスオプションが設定されている場合に、より高速なパフォーマンスを保証するものではありません。多くのことがありますが、サイズが小さいほどパフォーマンスが向上します。キャッシュヒット、分岐予測など –
o3が-O2といくつかの余分なオプションを持っていると明示的には言いません**これらの最適化フラグをオンにするだけでなく、少なくともあなたが掲示した文言によって。 – CmdrMoozy