タイムアウトの検出と回復 (TDR)
この記事では、ドライバー開発者向けのタイムアウト検出と回復 (TDR) について説明します。 詳細については、「Windows 8 以降での TDR」を参照してください。
概要
グラフィックスで最も一般的な安定性の問題の 1 つは、エンド ユーザーのコマンドまたは操作を実際に処理しているときに、コンピューターが「ハングアップ」または完全に「フリーズ」しているように見える場合に発生します。 多くのユーザーは、数秒待ってからコンピューターを再起動しました。 コンピューターのフリーズした外観が頻繁に発生するのは、GPU が集中的なグラフィカル操作の処理 (典型的にはゲームプレイ) に忙しく、ディスプレイ画面を更新しないためです。 TDR を使用すると、オペレーティング システムは UI が応答していないことを検出できます。
次の図は TDR プロセスを示します。
OS は、コンピューターが「フリーズ」しているように見える状況を検出しようとします。 その後、OS は、フリーズした状況から動的に回復して、デスクトップの応答性を再び高め、エンド ユーザーがシステムを不必要に再起動する状況を軽減しようとします。
既定では、OS で 5 つ以上の GPU ハング (0x117) が検出され、その後の復旧が 1 分以内に発生すると、OS のバグチェック、次の (6 回目以降の) GPU ハング時にコンピューターがハングします。 詳細については、「TdrLimitCount」および「TdrLimitTime」を参照してください。
ただし、エンジンのタイムアウト (0x141) は GPU ハングカウントには影響しませんが、エンジンのタイムアウトが失敗した場合、OS によってエンジンのタイムアウトが GPU ハングに昇格する可能性があります。 エンジン タイムアウト (0x141) の場合、最大数はアダプタータイムアウト (0x117) よりも 1 だけ小さくなります。 エンジン リセット プロセスは、このようなタイムアウトの原因となっているプロセスの GPU アクセスをブロックし、システム ログ 0x142 はその事実を示します。 このように、誤動作しているプロセスは、システムのバグを調べません。
WDDM でのタイムアウト検出
DirectX グラフィックス カーネル サブシステム (Dxgkrnl.sys) の一部である GPU スケジューラは、GPU が特定のタスクの実行に許容される時間を超えて時間がかかっていることを検出します。 その後、GPU スケジューラは、この特定のタスクを優先しようとします。 プリエンプト操作には、実際の TDR タイムアウトである "wait" タイムアウトがあります。 Windows Vista 以降のオペレーティング システムの既定のタイムアウト期間は 2 秒です。 GPU が TDR タイムアウト期間内に現在のタスクを完了またはプリエンプションできない場合、OS は GPU がフリーズしていることを診断します。
タイムアウト検出の発生を防ぐために、ハードウェア ベンダーは、生産性やゲームプレイなどのエンドユーザー シナリオでグラフィックス操作 (つまり、DMA バッファーの完了) に 2 秒以上かかることを確認する必要があります。
回復の準備
GPU スケジューラは、ディスプレイ ミニポート ドライバーの DxgkDdiResetFromTimeout 関数を呼び出して、OS がタイムアウトを検出したことをドライバーに通知します。 ドライバーは、それ自体を再初期化し、GPU をリセットする必要があります。 さらに、ドライバーはメモリへのアクセスを停止する必要があり、ハードウェアにアクセスしないでください。 OS とドライバーは、回復後の診断に役立つ可能性があるハードウェアやその他の状態情報を収集します。
詳細については、「Windows 8 以降での TDR」を参照してください。
デスクトップの回復
OS はグラフィックス スタックの適切な状態をリセットします。 Dxgkrnl.sys の一部でもあるビデオ メモリ マネージャーは、ビデオ メモリからすべての割り当てを消去します。 ディスプレイ ミニポート ドライバーは、GPU ハードウェアの状態をリセットします。 グラフィックス スタックは最終的なアクションを実行し、デスクトップを応答性の高い状態に復元します。
ハング検出から回復までの間に目に見える唯一アーティファクトは画面のちらつきです。 このちらつきは、OS がグラフィックス スタックの一部をリセットすると発生し、画面が再描画されます。 ディスプレイ ミニポート ドライバーは、WDDM 1.2 以降に準拠しているときに、この再描画を排除できます (「WDDM 1.2 以降でのシームレスな状態遷移の提供」を参照してください)。
OS がデスクトップを正常に回復すると、次のアクションが完了します。
- エンド ユーザーに「ディスプレイ ドライバーが応答を停止し、回復しました」という情報メッセージを表示します。
- 上記のメッセージをイベント ビューアー アプリケーションに記録し、デバッグ レポートの形式で診断情報を収集します。 エンド ユーザーがフィードバックの提供を選択した場合、OS はオンライン クラッシュ分析 (OCA) メカニズムを通じてこのデバッグ レポートを Microsoft に返します。
一部の従来の DirectX アプリケーションは、この回復の最後に黒く表示される場合があり、エンド ユーザーはこれらのアプリケーションを再起動する必要があります。 Device Remove テクノロジを処理する適切に記述された DirectX 9Ex および DirectX 10 以降のアプリケーションは、引き続き正常に動作します。 アプリケーションは、その Microsoft Direct3D デバイスとすべてのデバイスのオブジェクトを解放してから再作成する必要があります。
スレッドの同期および TDR
詳細については、「スレッドの同期および TDR」を参照してください。
TDR のテストとデバッグ
詳細については、 「TDR のテストとデバッグ」を参照してください。