Verwenden von DRED zum Diagnostizieren von GPU-Fehlern

DRED steht für Device Removed Extended Data. DRED ist ein sich weiterentwickelnder Satz von Diagnosefunktionen, die Ihnen helfen, die Ursache unerwarteter Geräteentfernungsfehler zu identifizieren. Auf Hardware, die die erforderlichen Features unterstützt (wie unten definiert), liefert DRED automatische Breadcrumbs sowie GPU-Seitenfehlerberichterstattung.

Auto-Breadcrumbs

Um die Szene für automatische Breadcrumbs festzulegen, Erwähnung wir zunächst die manuelle Sorte. In Erwartung der Eventualität einer Timeouterkennung und -wiederherstellung (TDR) können Sie die ID3D12GraphicsCommandList2::WriteBufferImmediate-Methode verwenden, um Breadcrumbs im GPU-Befehlsstream zu platzieren, um den GPU-Fortschritt nachzuverfolgen.

Dies ist ein sinnvoller Ansatz, wenn Sie eine benutzerdefinierte Implementierung mit geringem Aufwand erstellen möchten. Es kann jedoch an der Vielseitigkeit einer standardisierten Lösung wie Debuggererweiterungen oder der Berichterstellung über Windows-Fehlerberichterstattung (WER) (auch bekannt als Watson) fehlen.

Daher rufen die automatischen Breadcrumbs von DRED WriteBufferImmediate auf, um Fortschrittsindikatoren im GPU-Befehlsstream zu platzieren. DRED fügt nach jedem Rendervorgang ein Breadcrumb ein. Dies bedeutet, dass jeder Vorgang, der zu GPU-Arbeit führt (z. B . Zeichnen, Senden, Kopieren, Auflösen usw.). Wenn das Gerät in der Mitte einer GPU-Workload entfernt wird, ist der DRED-Breadcrumb-Wert im Wesentlichen eine Sammlung der Rendervorgänge, die vor dem Fehler abgeschlossen wurden.

Der Breadcrumb-Verlaufsringpuffer behält bis zu 64 KiB-Vorgänge in einer bestimmten Befehlsliste bei. Wenn mehr als 65536 Vorgänge in einer Befehlsliste vorhanden sind, werden nur die letzten 64KiB-Vorgänge gespeichert. Dabei werden zuerst die ältesten Vorgänge überschrieben. Der Breadcrumb-Zählerwert zählt jedoch weiterhin bis zu UINT_MAX. LastOpIndex = (BreadcrumbCount - 1) % 65536.

DRED 1.0 war zuerst in Windows 10, Version 1809 (Windows 10 October 2018 Update) verfügbar und hat rudimentäre auto-Breadcrumbs offengelegt. Es gab jedoch keine APIs dafür, und die einzige Möglichkeit, DRED 1.0 zu aktivieren, bestand darin, den Feedback-Hub zum Erfassen einer TDR-Reproduktion (Repro) für dieLeistung und Kompatibilität von Apps-Spielen &> zu verwenden. Der Hauptzweck von DRED 1.0 bestand darin, die Ursachen für die Analyse von Spielabstürzen durch Kundenfeedback zu beheben.

Vorbehalte

  • Da eine GPU stark pipelineiert ist, gibt es keine Garantie dafür, dass der Breadcrumb-Zähler den genauen Vorgang angibt, bei dem ein Fehler aufgetreten ist. Auf einigen kachelbasierten verzögerten Rendergeräten ist es möglich, dass der Breadcrumb-Zähler eine vollständige Ressource oder eine UAV-Barriere (Unordered Access View) hinter dem tatsächlichen GPU-Fortschritt darstellt.
  • Ein Anzeigetreiber kann Befehle neu anordnen, vor der Ausführung eines Befehls vor dem Ausführen eines Befehls aus dem Ressourcenspeicher abrufen oder den zwischengespeicherten Speicher nach Abschluss eines Befehls leeren. Jede dieser Elemente kann einen GPU-Fehler verursachen. In solchen Fällen können die Auto-Breadcrumb-Zähler weniger hilfreich oder irreführend sein.

Leistung

Auto-Breadcrumbs sind zwar so konzipiert, dass sie wenig Mehraufwand haben, sind aber nicht kostenlos. Empirische Messungen zeigen einen Leistungsverlust von 2 bis 5 % bei einer typischen AAA Direct3D 12-Grafikspiel-Engine. Aus diesem Grund sind automatische Breadcrumbs standardmäßig deaktiviert.

Hardwareanforderungen

Da die Breadcrumb-Zählerwerte nach dem Entfernen des Geräts beibehalten werden müssen, muss die Ressource, die Breadcrumbs enthält, im Systemspeicher vorhanden sein und im Falle einer Geräteentfernung beibehalten werden. Dies bedeutet, dass der Anzeigetreiber D3D12_FEATURE_EXISTING_HEAPS unterstützen muss. Glücklicherweise ist dies für die meisten Direct3D 12-Anzeigetreiber auf Windows 10, Version 1903, der Fall.

Gpu-Seitenfehlerberichterstattung

Ein neues Feature für DRED 1.1 ist die DRED-GPU-Seitenfehlerberichterstattung. Ein GPU-Seitenfehler tritt häufig unter einer dieser Bedingungen auf.

  1. Eine Anwendung führt versehentlich Arbeit auf der GPU aus, die auf ein gelöschtes Objekt verweist. Dies ist einer der wichtigsten Gründe für eine unerwartete Geräteentfernung.
  2. Eine Anwendung führt versehentlich Arbeiten auf der GPU aus, die auf eine entfernte Ressource oder eine nicht residente Kachel zugreift.
  3. Ein Shader verweist auf einen nicht initialisierten oder veralteten Deskriptor.
  4. Ein Shaderindex über das Ende einer Stammbindung hinaus.

DRED versucht, einige dieser Szenarien zu beheben, indem die Namen und Typen aller vorhandenen oder kürzlich freigegebenen API-Objekte gemeldet werden, die der virtuellen Adresse (VA) des GPU-gemeldeten Seitenfehlers entsprechen.

Einschränkung

Nicht alle GPUs unterstützen Seitenfehler (obwohl viele dies tun). Einige GPUs reagieren auf Speicherfehler mit: Bit-Bucket-Schreibvorgänge; Lesen simulierter Daten (z. B. Nullen); oder einfach hängen. Leider kann in Fällen, in denen die GPU nicht sofort hängt, eine Timeouterkennung und -wiederherstellung (Timeout Detection and Recovery, TDR) später in der Pipe erfolgen, was es noch schwieriger macht, die Ursache zu finden.

Leistung

Die Direct3D 12-Runtime muss aktiv eine Auflistung vorhandener und kürzlich gelöschter API-Objekte kuratieren, die nach virtueller Adresse (VA) indiziert werden können. Dies erhöht den Systemspeicheraufwand und führt zu einem kleinen Leistungseinbußen bei der Erstellung und Zerstörung von Objekten. Aus diesem Grund ist dieses Verhalten standardmäßig deaktiviert.

Hardwareanforderungen

Eine GPU, die keine Seitenfehler unterstützt, kann weiterhin von der Auto-Breadcrumbs-Funktion profitieren.

Einrichten von DRED im Code

DRED-Einstellungen sind global für den Prozess, und Sie müssen sie vor dem Erstellen eines Direct3D 12-Geräts konfigurieren. Rufen Sie hierzu die D3D12GetDebugInterface-Funktion auf, um eine ID3D12DeviceRemovedExtendedDataSettings abzurufen.

CComPtr<ID3D12DeviceRemovedExtendedDataSettings> pDredSettings;
VERIFY_SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pDredSettings)));

// Turn on auto-breadcrumbs and page fault reporting.
pDredSettings->SetAutoBreadcrumbsEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);
pDredSettings->SetPageFaultEnablement(D3D12_DRED_ENABLEMENT_FORCED_ON);

Hinweis

Änderungen an den DRED-Einstellungen wirken sich nicht auf bereits erstellte Geräte aus. Nachfolgende Aufrufe von D3D12CreateDevice verwenden jedoch die neuesten DRED-Einstellungen.

Zugreifen auf DRED-Daten im Code

Nachdem die Geräteentfernung erkannt wurde (z. B. gibt PresentDXGI_ERROR_DEVICE_REMOVED zurück), verwenden Sie die Methoden der ID3D12DeviceRemovedExtendedData-Schnittstelle , um auf die DRED-Daten für das entfernte Gerät zuzugreifen.

Um die ID3D12DeviceRemovedExtendedData-Schnittstelle abzurufen, rufen Sie QueryInterface auf einer ID3D12Device-Schnittstelle (oder abgeleiteten) Schnittstelle auf, und übergeben Sie den Schnittstellenbezeichner (IID) von ID3D12DeviceRemovedExtendedData.

void MyDeviceRemovedHandler(ID3D12Device * pDevice)
{
    CComPtr<ID3D12DeviceRemovedExtendedData> pDred;
    VERIFY_SUCCEEDED(pDevice->QueryInterface(IID_PPV_ARGS(&pDred)));
    D3D12_DRED_AUTO_BREADCRUMBS_OUTPUT DredAutoBreadcrumbsOutput;
    D3D12_DRED_PAGE_FAULT_OUTPUT DredPageFaultOutput;
    VERIFY_SUCCEEDED(pDred->GetAutoBreadcrumbsOutput(&DredAutoBreadcrumbsOutput));
    VERIFY_SUCCEEDED(pDred->GetPageFaultAllocationOutput(&DredPageFaultOutput));
    // Custom processing of DRED data can be done here.
    // Produce telemetry...
    // Log information to console...
    // break into a debugger...
}

Debuggerzugriff auf DRED

Debugger haben über den d3d12 Zugriff auf die DRED-Daten ! D3D12DeviceRemovedExtendedDatenexport .

Für WinDbg-Benutzer finden Sie im GitHub-Repository DirectX-Debugging-Tools eine WinDBG-Erweiterung , die das Debuggen des Direct3D 12 DRED-Zustands erheblich erleichtert.

DRED-Telemetriedaten

Ihre Anwendung kann die DRED-APIs verwenden, um DRED-Features zu steuern und Telemetriedaten zu sammeln, um Probleme zu analysieren. Dadurch erhalten Sie ein viel breiteres Netz zum Abfangen dieser schwer zu reproduzierenden TDRs.

Ab Windows 10 Version 1903 werden alle gerätefernen Ereignisse im Benutzermodus an Windows-Fehlerberichterstattung (WER) gemeldet, die auch als Watson bezeichnet wird. Wenn eine bestimmte Kombination aus Anwendung, GPU und Anzeigetreiber eine ausreichende Anzahl von vom Gerät entfernten Ereignissen generiert, ist es möglich, dass DRED vorübergehend für Kunden aktiviert wird, die dieselbe Anwendung in einer ähnlichen Konfiguration starten.

Weitere Informationen zu DRED