コンピュータプログラミング において、プロファイル誘導最適化(PGO、ポゴ[1]と発音されることもある)は、プロファイル指向フィードバック(PDF)[2]またはフィードバック指向最適化(FDO)[3]とも呼ばれ、ソフトウェア成果物または動作の事前分析(「プロファイリング」)を使用してプログラムの予想される実行時パフォーマンスを向上させるコンパイラ最適化手法です。
方法
ソース コードの静的プログラム分析に基づく最適化手法では、実際にプログラムを実行せずにコード パフォーマンスの改善を考慮します。動的プログラム分析は実行されません。たとえば、ループが実行される可能性のある反復回数を推測したり、形式的な制約を設定したりすることは、ループを展開するかどうかを検討するときに基本的に役立ちますが、このような事実は通常、決定的に確立するのが難しい複雑な実行時要因に依存します。通常、静的分析では情報が不完全であり、最終的な実行時の条件を概算することしかできません。
1957年にFortran自動コーディングシステムとして導入された最初の高水準コンパイラは、コードをブロックに分割し、モンテカルロIF法によるコードのシミュレーション実行を通じて各ブロックの実行頻度の表を考案しました。モンテカルロ法では、条件付き転送( -typeステートメント経由など)の結果が、プログラマーによって提供されたステートメントに応じて適切に重み付けされた乱数ジェネレータFREQUENCYによって決定されます。[4]
プロファイルに基づく最適化では、プログラマが提供する頻度情報ではなく、インストルメントされたプログラムのプロファイリング テスト実行の結果を使用して、最終的に生成されるコードを最適化します。[5] [6] [7]コンパイラは、代表的な入力セット全体にわたるプログラムのサンプル実行からプロファイル データにアクセスします。結果は、プログラムのどの領域がより頻繁に実行され、どの領域がより頻繁に実行されないかを示します。すべての最適化は、コンパイルの決定を行う際にヒューリスティックに依存することが少ないため、プロファイルに基づくフィードバックの恩恵を受けます。ただし、プロファイリング段階でプログラムに供給されるデータのサンプルは、一般的な使用シナリオを統計的に代表する必要があるという注意点があります。そうでない場合、プロファイルに基づくフィードバックは、最終ビルドの全体的なパフォーマンスを向上させるのではなく、低下させる可能性があります。
ジャストインタイム コンパイルでは、実行時情報を利用して、実行されたコードの一部を動的に再コンパイルし、より効率的なネイティブ コードを生成することができます。実行中に動的プロファイルが変更された場合、以前のネイティブ コードを最適化解除し、新しいプロファイルの情報を使用して最適化された新しいコードを生成できます。
採択
PGOを使用したFirefoxのビルドがサポートされています。[8] PGOは効果的ですが、面倒な二重コンパイルモデルのため、ソフトウェアプロジェクトでは広く採用されていません。 [9]ハードウェアパフォーマンスカウンターを使用してプロファイルを収集することにより、インストルメンテーションなしでPGOを実行することも可能です。 [ 9 ]このサンプリングベースのアプローチはオーバーヘッドがはるかに低く、特別なコンパイルも必要ありません。
HotSpot Java 仮想マシン( JVM ) は、プロファイル ガイド最適化を使用してネイティブ コードを動的に生成します。その結果、ソフトウェア バイナリは、実際に受けている負荷に合わせて最適化されます。負荷が変化すると、適応型最適化により、実行中のソフトウェアが動的に再コンパイルされ、新しい負荷に合わせて最適化されます。つまり、HotSpot JVM で実行されるすべてのソフトウェアは、プロファイル ガイド最適化を効果的に活用します。[10]
PGOは、 Google ChromeのMicrosoft Windows版に採用されています。PGOは、Chromeの64ビット版ではバージョン53から、 32ビット版ではバージョン54から有効化されました。[11]
Googleは、プロダクションプロファイルを使用してビルドをガイドし、最大10%のパフォーマンス向上をもたらすツールについて説明した 論文[12]を発表しました。
実装
PGO を実装するコンパイラの例は次のとおりです。
- Intel C++コンパイラとFortranコンパイラ[6]
- GNU コンパイラコレクションコンパイラ
- Oracle Solaris Studio (旧称 Sun Studio)
- Microsoft Visual C++コンパイラ[1] [13]
- クラン[14]
- IBM XL C/C++ [15]
- GraalVM [16]エンタープライズエディション
- .NET JITコンパイラ[17]
- 囲碁[18]
参照
参考文献
- ^ ab 「Microsoft Visual C++ チーム ブログ」。2008 年 11 月 12 日。
- ^ 「プロファイル指示フィードバック (PDF)」。XL C/C++ for AIX。2013年11 月 23 日閲覧。
- ^ Baptiste Wicht、Roberto A. Vitillo、 Dehao Chen、David Levinthal (2014 年 11 月 24 日)。「ハードウェア カウント プロファイル ガイド付き最適化」。arXiv : 1411.6361。Bibcode : 2014arXiv1411.6361W。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ JW Backus、RJ Beeber、他「Fortran自動コーディングシステム」、Western Joint Computer Conference Proceedings、1957年2月、195ページ
- ^ 「K. Pettis、R. Hansen、「プロファイル ガイド付きコード配置」、ACM SIGPLAN プログラミング言語設計および実装会議 1990」(PDF)。
- ^ ab 「Intel Fortran Compiler 10.1、Professional および Standard Editions、Mac OS X 用」。2013 年 9 月 28 日時点のオリジナルよりアーカイブ。
- ^ 「プロファイル ガイド付き最適化 (PGO) クイック リファレンス」。
- ^ プロファイルガイド最適化を使用したビルド、mozilla.org、2013 年 8 月 13 日
- ^ ab Dehao Chen (2010)、「FDO コンパイルのためのハードウェア イベント サンプルの制御」、コード生成および最適化に関する第 8 回 IEEE/ACM 国際シンポジウムの議事録、pp. 42–52。
- ^ Ivanov, Vladimir (2013 年 7 月 25 日). 「JVM JIT コンパイルの概要」 . 2016 年9 月 10 日閲覧。
- ^ Marchand, Sébastien (2016 年 10 月 31 日). 「PGO で Windows 上の Chrome を高速化する」。2016 年 11 月 1 日時点のオリジナルよりアーカイブ。2016年11 月 1 日閲覧。
- ^ Chen, Dehao; Li, David Xinliang; Moseley, Tipp (2016). 「AutoFDO: ウェアハウス規模のアプリケーションのための自動フィードバック指向最適化」。2016年国際コード生成および最適化シンポジウムの議事録。ニューヨーク、ニューヨーク、米国。pp. 12–23。doi : 10.1145 / 2854038.2854044。ISBN 978-1-4503-3778-6. S2CID 17473127。
{{cite book}}: CS1 メンテナンス: 場所が見つかりません 発行者 (リンク) - ^ 「プロファイルガイドによる最適化[VS 2019]」。2022年10月18日。
- ^ 「プロファイルガイド最適化 [Clang コンパイラ ユーザーズ マニュアル]」。
- ^ キンテロ、ディーノ;シャブロル、セバスチャン。チェン、チーフイ。ダンダパニ、ムラリ。ホロウェイ、テイラー。ジャダブ、チャンドラカント。キム・セキー;クリアン、シジョ。ラージ、バーラタ。レゼンデ、ロナン。ローデン、ビョルン。スリニバサン、ニランジャン。ウェール、リチャード。ザナッタ、ウィリアム。張志;レッドブック、IBM (2013 年 5 月 1 日)。 IBM Power Systems パフォーマンス ガイド: 実装と最適化。 IBM レッドブック。ISBN 978-0-7384-3766-8– Google ブックス経由。
- ^ 「プロファイル ガイド付き最適化によるネイティブ実行ファイルの最適化 [GraalVM ハウツー ガイド]」。
- ^ 「.NET 6 の新機能: プロファイル ガイドによる最適化」。2023 年 5 月 26 日。
- ^ 「プロファイルに基づく最適化」。
