13

このコンパイラ機能を知っている人はいますか? GCCがそれをサポートしているようです。それはどのように機能しますか?潜在的な利益は何ですか?どの場合がいいですか?内部ループ?

(この質問は特定のものであり、一般的な最適化に関するものではありません、ありがとう)

4

4 に答える 4

12

各コードパスが取得された回数をカウントする追加のコードを配置することで機能します。2 回目にコンパイルすると、コンパイラは、以前は推測することしかできなかった、プログラムの実行について得られた知識を使用します。PGO が取り組むことができることはいくつかあります。

  • 呼び出される頻度に応じて、どの関数をインライン化するかどうかを決定します。
  • いずれかの方向に進む呼び出しの割合に基づいて、「if」ステートメントのどの分岐を予測するかについてヒントを配置する方法を決定します。
  • ループが呼び出されるたびに実行される反復回数に基づいて、ループを最適化する方法を決定します。

これらがどれだけ役立つかは、実際にテストするまでわかりません。

于 2008-09-11T20:34:45.913 に答える
6

PGO は、私が取り組んでいるプロジェクトである x264 をコンパイルするときに、約 5% の速度向上をもたらします。場合によっては、無料で速度を向上させることができます。x264 とは異なり、手書きのアセンブリで構成されていないアプリケーションでは、おそらくさらに役立ちます。

于 2008-09-16T12:14:58.430 に答える
4

ジェイソンのアドバイスは正しいです。あなたが得ようとしている最高のスピードアップは、O(n 2)アルゴリズムをどこかの内部ループに滑り込ませること、または高価な関数の外で特定の計算をキャッシュできることを「発見」することから得られます。

PGOがトリガーできるマイクロ最適化と比較すると、これらは大きな勝者です。そのレベルの最適化を実行すると、PGOが役立つ可能性があります。しかし、私たちはそれで多くの幸運を得ることができませんでした-計装のコストは、私たちのアプリケーションが使用できないほど遅くなる(数桁)ほどでした。

Intel VTuneをプロファイラーとして使用するのが好きなのは、動作を大きく変更するインストルメンテーションプロファイラーと比較して非侵襲的だからです。

于 2008-09-09T18:49:24.047 に答える
2

最適化の面白いところは、最もありそうもない場所で速度の向上が見られることです。

また、速度の問題がどこにあるかを推測するのではなく、プロファイラーが必要な理由でもあります。

プロファイラーから始めて ( gperfGCC を使用している場合)、通常の操作でアプリケーションを実行した結果を調べてみることをお勧めします。

于 2008-09-09T18:43:01.923 に答える