2016-04-15 20 views
0

私はこのスレッドを見て、私は同じ質問を持っていましたが、この1は本当に答えていない:、GCC standard optimizations behaviorGCC handpicking最適化

私はパフォーマンスの信じられないほどのブーストを引き起こしているまさにフラッグを把握しようとしていますO1で私はまず、g++ -O1 -Q --help=optimizersを使ってどのフラグが設定されているのかを確認し、有効なフラグをそれぞれ取得し、それらをg ++でコンパイルするために使用しました。しかし、出力結果は異なっていました(バイナリ自体は異なるサイズのものでした)。

g ++の最適化をどのように手作業で行うのですか?これはできませんか?

+0

パフォーマンスが大幅に向上している場合、オプティマイザがその仕事をするのではなく、なぜそれらを手作りしたいのですか? –

+2

-O *に含まれるすべての最適化がスタンドアロンスイッチとして利用できるわけではありません。 – SergeyA

+0

@MattJordanパフォーマンスの向上の原因を突き止めたいと思っています。私はそれがキャッシュの使用が良くなった結果だと強く思っていますが、私は簡単に問題の規模を拡大することはできません。なぜなら、なぜランタイムに最も影響を与える最適化を見つけるのか、プログラムのローカリティが向上します。そうであれば、その改善は帯域幅に束縛された結果であることは、いくらか明らかです。そうでなければ、それは別のものですが、どの最適化がそれを引き起こしたかを知ることは助けになります。 –

答えて

3

すべての最適化が個別のフラグを持っているわけではないため、-O1や一般的な最適化オプション(-Os-O2など)と同じコードが生成されるわけではありません。また、-O0(デフォルト)を使用すると、最適化が一般に有効になっていないとスキップされるパスが必要なので、多くの特定の最適化オプションが無視されると思います。

パフォーマンスの向上を絞り込むには、-O1を使用して、最適化を選択的に無効にすることができます。例:

g++ -O1 -fno-peephole -fno-tree-cselim -fno-var-tracking ... 

このようにしてもまだ幸運はないかもしれません。複数の最適化を組み合わせてパフォーマンスが向上している可能性があります。また、特定のフラグによってカバーされていない最適化の結果でもあります。

また、キャッシュのローカリティが向上したことで、「パフォーマンスが大幅に向上しました」という疑問も生じました。もしそうならば、特に-O1に偶然の可能性があります。実際には何の効果もなく、常に同じ値が計算されたり、未定義のビヘイビアが呼び出されたりしたため、GCCはコードの塊を取り除くことができたため、大きなパフォーマンスが向上します。

関連する問題