プロファイルに基づく最適化の方法

PGO は、コンパイルの時点での予測が困難な、繰返し実行される分岐を含むコードの最適化として最も有効に働きます。例えば、エラーチェック処理が多く含まれているのに、実際にエラー判定を下してみるとほとんどの場合エラー条件に合致しないコードがこれに相当します。これにより分岐予測をほとんど誤ることのない、いわゆる "コールド (cold)" なエラー処理コードを配置できます。"ホット" コードと "コールド" コードが交互に配置される状況をなくせば、命令キャッシュの動作が改善されます。例えば、PGO を使用するとコンパイラは関数のインライン化について的確な判断が下せる場合が多くなり、その結果、プロシージャ間の最適化の効率が向上します。

PGO フェーズ

PGO を行うには次の 3 つのフェーズが必要です:

PGO の適否を決める手掛かりの 1 つは、コードのどの部分に処理が集中しているかを知ることです。プログラムに与えられるデータセットがいつもほとんど変わらず、何度実行しても同じような動作にしかならない場合は、PGO によってプログラム実行が最適化されます。一方、プログラムに与えられるデータセットが毎回異なり、そのたびに種々のアルゴリズムが呼び出されることもあります。このような場合、プログラムは実行のたびに違った動作になるときがあります。

実行するたびに毎回動作が大きく異なるようなコードに対しては、PGO はそれほど有効ではありません。プロファイルを最新状態に保つ作業をするだけの価値が、そのプロファイル情報から得られるかどうかを常に考える必要があります。

x 修飾子を付けて -prof_gen[x] を使用すると、インテル® C++ コンパイラのコード・カバレッジ・ツールのような、コード・カバレッジ・ツールを使用して追加のソースの位置を収集することができます。これらのツールがないと、-prof_genx はよりよい最適化を行うことができず、並列コンパイル時間が遅くなります。