タイミングキャプチャでCPUとGPUをプロファイルする
タイミング キャプチャは、CPU と GPU の両方のプロファイリング データを 1 つのキャプチャに結合し、アプリケーションを詳細に分析します。 このデータはゲームの実行中に最小限のオーバーヘッドで収集されるため、CPU コア間で作業がどのように分散されているか、CPU によって送信されて GPU によって実行されるグラフィック作業間の遅延、ファイル IO アクセスとメモリ割り当てがいつ発生するかなどを確認できます。 これには、 PixEvents 経由のアプリケーション定義のイベント、マーカー、カウンターも含まれます。
タイミングキャプチャの取得
接続 ビューから、目的のプロセスを起動するか、アタッチします(関連する GPUキャプチャ用 オプションがオフになっていることを確認します)。
必要に応じてタイミング キャプチャ オプションを設定し、準備ができたら [タイミング キャプチャの開始] ボタンをクリックして記録を開始します。 記録を終了するには、 「タイミング キャプチャを停止」 (またはアプリを終了) をクリックします。 短い処理期間の後、キャプチャが開きます。
タイミングキャプチャオプション
名前 | 説明 |
---|---|
取り込みモード | シーケンシャル: キャプチャの開始から停止までの間のイベント全体を記録します。 循環: イベントを固定サイズのバッファに記録し、最後の n 秒間のデータのみを保存します。 詳細については、この Circular Timing Captures ブログ投稿 を参照してください。 |
CPU のサンプル | サンプル プロファイリングを実行して、CPU が時間を費やしている場所を確認します。 サンプルレートは設定可能です。 |
コンテキストスイッチのコールスタック | スレッドがコンテキストを切り替えるときにコールスタックを収集します。 |
ファイルアクセス | ファイルアクセスを追跡します。 |
GPUタイミング | GPU 作業の開始と停止に関する詳細なタイミング情報を収集します。 |
GPU リソース | ヒープやリソースなどの D3D オブジェクトに関する 詳細な 情報を収集します。 また、GPU の常駐、降格された割り当て、割り当ての移行も追跡します。 |
VirtualAlloc/VirtualFree イベント | VirtualAlloc 関数と VirtualFree 関数を介して行われた割り当てを追跡します。 |
HeapAlloc/HeapFree イベント | HeapAlloc 関数と HeapFree 関数を介して行われた割り当てを追跡します。 |
カスタムアロケータイベント | PixEventsで計測されたカスタム メモリ アロケータによって行われた割り当てを追跡します。 |
ページフォールトイベント | キャプチャの実行中に発生するページ フォールトに関するデータを収集します。 ページ フォールトはタイムラインと要素の詳細ビューに表示されます。 |
タイトル以外のプロセスのコールスタック | タイトル プロセス (起動されたプロセスまたはアタッチされたプロセス) 以外のプロセスのコールスタックをキャプチャします。 |
カーネルイメージ情報 | カーネルバイナリのコールスタックを表示するために必要な情報を収集します。 |
.wpix ファイルの代わりに .etl ファイルを生成します | 生成された .etl ファイルは、後で [ファイル] | [変換] メニューで .wpix ファイルに変換できます。 このオプションは、PIX チームにバグの再現を報告する場合や、ETW データを処理するための他のツールがある場合に役立ちます。 |
プログラムによるキャプチャ
WinPixEventRuntime を使用してプログラムでキャプチャを行うことができます。 詳細については、ブログ投稿 プログラムによるキャプチャを参照してください。
CPU プロファイリング
キャプチャを実行するときに CPU サンプル オプションを有効にすると、アプリケーションのホット パス内の遅い関数を特定したり、スレッド待機やコンテキスト スイッチに関連する問題を見つけたりするのに役立ちます。 また、適切なキャプチャ オプションを有効にすると、さまざまな種類の割り当てを追跡することもできます。
これらの機能について詳しく説明したブログ投稿がいくつかあります。
- タイミングキャプチャの概要
- タイミングキャプチャでの CPU サンプルの分析に関するブログ投稿。
- タイミングキャプチャにおけるストールとコンテキストスイッチの分析
- タイミングキャプチャにおけるメモリ使用量とパフォーマンスの分析
- 独自のカスタム アロケータをインストルメント化することもできます。 詳細については、ブログ投稿「タイトルのカスタム アロケータから行われた割り当てに対するメモリ プロファイリングのサポート」を参照してください。
GPU プロファイル
アプリで断続的なフレームドロップが発生していますか? VRAMの使用量が多すぎますか? システム メモリと VRAM 間で予期しないページング操作が発生しましたか? PIX の GPU プロファイリング機能は、このような一般的で分析が難しい状況の原因を突き止めるのに役立ちます。
GPUタイミング
GPU 作業のタイミング データを収集するには、キャプチャを実行するときに GPU タイミング オプションを有効にします。 タイムライン ビューでは、各GPUキューのレーンを見つけることができます(レーンセレクターでは、 APIキューのピン留め 構成を使用して、それらのレーンをすばやくピン留めできます)。 これらのレーンにはいくつかのサブレーンが含まれます。
- PIX イベント (GPU): GPU 作業の階層的なアプリケーション定義領域。 PixEventsを参照してください。
- GPU 実行: 実行は、ExecuteCommandLists 経由など、API レベルでの作業の送信に対応します。
- GPU 作業: GPU 上で発生する作業。たとえば、描画、ディスパッチ、コピーなど。
- PIX マーカー (GPU): アプリケーション定義のマーカー。 PixEventsを参照してください。
レーン内のイベントを選択すると、そのイベントが発生した CPU 上の場所を示す矢印が表示されます。 レーン オプション メニュー (レーン名の横にある歯車アイコン) にもさまざまな視覚化オプションがあります。 特に注目すべきは、スペースを節約するために、 「イベントをフラット化」 および 「GPU 作業をフラット化」 オプションがデフォルトで有効になっていることですが、特定のフレームにダイブするときに、完全な PIX イベント階層または GPU 作業の並列化を確認する必要がある場合があります。
このデータは、 [表示する項目] ドロップダウンで関連するカテゴリを選択すると、 [範囲の詳細] ビューから表形式でも利用できます。
プレゼンテーションと表示情報
Vsync は別の モニター レーンにマーカーとして表示され、 その他 カテゴリ内の 範囲の詳細 ビューで確認できます。
GPU メモリと Direct3D オブジェクト
Direct3D オブジェクトに関する情報を収集するには、キャプチャを実行するときに GPU リソース オプションを有効にします。 全体的なメモリ使用量をグラフ化するには、 メトリック ビューでいくつかのカウンターを見つけることができます。 さまざまな予算ラインを構成することで、メモリ使用量の目標を達成しているかどうかをすぐに把握できます。 関心領域が見つかったら、時間範囲を選択し、右クリックのコンテキスト メニューで [タイムライン ビューをズームして範囲を選択] をクリックし、 [選択した時間範囲] ドロップダウンを [表示範囲を選択] に設定して、さらに調査することができます。
ヒント
線のスタイル を 四角形 に設定すると、割り当てが行われる場所がわかりやすくなります。
範囲の詳細 ビューでは、ヒープ、リソース、パイプライン状態オブジェクトなど、Direct3D API オブジェクトに関するさまざまな情報を表示できます。 疑わしいオブジェクトを簡単に特定できるように、その情報は割り当ておよび解放された時期ごとにグループ化されます。
住居
居住地関連の問題については、 範囲の詳細ビューの 居住地操作、 降格された割り当て、および 割り当ての移行 カテゴリを参照してください。 これらのマーカーとイベントは、 レジデンス オペレーション レーンにも表示されます。
常駐操作には、MakeResident 操作と Evict 操作 (Direct3D 12 API 経由で開始) のほか、PageIn 操作と PageOut 操作が含まれます (詳細については、 Residencyを参照してください)。 降格された割り当ては、グラフィックス カーネル (DXGK) が GPU の VRAM にリソースを割り当てることができない場合 (メモリ不足または断片化のため) に発生します。 その場合、DXGK は降格された割り当てに対しても割り当ての移行を実行しようとします。 これらの移行は GPU を一時停止する必要があるため、コストのかかる操作であることに注意してください。
GPU 使用率とプレゼンテーション カウンター
キャプチャを実行するときに、 Capture SysMon カウンター オプションを有効にして、システム モニター (SysMon とも呼ばれます) に存在するカウンター (GPU パフォーマンスに関連するさまざまなカウンターを含む) を収集します。 特に、以下のカウンターがあります:
- ターゲット プロセスとすべてのプロセスの両方について、GPU エンジン別に分類された GPU 使用率。
- プレゼンテーション データ (1 秒あたりのフレーム数 (およびその逆数、ミリ秒単位の MsBetweenPresents) や MsUntilRenderComplete (現在の開始から GPU 作業の完了までの時間) など)。
- ローカルおよび非ローカル メモリの使用量、所在地、予算などの GPU メモリ情報。
ヒント
説明については、 システム モニター のカウンター名にマウスを移動してください。
これらのカウンターは、タイミング キャプチャを取得している間、または システム モニター ビューの カウンター収集の開始 ボタンをクリックすることによって、リアルタイムで監視することもできます。 グラフを並べ替えたり、カウンターを動的に追加したり削除したりできます。 使用可能なすべてのカウンターを表示するには、 カウンター をクリックします。
Win32 ファイル I/O
ブログ投稿「タイミング キャプチャでの Win32 ファイル IO パフォーマンスの分析」を参照してください。
その他の分析機能
- 統計的な比較は、比較対象のポイント セットに対して、PIX イベント階層のどの部分が統計的に異なる期間を持つかを判断するのに役立ちます。 詳細については、ブログ記事「タイミング キャプチャの統計比較機能」を参照してください。
- パフォーマンス バジェットを設定すると、キャプチャの問題のある領域をすばやく特定できるようになります。 詳細については、ブログ投稿「タイミング キャプチャ メトリック ビューでパフォーマンス バジェットを使用する」を参照してください。
- ブログ投稿「タイミング キャプチャにおけるクリティカル パス分析」も参照してください。