c++ 最適化オプション - リンク時間の最適化を使用しない理由はありますか?




結果が変わる プログラム全体の最適化 (3)

GCC、MSVC、LLVM、おそらく他のツールチェーンはリンク時間(プログラム全体)の最適化をサポートし、コンパイル単位間の呼び出しの最適化を可能にします。

本番ソフトウェアのコンパイル時にこのオプションを有効にしない理由はありますか?


Answers

私は、 「プロダクションソフトウェア」とは、お客様に出荷して生産に行くソフトウェアを意味します。 常にコンパイラの最適化を使用しない理由は何ですか? ( Mankarseによって親切に指摘されていMankarse )は、コードをデバッグしたいという状況に適用されます(ソフトウェアはまだ開発段階にあります。

私が考えることができる唯一の有効な理由は、リンク時間の最適化微妙なバグを引き起こす可能性があることです。 カーネルのリンク時の最適化を参照してください。 あなたが出荷しようとしているソフトウェアの正確性をチェックするための適切なテストを行っていると仮定すると、デフォルトでLTOを使用しない理由はありません。 (LTOは時間の経過とともに成熟していますので、微妙なバグが少なくて済むようにしましょう)


この最近の質問は、LTOが望ましくない影響を及ぼす可能性のある別の可能性のある(しかし具体的な)ケースを提起する。問題のコードが計時用に装備されており、計装され計装ステートメントの相対的な順序を保存しようとするためにLTOは必要な順序付けを破壊する可能性があります。

私はそれが具体的だと言った。


OK、正しい答えは間違いなくCPUキャッシュで何かをしなければなりません。 しかし、キャッシュ引数を使用することは、特にデータなしでは非常に困難です。

多くの議論につながった多くの答えがありますが、それに直面しましょう:キャッシュの問題は非常に複雑であり、一次元ではありません。 彼らはデータのサイズに大きく依存するので、私の質問は不公平でした:それはキャッシュ・グラフの非常に興味深い点にあることが判明しました。

@ Mysticialの答えは、事実に頼っていると思われる唯一のものだったと思われるため、多くの人(私を含む)を説得しましたが、真実の「データポイント」は1つだけでした。

だから、私は彼のテスト(連続的な割り当てと別々の割り当てを使って)と@James 'Answerのアドバイスを組み合わせたのです。

下のグラフは、答えの大部分、特に質問と回答に対するコメントの大半が、使用された正確なシナリオとパラメータに応じて完全に間違っていると考えられることを示しています。

最初の質問はn = 100.000であったことに注意してください。 この点(偶然)は特別な動作を示します。

  1. それは、1つと2つのループのバージョン(ほぼ3の要素)の間に最大の不一致を持っています。

  2. これは、1つのループ(すなわち、連続的な割り当てを伴う)が2ループバージョンに勝つ唯一のポイントです。 (これはMysticialの答えを可能にしました。)

初期化されたデータを使用した結果:

初期化されていないデータを使用した結果(これはMysticialがテストしたものです):

これは説明が難しい:初期化されたデータ。一度割り当てられ、異なるベクトルサイズの次のテストケースごとに再利用されます。

提案

に関する低レベルのパフォーマンス関連の質問はすべて、キャッシュ関連のデータサイズの全範囲に対してMFLOPS情報を提供する必要があります。 回答を考え、特にこの情報なしで他の人と話し合うことは、みんなの時間の無駄です。





c++ c performance compilation compiler-optimization