# PGO最適化 コンパイラ最適化の方法PGOについてまとめ。 ## PGOとは? PGOはProfile guided optimizationの略で、プロファイリングを使用してパフォーマンスを改善するコンパイラ最適化技法。 例えば、どちらかの分岐の頻度が高いならコンパイラはその結果を分岐予測に活用し命令順の最適化することができる。 他には、よく呼ばれる関数があるならインライン展開する際に利用できる。 このように、実際の使われ方を見ながらパフォーマンス改善に活用するのがPGO。 主に命令の実行回数のカウント、各分岐の使用回数、そして各関数が呼ばれた回数を記録している。 ## Sampling vs Instrumentation PGOでプロファイルする方法は大きく分けて2つ。Sampling profileとInstrumentation profile。 サンプリング手法では、軽いruntime overheadで最適化ができる。 `-fprofile-sample-use`で使用するプロファイルを指定できる。 Instrumentation手法では計装(計測や制御の対象に計測制御機器を装備することらしい)されたバージョンをビルドすることで詳細なプロファイリングをするためのデータを得られる。 `-fprofile-instr-generate`フラグをつけることでプロファイルを生成でき、`-fprofile-instr-use`でそのプロファイルを指定することで使用できる。 この2つの手法について比較すると 1. サンプリングと計装の各手法で作られたプロファイリングデータは互換不可能。現状変換ツールは存在しないらしい。 2. Instrumentationの方で生成されたプロファイルデータはCode Coverage分析と最適化に使える 3. サンプリングの方で生成されたプロファイルデータは最適化にしか使えない。 4. サンプリングのプロファイルは外部ツールで生成してLLVMが読めるフォーマットに変換してやる必要がある。 ## サンプリング手法 サンプリングでは、実物が動いているときの実行時の情報を集めている。サンプルデータは、使用されているコードエリアを解釈するためにコンパイル時に活用される。 この手法のポイントは実行時のオーバーヘッドが少ないことで、軽く最適化ができる。 ## Instrumentation手法 Instrumentedの特殊なバージョンをビルドする必要がある。 実行時に多少のオーバーヘッドを支払うことで、より詳細なサンプリングを得ることができる。 また、再現可能な結果を排出するのがポイント。何度は知らせても同じ挙動をするため。 場合によってはIstrumentationをdisableしたいケースがある。 特定のファイルについてdisableしたい場合は`-fno-profile-instr-generate`で消す。 あるいは、特定のファイルでのみ使用したい場合は`-fprofile-list`で指定する。