ガイド付き最適化のプロファイル
ガイド付き最適化のプロファイル (PGO) では、実行可能ファイル全体を最適化できます。この場合、オプティマイザーは .exe または .dll ファイルのテスト実行データを使用します。 データは、運用環境で予想されるプログラムのパフォーマンスを表します。
プロファイルガイド付き最適化は、x86、x64、または ARM64 ネイティブ ターゲットでのみ使用できます。 ガイド付き最適化のプロファイルは、共通言語ランタイムで実行する実行可能ファイルでは使用できません。 ネイティブ コードとマネージド コードが混在するアセンブリを生成した場合でも (/clr コンパイラ オプションを使用)、ネイティブ コードのみでガイド付き最適化のプロファイルを使用することはできません。 IDE でこれらのオプション セットを使用してプロジェクトのビルドを試みると、結果としてビルド エラーが発生します。
Note
プロファイル テストの実行から収集された情報は、/Ob、/Os、または/Ot を指定した場合に有効になる最適化をオーバーライドします。 詳細については、「/Ob (関数のインライン展開)」および「/Os、/Ot (実行可能ファイルのサイズの優先、実行速度の優先)」を参照してください。
アプリを最適化する手順
ガイド付き最適化のプロファイルを使用するには、次の手順に従ってアプリを最適化します。
/GL を指定して、1 つ以上のソース コード ファイルをコンパイルします。
ガイド付き最適化のプロファイルテストの実行中、/GL を指定して構築された各モジュールを調べて、実行時の動作をキャプチャすることができます。 ガイド付き最適化のプロファイル ビルド内のすべてのモジュールを、/GL を指定してコンパイルする必要はありません。 ただし、インストルメント化され、後でガイド付き最適化に使用できるのは、/GL を指定してコンパイルされたモジュールだけです。
/LTCG および /GENPROFILE または /FASTGENPROFILE を使用してリンクします。
/LTCG と /GENPROFILE または /FASTGENPROFILE の両方を使用すると、インストルメント化されたアプリを実行するときに
.pgd
ファイルが作成されます。 テスト実行用のデータを.pgd
ファイルに追加すると、次のリンクの手順 (最適化されたイメージの作成) の入力として使用できます。 /GENPROFILE を指定した場合、必要に応じて PGD="ファイル名" 引数を追加することにより、.pgd
ファイルの既定以外の名前または場所を指定できます。 /LTCG と /GENPROFILE または /FASTGENPROFILE リンカー オプションの組み合わせは、非推奨の /LTCG:PGINSTRUMENT リンカー オプションの代わりに使用します。アプリケーションのプロファイリングを行います。
プロファイルされた EXE セッションが終了するたび、またはプロファイルされた DLL がアンロードされるたびに、
appname!N.pgc
ファイルが作成されます。.pgc
ファイルには、特定のアプリケーションのテスト実行に関する情報が含まれます。 appname はアプリの名前で、N は数字で、ディレクトリ内にある他のappname!N.pgc
ファイルの数に基づいて 1 から順に増分されます。.pgc
ファイルは、最適化したいシナリオがそのテスト実行で表されない場合、削除できます。テストの実行中に、現在開かれている
.pgc
ファイルを強制的に閉じて、pgosweep ユーティリティを使用して新しい.pgc
ファイルを作成できます (たとえば、テスト シナリオの終了がアプリケーションのシャットダウンと同時ではない場合など)。アプリケーションで PGO 関数 PgoAutoSweep を直接呼び出して、呼び出しの時点のプロファイル データを
.pgc
ファイルとしてキャプチャすることもできます。 これにより、.pgc
ファイル内のキャプチャされたデータの対象となるコードをより細かく制御できるようになります。 この関数の使用方法を示す例については、PgoAutoSweep のドキュメントを参照してください。インストルメント化されたビルドを作成する場合、既定では、データ収集は、非スレッドセーフ モードで実行されます。これは高速ですが、不正確な場合があります。 /GENPROFILE または /FASTGENPROFILE に EXACT 引数を使用すると、スレッドセーフ モードでのデータ収集を指定できます。その場合、精度は高くなりますが、速度は低下します。 このオプションは、インストルメント化されたビルドを作成するときに、非推奨の PogoSafeMode 環境変数または非推奨の /POGOSAFEMODE リンカー オプションを設定する場合にも使用できます。
/LTCG と /USEPROFILE を使用してリンクします。
/LTCGと /USEPROFILE の両方のリンカー オプションを使用して、最適化されたイメージを作成します。 この手順は、
.pgd
ファイルの入力として使用します。 /USEPROFILE を指定した場合、必要に応じて PGD="ファイル名" 引数を追加することにより、.pgd
ファイルの既定以外の名前または場所を指定できます。 また、非推奨の /PGD リンカー オプションを使用して、この名前を指定することもできます。 /LTCG と /USEPROFILEの組み合わせは、非推奨の /LTCG:PGOPTIMIZE リンカー オプションおよび /LTCG:PGUPDATE リンカー オプションの代わりに使用します。
最適化された実行可能ファイルを作成し、追加のプロファイルによりさらに最適化されたイメージを作成できるかどうかを後で判断することもできます。 インストルメント化されたイメージとその .pgd
ファイルが使用可能な場合、追加のテスト実行を行い、同じ /LTCG および /USEPROFILE リンカー オプションを使用して、新しい .pgd
ファイルで最適化されたイメージを再構築できます。
Note
.pgc
および .pgd
ファイルの種類はどちらも、バイナリ ファイルです。 ソース管理システムに格納されている場合は、テキスト ファイルに対して行われる可能性のある自動変換を回避します。
PGO で実行される最適化
ガイド付き最適化のプロファイルには、次のチェックと改善が含まれます。
インライン展開 - たとえば、関数 A が関数 B を頻繁に呼び出し、関数 B が比較的小さい場合、ガイド付き最適化のプロファイルにより、関数 B が関数 A にインライン展開されます。
仮想呼び出し推理 - 仮想呼び出し、または関数ポインターからのその他の呼び出しが特定の関数を頻繁に呼び出す場合、ガイド付き最適化のプロファイルにより、頻繁に呼び出される関数に条件付きで実行される直接呼び出しを挿入し、その直接呼び出しをインライン展開できます。
レジスタ割り当て - プロファイル データに基づいた最適化により、レジスタの割り当てが改善されます。
基本ブロックの最適化 - 基本ブロックの最適化を行うと、一般的に実行され、特定のフレーム内で一時的に実行される基本ブロックを同じページ セット (ローカリティ) に配置できます。 これにより、使用されるページ数が最小限に抑えられるため、メモリのオーバーヘッドも最小限に抑えられます。
サイズ/速度の最適化 - プログラムで最も多くの実行時間が費やされる関数の速度を最適化できます。
関数のレイアウト - コールグラフおよびプロファイルされた呼び出し元/呼び出し先の動作に基づいて、同じ実行パスになる傾向のある関数が同じセクション内に配置されます。
条件付き分岐の最適化 - ガイド付き最適化のプロファイルにより、値プローブを使用して、switch ステートメント内の特定の値が他の値よりも頻繁に使用されているかどうかを確認できます。 この値は switch ステートメントから取得できます。 同じことを
if
...else
命令でも行うことができます。この場合、オプティマイザーによってif
...else
の順序付けが可能なため、if
ブロックまたはelse
ブロックのどちらがより頻繁に true になるかに応じて、いずれかのブロックが先に配置されます。実行されないコードの分離 - プロファイルの実行中に呼び出されないコードを、一連のセクションの最後に追加される特別なセクションに移動します。 これにより、頻繁に使用されるページからこのセクションが切り離されます。
EH コードの分離 - EH コードは例外的に実行されるだけなので、多くの場合、個別のセクションに移動できます。 これは、ガイド付き最適化のプロファイルで例外が例外的な条件でのみ発生すると判断できる場合に移動されます。
メモリの組み込み - 組み込みを拡張するかどうかは、頻繁に呼び出されるかどうかによって異なります。 また、組み込みは、移動またはコピーのブロック サイズに基づいて最適化することもできます。
次のステップ
ガイド付き最適化のプロファイルで使用可能なこれらの環境変数、関数、ツールの詳細については、以下を参照してください。
ガイド付き最適化のプロファイルの環境変数
これらの変数は、テスト シナリオの実行時の動作を指定するために使用されました。 これらは非推奨となり、新しいリンカー オプションに置き換えられています。 このドキュメントでは、環境変数からリンカー オプションに移行する方法を示します。
PgoAutoSweep
.pgc
ファイルのデータ キャプチャをきめ細かに制御するためにアプリに追加できる関数。
pgosweep
すべてのプロファイル データを .pgc
ファイルに書き込んで、.pgc
ファイルを閉じ、新しい .pgc
ファイルを開くコマンドライン ユーティリティ。
pgomgr
1 つ以上の .pgc
ファイルのプロファイル データを .pgd
ファイルに追加するコマンドライン ユーティリティ。
方法: 複数の PGO プロファイルを 1 つのプロファイルにマージする
pgomgr の使用例。