次の方法で共有


GPUキャプチャによるフレームの分析

GPU (またはフレーム) キャプチャは、アプリケーションが行うすべての Direct3D 12 API 呼び出しを、通常は 1 つのフレームに記録します (「GPU キャプチャを実行する」を参照)。 PIX はこれらの API 呼び出しを再生して、API 呼び出しパラメータ、パイプラインとリソースの状態、リソースの内容などの情報を表示できます。

ヒント

ゲームが Direct3D 12 を無効な方法で呼び出している場合、PIX が GPU キャプチャを正常に実行できないことがあります。 PIX は、誤った使用パターンの場合でも堅牢性を保つよう最善を尽くしますが、必然的に、ガベージ イン ガベージ アウトが発生する場合があります。GPU キャプチャの取得に問題がある場合は、 D3D12 デバッグ レイヤーと GPU ベースの検証 を使用して、不適切な API 呼び出しを見つけて修正してみてください。

GPUキャプチャを取る

接続ビューから、目的のプロセスを起動するか、アタッチします(関連する GPUキャプチャ用 オプションがオンになっていることを確認します)。

必要に応じて GPU キャプチャ オプションを構成します。 キャプチャを取得するには、PIX で [GPU キャプチャを取得] ボタンをクリックするか、Alt + Print Screen キー (または F11 キー、PIX 設定で設定可能) を押します。 PIX UI にキャプチャのサムネイルが表示されます。 この時点で、必要に応じてアプリケーションを終了することができます。 サムネイルをクリックするとキャプチャが開きます。

プログラムによるキャプチャ

WinPixEventRuntime を使用してプログラムでキャプチャを行うことができます。 詳細については、ブログ投稿 プログラムによるキャプチャを参照してください。

イベントビューでAPI呼び出しを表示する

イベント ビューには、GPU キャプチャに記録されたすべての API 呼び出しが表示されます。 ゲームで使用された Direct3D 12 キュー (グラフィックス、コンピューティング、コピー) ごとに個別のリストがあります。

イベント リストは、オプションで正規表現を使用してフィルター処理できます (.*というラベルの付いたボタンをクリックします)。 デフォルトでは、後続の操作で使用するための状態を単に準備するのではなく、GPU ハードウェアの実際のレンダリング作業につながったイベントのみが表示されます。 GPU 以外のイベントを含めるには、 !Gというラベルの付いたボタンをクリックします。

API 呼び出しパラメータの完全なセットなど、各イベントの詳細情報は、 イベントの詳細 ビューで確認できます。 このビューはデフォルトで パイプライン タブに含まれていますが、メイン PIX ウィンドウの右上隅にある レイアウト デザイン モード ボタンを使用して現在のレイアウトに追加することもできます。

フレームプロファイリング

GPU キャプチャを開いたら、[概要] タブに切り替えます。ここで、キャプチャに関する基本的な詳細が表示されます。

プロファイリングを開始するには、タイミング データを収集する必要があります。 これを行うには、 イベント ビューの右上にある タイミング データの収集 ボタンをクリックするか、 タイムライン ビューの 分析を開始してタイミング データを収集するには、ここをクリックします テキストをクリックします。 これにより、キャプチャ内の GPU 作業が再生され、実行時間などの基本的なタイミング データが収集されます (アプリケーションに PixEventsがある場合は、それらで注釈が付けられます)。 完了したら、占有情報やその他の GPU 固有のカウンターなど、タイムライン レーン内にグラフ化される追加データを収集できます。

ヒント

最良の結果を得るには、PIX がタイミング データを収集している間はコンピューターを操作せず、GPU を使用している可能性のある他のアプリケーションを閉じてください。

イベント ビューでは、API 呼び出しごとに分類されたカウンターも表示できます。 カウンターを有効/無効にするには、 イベント リスト カウンター ボタン (イベント ビューの右上) をクリックします。

タイミングデータ

GPU タイミング情報には 2 つのソースがあります。

  1. パイプ開始タイムスタンプは、GPU が各作業の処理を開始するタイミングを報告します。 このデータは、適切なグラフィック ドライバーを使用して Windows 10 ビルド 14393 (またはそれ以降) を実行している場合にのみ利用できることに注意してください (ブログ投稿 要件を参照)。 パイプ開始タイムスタンプが利用できない場合、タイミング データの収集に時間がかかります。
  2. パイプの終了 (EOP) タイムスタンプは、GPU が各作業の処理を完了したことを報告します。

GPU は超並列かつ深くパイプライン化されているため、複数の作業が同時に実行され、隣接する操作が重複することがよくあります。 PIX は、ハードウェアの並列実行モデルについての洞察を提供できる 2 つの異なる方法で時間を測定します。

  1. 実行時間は、各作業のパイプの開始からパイプの終了のタイムスタンプまで測定されます。 この方法で測定すると、GPU の競合により、前の項目と並行して実行される GPU 作業項目は、個別に実行された場合よりも長く表示される可能性があります。
  2. EOP 期間は、前の項目のパイプの終了 (EOP) タイムスタンプからこの項目の EOP タイムスタンプまで測定されます。 したがって、前の項目と並行して実行される作業項目は、個別に実行された場合よりも短く表示され、前の項目と完全に並行して完了した項目は、期間がゼロとして報告されることもあります。

タイムライン ビューには、各 GPU 操作のタイミングを示す 1 つ以上のレーンが表示されます。 ゲームで使用される各キュー (グラフィックス、コンピューティング、またはコピー) の EOP 期間データを含む個別のレーンがあり、さらに、すべてのキューにわたって結合された実行期間データ (利用可能な場合) を表示する単一のレーンがあります。

PIX GPU キャプチャ タイムライン ビューのタイミング情報

ヒント

Windows 上の PIX は現在、GPU キャプチャのタイミングを分析する際に、異なるキューで GPU 作業を重複させません。 重複する非同期計算タイミング データを確認する場合は、 タイミング キャプチャ を実行することを検討してください。 GPU キャプチャでは、ゲームが非同期コンピューティングを使用してレンダリングとコンピューティング作業を同時に実行する場合、PIX は代わりに最初に一方を測定し、次にもう一方を測定します。 これにより、元のゲーム内で実行する場合と比較して、作業の各部分の報告される継続時間が短くなる可能性があります (GPU での競合が減少するため) が、合計時間は長くなります (並列化が減少するため)。

GPU カウンターと占有率

PIX は、GPU プラグインを介して IHV によって提供されるハードウェア固有のパフォーマンス カウンターを公開します。 これらのカウンターは、 イベント リスト カウンター ビュー (イベント ビューの右上にある有効化ボタン) または タイムライン カウンター ビュー (タイムライン ビューの右上にある有効化ボタン) のいずれかで有効化および収集できます。

一部の GPU では、PIX は占有情報も収集できます。 GPU は通常、繰り返されるブロックの階層として構築され、各レベルでリソースが共有される場合があります。 例えば、架空のGPUは次のように構成されるかもしれない。

GPUブロックの図の例

GPU は、シェーダー作業を波 (ワープまたは波面とも呼ばれます) に分割してシェーダーを実行します。 上の図では、青いブロックごとに 1 つの波を実行できます。 各緑のブロックは最大 4 つの波を実行できます。

すべての青色ブロックは 1 つのレジスタ セットを共有するため、ワークロードですべてのレジスタが必要な場合、緑色ブロックでは一度に 1 つの波しか実行できません。 その場合、緑のブロックの占有数は、合計占有数 4 のうち 1 になります。

いつでも、すべての緑のブロックが異なる数の波を実行している可能性があります。 上記の 4 つの緑色のブロックのうち、1 つは 3 つの波を実行し、別の 2 つの波を実行し、残りの 1 つの波を実行している可能性があります。 PIX は、すべてのデータを 1 つの値 (最大占有率、この例では 3) に要約します。

これは、シェーダー ステージごとに区切られた最大占有率を示す Occupancy レーンの PIX に表示されます。 これは、GPU が並列で実行できる作業量を示します。バーが高いほど、GPU の使用率が高くなります。

PIX GPU キャプチャ タイムライン ビューの GPU カウンター

レンダリングの問題のデバッグ

GPU キャプチャを開いた状態で、 パイプライン タブに切り替えます。このタブには、 イベント ビュー、いくつかの状態およびリソース インスペクター ビュー、および パイプライン ビューが含まれています。

イベント ビューでイベントを選択すると、さまざまなビューが表示されます。特にパイプライン ビューでは、ルート署名、パイプラインの状態、バインドされたリソースを検査できます。 パイプライン ビューは、 シェーダーデバッグへのエントリポイントでもあります。

ヒント

ほとんどの機能を実行するには、分析を開始する必要があります。 分析は、PIX がタイミング データ、状態情報、およびリソースを収集する方法です。 分析を開始する方法は多数ありますが、一般的にはアプリケーションの右上にある [分析の再生を開始] ボタンを使用するのが一般的です。 目的の GPU が選択されていることを確認します。

Direct3D 12 オブジェクト、パラメータ、状態を表示する

イベント ビューでイベントを選択すると、 状態ビューとパイプライン ビュー(パイプライン タブにあります)に、そのイベント発生時の Direct3D 状態の詳細が表示されます。 ここでは、パイプライン、シェーダー コード、入力、出力、および現在バインドされているレンダー ターゲットにバインドされているリソースを表示できます。

Direct3Dパイプラインの状態

パイプラインビューでVS出力を表示する

シェーダーのデバッグ

適切なイベントを選択し、分析を実行すると、シェーダーをデバッグできます。 パイプライン ビューでは、シェーダーのデバッグを開始する方法がいくつかあります。

  1. 目的のシェーダー ステージの下の Shader エントリを選択し、緑色の再生ボタンをクリックします。 デバッグ セッションを開始する前に、適切なシェーダー パラメーター (たとえば、頂点シェーダーの場合はインスタンス ID と頂点 ID、ピクセル シェーダーの場合はピクセル座標) が構成されていることを確認してください。
  2. リソース ビューアー (VS 出力や SRV/UAV/RTV など) を右クリックし、適切な デバッグ オプションを選択します。
  3. 適切なリソース(SRV/UAV/RTV など)を表示しているときに、 ピクセルの詳細 ビューで ピクセルのデバッグ ボタンをクリックします。

ヒント

デバッグ時にシェーダー ソースが表示されない場合は、デバッグ情報が不足している可能性があります。 アプリケーション用のシェーダー PDB を生成していること、および それらの PDB をロードするように PIX を構成していることを確認してください。

シェーダー編集 & 続行

HLSL シェーダー コードは PIX 内で直接編集できるため、変更がレンダリング結果やパフォーマンスに与える影響をすぐに確認できます。 これは、さまざまなアイデアを試す際のターンアラウンドタイムを大幅に短縮できるため、シェーダーのプロトタイプ作成と最適化に役立ちます。

シェーダーを選択したら、そのコードを自由に編集し、 「編集」>「適用」をクリックします。 他のビュー (OM RTV 0 など) も更新され、変更の効果が表示されます。 シェーダー コードを編集しながら同時にレンダー ターゲットの結果を表示するには、 パイプライン ビューの複数のインスタンスを隣り合わせてドッキングすると便利です。

何を変更したか正確にわからなくなった場合は、シェーダー コードを右クリックして、 [オリジナルとの比較]を選択します。

ヒント

Windows 上の PIX では、変更されたシェーダーをキャプチャ ファイルに保存することがまだサポートされていません。

デバッグ ビジュアライザー

レンダーターゲット ビジュアライザーは、レンダーターゲットの内容を検査するときに、 パイプライン ビューで使用できます。 デフォルトの画像ビジュアライザーでは、画像が通常どおり表示されます。 [視覚化] ビューで別の視覚化を選択することで変更できます。

ピクセル履歴

ピクセルのようなリソース (RTV、UAV、深度バッファーなど) については、 ピクセル履歴を使用して、特定のピクセルに影響を与えたすべての操作を表示できます。 これには、目的のピクセルを右クリックして [ピクセル履歴を表示] を選択するか、 [ピクセルの詳細]ビューで [ピクセル履歴] ボタンをクリックすることでアクセスできます。

注意事項とその他

  • ゲームが無効な方法で Direct3D 12 を呼び出している場合、PIX が GPU キャプチャを正常に実行できないことがあります。 PIX は、誤った使用パターンの場合でも堅牢性を保つよう最善を尽くしますが、必然的に、ガベージ イン ガベージ アウトが発生する場合があります。GPU キャプチャの取得に問題がある場合は、 D3D12 デバッグ レイヤーと GPU ベースの検証 を使用して、不適切な API 呼び出しを見つけて修正してみてください。
  • 通常、Windows GPU キャプチャは、異なる GPU ハードウェアおよびドライバー バージョン間で移植できません。 ほとんどの場合、1 台のマシンでキャプチャしたものは、同じハードウェア ファミリの他の同様の GPU でも正しく再生され、一部のゲームのキャプチャはまったく異なるメーカーの GPU でも機能する可能性がありますが、ドライバーのアップグレードのような些細なことで古いキャプチャとの互換性が失われる可能性もあります。 PIX は、GPU とドライバーが完全に同じ場合にのみ再生が成功することを保証できるため、完全に一致しない場合は分析を開始する前に PIX は警告します。 警告を無視して進む場合は自己責任でお願いします。
  • PIX は複数の GPU を限定的にサポートします。 アプリケーションが使用するアダプタの数に関係なく、常に 1 つのアダプタで GPU キャプチャを再生します。 PIX では、PIX ツールバーのドロップダウン アフォーダンスから再生アダプターを選択できます。 アプリケーションが 1 つのアダプタのみを使用した場合、PIX は再生アダプタを自動選択しようとします。
  • 非決定論的な ExecuteIndirect ワークロードの場合は、 再生時の ExecuteIndirect 引数バッファーを使用する 設定を有効にすることをおすすめします。