Share via


GPU プリエンプション

Windows 8 以降では、新しい GPU プリエンプション モデルが使用できるようになりました。 このモデルでは、オペレーティング システムは、GPU ダイレクト メモリ アクセス (DMA) パケットのプリエンプションを無効にすることはできなくなり、タイムアウト検出と復旧 (TDR) プロセスが開始される前にプリエンプション要求が GPU に送信されることを保証します。

要件 説明
Windows Display Driver Model (WDDM) の最小バージョン 1.2
Windows の最小バージョン 8
ドライバーの実装 - 完全なグラフィックスとレンダリングのみ 必須
WHLK の要件とテスト Device.Graphics...プリエンプション テストDevice.Graphics...FlipOnVSyncMmIo

実行時間の長いパケットを正常に割り込むことができない場合、デスクトップ ウィンドウ マネージャー (DWM) で必要な作業など、優先度の高い GPU 作業が遅れる可能性があり、ウィンドウの切り替えやアニメーション中に障害が発生する可能性があります。 また、プリエンプション処理できない長時間実行される GPU パケットにより、TDR プロセスで GPU が繰り返しリセットされ、最終的にシステム バグチェックが発生する可能性があります。

すべての WDDM 1.2 ディスプレイ ミニポート ドライバーは、Windows 8 プリエンプション モデルをサポートする必要があります。 ただし、動作中、WDDM 1.2 ドライバーは、Windows 8 プリエンプション モデルを拒否し、Microsoft DirectX グラフィックス カーネル サブシステム スケジューラによって Windows 7 の動作を保持することもできます。

GPU プリエンプション デバイス ドライバー インターフェイス (DDI)

ディスプレイ ミニポート ドライバーでは、次のデバイス ドライバー インターフェイス (DDI) を使用して、Windows 8 GPU プリエンプション モデルを実装できます。

ディスプレイ ミニポート ドライバーの実装

ディスプレイ ミニポート ドライバーに Windows 8 GPU プリエンプション モデルを実装するには、次の一般的な手順に従います。

  1. DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8を持つヘッダーに対してドライバーをコンパイルします。
  2. DXGK_VIDSCHCAPS構造体の PreemptionAware メンバーと MultiEngineAware メンバーを 1 に設定して、Windows 8 GPU プリエンプション モデルのサポートを宣言します。 Windows 7 プリエンプション モデルをサポートするには、PreemptionAware を 0 に設定します。
  3. D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITYおよびD3DKMDT_COMPUTE_PREEMPTION_GRANULARITY列挙型から定数値を受け取る、D3DKMDT_PREEMPTION_CAPS構造体でサポートされるプリエンプション粒度レベルを指定します。
  4. ハードウェアで遅延コンテキスト切り替えがサポートされている場合は、長さ 0 のバッファーを DxgkDdiSubmitCommand 関数に送信し、pSubmitCommand->Flags->ContextSwitch に設定します。 DXGK_SUBMITCOMMANDFLAGS構造体の ContextSwitch メンバーの下のディスカッションに注意してください。
  5. DxgkCbCreateContextAllocation 関数を呼び出 して、GPU コンテキストの割り当てとデバイス コンテキストの 割り当てを設定します。 関数の「解説」に記載されている具体的な手順と制限に注意してください。
  6. DxgkCbDestroyContextAllocation 関数を呼び出して、DxgkCbCreateContextAllocation で作成された GPU コンテキスト割り当てとデバイス コンテキスト割り当てを破棄します。
  7. DxgkDdiBuildPagingBuffer 関数の呼び出しに応答して DMA バッファーを準備する場合は、DXGKARG_BUILDPAGINGBUFFER構造体内の InitContextResource 内部構造体を入力してコンテキスト リソースを初期化します。 コンテキスト リソースが削除または再配置された場合、ビデオ メモリ マネージャーはコンテキスト リソースの内容を保持します。
  8. ドライバーは、次の垂直同期でメモリ マップ I/O フリップをサポートする必要があります。Windows 8では、GPU スケジューラは、フリップが保留中であっても、ハードウェアをプリエンプションしようとします。 そのため、破損やレンダリングの成果物を防ぐために、ドライバーはメモリ マップ I/O フリップ モデルをサポートし、DXGK_FLIPCAPS構造体の FlipOnVSyncMmIo メンバーを 1 に設定し、FlipOnVSyncMmIo で説明されている操作をサポートする必要があります。

実装におけるメモリー・マッピングの考慮事項

次のガイダンスに従って、Windows 8 GPU プリエンプション モデルをサポートし、高品質のユーザー エクスペリエンスを提供する堅牢なドライバーを作成します。

  • DirectX グラフィックス カーネル (Dxgkrnl) スケジューラがプリエンプション コマンドを送信するときに、GPU から DMA バッファーのプリエンプションを要求します。 中 DMA バッファーのプリエンプションの粒度が細かいハードウェア デバイスは、より優れたカスタマー エクスペリエンスを生み出すはずです。
  • ページング コマンド フェンス ID の再利用を許可する: プリエンプション要求によってハードウェア キューにページング コマンドが割り込まれた場合、Dxgkrnl スケジューラは、最初に使用されていたのと同じフェンス ID を持つプリエンプションされたページング コマンドを再送信し、ページング コマンドは、そのエンジン上の他のコマンドの前にスケジュールされます。 ページング以外のコマンドは、新しく割り当てられたフェンス ID で再送信されます。
  • 分割 DMA バッファーのパッチの場所の一覧を指定します。「DMA バッファーの分割」を参照してください
  • バインド リーク検出と呼ばれる検証モードを使用できます。このモードでは、パッチの場所の一覧を確認し、バインドを解除しないパケットや、分割された各パケットの割り当てを再プログラムしないパケットを拒否できます。 一部のハードウェアは仮想アドレスをサポートしているため、この検証を不要にする追加の水準器の間接参照が可能です。 このような場合、ドライバーが検証モードをオプトアウトすることを示すには、DXGK_VIDSCHCAPS構造体のNoDmaPatching メンバーを 1 に設定します。
  • Windows 7 では、Dxgkrnl scheduler は、同じレンダリング コマンドに対応するすべての分割 DMA パケットが、別のレンダリング コンテキストに切り替えることなく順番に実行されることを保証します。 Windows 8プリエンプション モデルでは、scheduler は、同じレンダリング コマンドに対応する 2 つの分割パケット間の異なるコンテキストからレンダリング パケットを実行できます。 その結果、プリエンプションを認識しているドライバーは、通常の完全なパケット送信と同じ方法で分割/部分的な DMA パケット送信を処理する必要があります。 特に、GPU の状態は、このような送信の境界で保存または復元する必要があります。
  • プリエンプション対応ドライバーは、リンクされたディスプレイ アダプター (LDA) モードで複数のアダプターにブロードキャストするときに、分割 DMA バッファーの内容を変更しないでください。このモードでは、複数の物理 GPU がリンクされ、単一の高速な仮想 GPU が形成されます。 これは、Windows 8 プリエンプション モデルでは、Dxgkrnl スケジューラは、別のコンテキストに切り替えずに、分割パケット シーケンスの同期実行を保証しなくなったためです。 分割 DMA パケットの内容を変更したドライバーは、パケットが別のエンジンで実行された場合、DMA バッファー データの同じコピーで動作するため、パケットのデータの整合性が損なわれます。
  • Windows 8 GPU プリエンプション モデルでは、Dxgkrnl スケジューラによって、"送信時のシグナル" 同期プリミティブが関連付けられているパケットのプリエンプションが有効になります。 デバイスがハードウェア ベースの待機状態と共に "送信時のシグナル" 同期プリミティブを使用する場合は、待機条件が満たされる前に待機命令をプリエンプションする機能をサポートする必要があります。

ハードウェア認定の要件

ハードウェア デバイスがこの機能を実装するときに満たす必要がある要件については、Device.Graphics の関連 WHCK ドキュメント参照してください。プリエンプション テストDevice.Graphics...FlipOnVSyncMmIo

Windows 8 で追加された機能の確認については、「WDDM 1.2 の機能」を参照してください。