質問

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

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

役に立ちましたか?

解決

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

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

これらのことがどれほど役立つかは、テストしてみるまではわかりません。

他のヒント

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

ジェイソンのアドバイスは正しいです。最高のスピードアップは、O(n2) アルゴリズムがどこかの内部ループに滑り込むか、高価な関数の外側で特定の計算をキャッシュできる可能性があります。

PGO がトリガーできる微細な最適化と比較すると、これらは大きな勝者です。このレベルの最適化を完了したら、PGO が役立つ可能性があります。しかし、私たちはそれをうまく活用することができませんでした。計測コストのせいで、アプリケーションが(数桁も)使い物にならないほど遅くなってしまいました。

私が Intel VTune をプロファイラーとして使用するのが好きなのは、動作を大きく変更する計測プロファイラーと比べて非侵襲的であるためです。

最適化の面白いところは、思いがけないところで速度の向上が見られることです。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top