プロファイルに基づく最適化の理解

PGO は、コンパイルの時点での予測が困難な、繰返し実行される分岐を含むコードの最適化として最も有効に働きます。この例として、ほとんどの場合にエラー条件が偽になるようなエラーチェック処理を多数含むコードが挙げられます。このような、いわゆるほとんど実行されない (コールド) エラー処理コードを、分岐予測をほとんど誤ることのないように配置できます。頻繁に実行される (ホット) コードに対するコールドコードの挿入を最小限に抑えると、命令キャッシュの動作が改善されます。

PGO を使用すると、コンパイラーは関数のインライン化についてより的確な判断ができるようになるため、IPO の効果が上がります。

PGO フェーズ

PGO には、次の 3 つのフェーズまたはステップ、およびオプションが必要です。

下記のフローチャートは、IA-32 アーキテクチャーのコンパイルと Itanium(R) アーキテクチャーのコンパイルにおけるプロセスを示したものです。

 

 

各フェーズについての詳細は、「プロファイルに基づく最適化の例」を参照してください。

PGO を使用すべきかどうか判断する主要な要因は、最も多く使用されているコードのセクションを知ることです。プログラムに与えられるデータセットがほぼ一定で、何度実行しても同じような動作にしかならない場合、PGO でプログラム実行を最適化できます。

一方、プログラムに与えられるデータセットが毎回異なり、異なるアルゴリズムが呼び出される場合もあります。このような場合、プログラムは実行のたびに違った動作になることがあります。コードの動作が実行ごとに大きく異なる場合、PGO を使用してもあまりメリットは得られません。

プロファイル情報によって得られるメリットが、最新のプロファイルの維持に必要な労力に見合うものであるかどうか検討する必要があります。

Linux システム: x 修飾子を付けて -prof-gen オプションを使用すると、インテル(R) コンパイラーのコード・カバレッジ・ツールのようなツールで使用できる補足情報が収集されます。これらのツールを使用しない場合、-prof-gen (Linux) または /Qprof-gen (Windows) オプションを使用すると並列コンパイル時間は遅くなります。

PGO の使用モデル

次の図は、特定のツールで使用するためのファイルを準備する、一般的な PGO プロセスを示しています。