Visual Studio でプロファイルに基づく最適化を設定する

プロファイルに基づく最適化のサポートは AGDE バージョン 22.2.71 で導入されました。

PGO 設定の場所を確認する

ソリューション エクスプローラーからプロジェクト設定を開きます。

現在のプロジェクトの Visual Studio ソリューション エクスプローラーの [プロパティ] メニュー。

図 1: Visual Studio のソリューション エクスプローラー ウィンドウ

[プラットフォーム] が Android 構成(Android-arm64-v8a など)に設定されていることを確認します。

左側のパネルで、[構成プロパティ] > [General] を選択し、[PGO] というプロパティ グループを探します。

[General] プロパティが表示され、[PGO] 設定がハイライト表示されているプロジェクト プロパティ ダイアログ

図 2: プロジェクト プロパティ ダイアログ

プロジェクトで PGO 計測ビルドを有効にする

プロジェクトに「Instrumented」という新しい構成を追加します。これは、開発中にテストに使用する構成に基づいており、この構成は従来の最適化されたビルドです(追加のデバッグ機能はコンパイラの最適化設定を維持している限り引き続き有効にできます)。

プロパティ ページ ダイアログで [構成マネージャー...] をクリックします。

プロパティ ページ ダイアログの上部に、[アクティブ ソリューション構成] プルダウンと [アクティブ ソリューション プラットフォーム] プルダウン、さらに [構成マネージャー] ボタンが表示されている

図 3: 構成マネージャー ダイアログ

構成マネージャー ダイアログで [アクティブ ソリューション構成] プルダウンを選択し、[<新規作成…>] を選択します。

構成マネージャー ダイアログで、[アクティブ ソリューション構成] プルダウンが開き、「新規作成」オプションがハイライト表示されている。

図 4: 新しいビルド構成を作成する

さらに新しい「PGO-Instrumented」構成を作成します。

[新しいソリューション構成] ダイアログ、既存の「Release」ビルド構成に基づいて新しい「PGO-Instrumented」ビルド構成を作成

図 5: [新しいソリューション構成] ダイアログ

PGO 計測モードでのビルドを有効にして、ゲームのプロファイルを生成できるようにするには、[Profile-Guided Optimization Mode] 設定のオプションのリストから [Instrumented] を選択します。

[General] が展開されて、[PGO] 設定が表示され、[Profile Guided Optimization Mode] が [Instrumented] に設定されているプロジェクト プロパティ ダイアログ。

図 6: [PGO] 設定がハイライト表示されているプロジェクト プロパティ ダイアログ

[Profile Guided Optimization Profiles] に、未加工の出力プロファイル データ ファイルを Android デバイスに書き込むフォルダのパスを入力します。通常、この値は /data/data/<package name>/cache/ のようになります。ここで、<package name> は APK の完全なパッケージ名です(例: com.google.sample.tunnel)。

この仕組みの詳細については、Clang のドキュメントをご覧ください。

PGO 計測プロファイル データをデバイスに書き込む

通常、PGO データは、プロセスの終了時に PGO 計測システムがデバイスに書き込みます。Android の場合、アプリは終了せず、常に停止されます。したがって、デフォルトの「ディスクへの書き込み」機能はトリガーされず、アプリが PGO データを明示的に書き込む必要があります。

アプリは __llvm_profile_write_file を明示的に呼び出して、プロファイル データを書き出す必要があります。このシンボルは、PGO 計測ビルドをビルドしている場合にのみ使用できるため、__llvm_profile_write_file を前方宣言する際に次のパターンを使用することをおすすめします。

#ifdef PGO_INSTRUMENT
extern "C" int __llvm_profile_write_file(void);
#else
extern "C" int __llvm_profile_write_file(void) { return 0; }
#endif

この関数を呼び出すと、先ほど指定したフォルダにプロファイル データが書き込まれます。

プロファイル実行を完了する

プロファイルを生成するには、PGO 計測でビルドされた APK をターゲット デバイスで実行します。十分にコードを実行してから、__llvm_profile_write_file 関数の呼び出しをトリガーすると、アプリがプロファイル データをストレージに書き込みます。

この時点で、コンパイラが使用するプロファイルをデバイスからコピーします。

コンパイラが使用するプロファイル データを準備する

単独で使用する場合、Android NDK に Clang/LLVM の一部として同梱されているコマンドライン ツール llvm-profdata を使用して、コンパイラがプロファイルに基づくビルドの最適化を行う際に使用するプロファイル データ ファイルを準備します。

この手順は、AGDE が自動的に行います。具体的には、プロジェクトに追加されたプロファイル データ ファイルをすべてマージし、プロジェクト プロパティ ページの [Profile-Guided Optimization Mode] 設定を [Optimized] に設定します。

プロファイルに基づく最適化を有効にしてプロジェクトをビルドする

プロファイルをキャプチャしてプロジェクトに追加したので、コンパイラはそのデータを使用してビルドの最適化を微調整できるようになりました。

PGO 最適化ビルドの新しいプロジェクト構成を作成して、必要なときにだけ、このモードでビルドするようにします。

[Release] ビルドに基づいたビルド構成を作成する [新しいソリューション構成] ダイアログ(今回は新しいビルド構成名として「PGO-Optimized」を使用)。

図 7: 新しい PGO-Optimized ビルド構成を作成する

プロジェクト プロパティ ページの [Profile-Guided Optimization Mode] 設定を [Optimized] に設定します。

[General] が展開されて、[PGO] 設定が表示され、[Profile Guided Optimization] モードが [Optimized] に設定されているプロジェクト プロパティ ダイアログ

図 8: PGO 最適化モードを [Optimized] に設定する

デバイスからファイルをコピーして、ソリューション エクスプローラーでプロジェクトに追加します。これらのプロファイル データ ファイルは、次回 PGO 最適化構成をビルドする際にコンパイラが取得し、コードの最適化方法を調整するために使用します。

ADB を使用してデバイスから、または Android Device Explorer を使用して、プロファイル データ ファイルをプロジェクトにコピーできます。

AGDE の外部でプロファイルに基づく最適化を使用する

AGDE でサポートされていないビルドシステムを使用している場合は、ビルドを直接編集する必要があります。必要なスイッチ(-fprofile-generate-fprofile-use)については、Clang のドキュメントをご覧ください。

ゲームにミドルウェア エンジンを使用している場合は、エンジンのドキュメントを参照し、PGO を有効にする方法を確認してください(サポートされている場合)。