Verwenden von DRED zum Diagnostizieren von GPU-Fehlern

DRED steht für Device Removed Extended Data (Erweiterte Daten vom Gerät entfernt). DRED ist ein sich weiterentwickelnder Satz von Diagnosefunktionen, mit denen Sie die Ursache unerwarteter Geräteentfernungsfehler identifizieren können. Auf Hardware, die die erforderlichen Features unterstützt (wie unten definiert), bietet DRED automatische Breadcrumbs sowie GPU-Seitenfehlerberichte.

Automatische Breadcrumbs

Um die Szene für auto-breadcrumbs festzulegen, lassen Sie uns zunächst die manuelle Vielfalt erwähnen. In Erwartung der Letztlichkeit einer Timeouterkennung und -wiederherstellung (Timeout Detection and Recovery, TDR)können Sie die ID3D12GraphicsCommandList2::WriteBufferImmediate-Methode verwenden, um Breadcrumbs in den GPU-Befehlsstream zu platzieren, um den GPU-Fortschritt nachzuverfolgen.

Dies ist ein sinnvoller Ansatz, wenn Sie eine benutzerdefinierte Implementierung mit geringem Mehraufwand erstellen möchten. Es fehlt jedoch möglicherweise etwas an der Flexibilität einer standardisierten Lösung, z. B. Debuggererweiterungen oder berichterstellung über Windows-Fehlerberichterstattung (WER) (auch als Watson bezeichnet).

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

Der Breadcrumbverlaufsringpuffer behält bis zu 64KiB-Vorgänge in einer bestimmten Befehlsliste bei. Wenn eine Befehlsliste mehr als 65536 Vorgänge enthält, werden nur die letzten 64KiB-Vorgänge gespeichert, — die zuerst die ältesten Vorgänge überschreiben. Der Breadcrumb-Indikatorwert zählt jedoch weiterhin bis zu UINT_MAX . Daher ist LastOpIndex = (BreadcrumbCount - 1) % 65536.

DRED 1.0 war erstmals in Windows 10, Version 1809 (Windows 10 October 2018 Update) verfügbar und hat grobe automatische Breadcrumbs verfügbar gemacht. Es gab jedoch keine APIs dafür, und die einzige Möglichkeit, DRED 1.0 zu aktivieren, bestand darin, Feedback-Hub zu verwenden, um eine TDR-Reproduktion (Reproduktion) für Apps & Games Game Performance and Compatibility zu > erfassen. Der Hauptzweck von DRED 1.0 bestand darin, die Ursachen für die Analyse von Spielabstürzen über Kundenfeedback zu unterstützen.

Vorbehalte

  • Da eine GPU stark über Pipelines verfügt, gibt es keine Garantie, dass der Breadcrumb-Indikator den genauen Vorgang angibt, bei dem ein Fehler aufgetreten ist. Tatsächlich ist es auf einigen kachelbasierten verzögerten Rendergeräten möglich, dass der Breadcrumb-Indikator eine vollständige Ressource oder ungeordnete Zugriffsansichtsbarriere (UAV) hinter dem tatsächlichen GPU-Fortschritt ist.
  • Ein Anzeigetreiber kann Befehle neu anordnen, vor dem Ausführen eines Befehls aus dem Ressourcenspeicher vorab abrufen oder zwischengespeicherten Speicher nach Abschluss eines Befehls leeren. Jede dieser Fehler kann zu einem GPU-Fehler führen. In solchen Fällen sind die Autobrocrumb-Indikatoren möglicherweise weniger hilfreich oder irreführend.

Leistung

Obwohl automatische Breadcrumbs für geringen Mehraufwand konzipiert sind, sind sie 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-Indikatorwerte nach dem Entfernen des Geräts beibehalten werden müssen, muss die Ressource, die Breadcrumbs enthält, im Systemspeicher vorhanden sein und im Falle des Entfernens des Geräts beibehalten werden. Dies bedeutet, dass der Anzeigetreiber D3D12_FEATURE_EXISTING_HEAPSunterstützen muss. Glücklicherweise ist dies bei den meisten Direct3D 12-Anzeigetreibern auf Windows 10 Version 1903 der Fall.

GPU-Seitenfehlerberichterstattung

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

  1. Eine Anwendung führt versehentlich Arbeiten auf der GPU aus, die auf ein gelöschtes Objekt verweist. Dies ist einer der Hauptgründe für eine unerwartete Entfernung des Geräts.
  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 Shader indiziert über das Ende einer Stammbindung hinaus.

DRED versucht, einige dieser Szenarien zu beheben, indem die Namen und Typen vorhandener oder kürzlich freigegebener API-Objekte gemeldet werden, die mit der virtuellen Adresse (VA) des gpu-gemeldeten Seitenfehlers übereinstimmen.

Einschränkung

Nicht alle GPUs unterstützen Seitenfehler (obwohl viele dies tun). Einige GPUs reagieren auf Speicherfehler durch: Bitbucket-Schreibvorgänge; Lesen simulierter Daten (z. B. Nullen); oder durch einfaches 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 auftreten, wodurch es noch schwieriger wird, die Grundursache zu finden.

Leistung

Die Direct3D 12-Runtime muss aktiv eine Sammlung vorhandener und kürzlich gelöschter API-Objekte indizieren, die von einer virtuellen Adresse indiziert werden können. Dies erhöht den Systemspeicheraufwand und führt zu einer geringen Leistungssteigerung bei der Objekterstellung und -zerstörung. Aus diesem Grund ist dieses Verhalten standardmäßig deaktiviert.

Hardwareanforderungen

Eine GPU, die Seitenfehler nicht unterstützt, kann weiterhin von der Funktion für automatische Breadcrumbs 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 ID3D12DeviceRemovedExtendedDataSettingsabzurufen.

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 DRED-Einstellungen haben keine Auswirkungen auf bereits erstellte Geräte. Für nachfolgende Aufrufe von D3D12CreateDevice werden jedoch die neuesten DRED-Einstellungen verwendet.

Zugreifen auf DRED-Daten im Code

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

Um die SCHNITTSTELLE ID3D12DeviceRemovedExtendedData abzurufen, rufen Sie QueryInterface für eine ID3D12Device-Schnittstelle (oder eine abgeleitete Schnittstelle) auf, und übergeben Sie dabei 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 Zugriff auf die DRED-Daten über d3d12! D3D12DeviceRemovedExtendedData-Datenexport.

DRED-Telemetrie

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 reproduzierten TDRs.

Ab Windows 10 Version 1903 werden alle Vom Benutzermodus entfernten Geräteereignisse an Windows-Fehlerberichterstattung (WER)gemeldet, auch bekannt als Watson. 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.