TDR in Windows 8 und höher

Ab Windows 8 ermöglicht das Verhalten der GPU-Timeouterkennung und -wiederherstellung (TDR) das Zurücksetzen von Teilen einzelner physischer Adapter, anstatt eine adapterweite Zurücksetzung zu erfordern.

Weitere Informationen zur TDR finden Sie unter Timeouterkennung und -wiederherstellung (TDR).

Anforderungen

  • WDDM-Mindestversion: 1.2
  • Windows-Mindestversion: 8
  • Treiberimplementierung – Nur vollständige Grafiken und Rendern: Obligatorisch
  • WHLK-Anforderungen und -Tests: Device.Graphics... TDRResiliency

TDR-Gerätetreiberschnittstelle (DDI)

Um diese Verhaltensänderung zu berücksichtigen, implementieren Display-Miniporttreiber die folgenden Funktionen:

Ein Display-Miniporttreiber gibt die Unterstützung für diese Funktionen an, indem die DXGK_DRIVERCAPS festgelegt wird. SupportPerEngineTDR-Member , in diesem Fall muss es alle oben genannten Funktionen implementieren.

Hinweis

Ein Treiber, der diese Funktionen unterstützt, muss auch die Synchronisierung der Stufe Null für die DxgkDdiCollectDbgInfo-Funktion unterstützen. Dadurch soll sichergestellt werden, dass Miniportaufrufe der Ebene null, die nicht vom Zurücksetzungsvorgang betroffen sind, fortgesetzt werden können. Siehe Hinweise zu DxgkDdiCollectDbgInfo.

Die folgenden Strukturen sind den oben genannten Funktionen zugeordnet:

Nodes

Wie in den oben genannten TDR-Funktionen verwendet, ist ein Knoten einer von mehreren Teilen eines einzelnen physischen Adapters, der unabhängig geplant werden kann. Beispielsweise können ein 3D-Knoten, ein Videodecodierungsknoten und ein Kopierknoten alle im gleichen physischen Adapter vorhanden sein, und jedem kann im DXGKARG_QUERYDEPENDENTENGINEGROUP ein separater Knoten-Ordnungswert zugewiesen werden. NodeOrdinal-Member in einem Aufruf von DxgkDdiQueryDependentEngineGroup.

Die Anzahl der Knoten im physischen Adapter wird vom Anzeigeminiporttreiber im NbAsymetricProcessingNodes-Member von DXGK_DRIVERCAPS gemeldet. GpuEngineTopology.

Der Ordnungswert des Knotens wird im NodeOrdinal-Member der DXGKARG_CREATECONTEXT-Struktur übergeben, wenn ein Kontext erstellt wird.

Motoren

Wie in den oben genannten TDR-Funktionen verwendet, ist eine Engine eine von mehreren physischen Adaptern (oder GPUs), die zusammen als ein logischer Adapter fungieren. Das DirectX-Grafikkernsubsystem unterstützt solche Konfigurationen, erfordert jedoch, dass jede Engine über die gleiche Anzahl von Knoten verfügen muss.

Beispielsweise berücksichtigt der GPU-Scheduler Engine 0, dass es dem physischen Adapter 0 entspricht. Engine 0 muss die gleiche Anzahl von Knoten wie Engine 1 aufweisen, was Adapter 1 entspricht.

Ordnungszahlwert der Engine bei der Kontexterstellung

Wenn ein Kontext erstellt wird, wird ein einzelnes Bit, das dem Ordnungswert der Engine entspricht, im EngineAffinity-Member der DXGKARG_CREATECONTEXT-Struktur festgelegt. Der EngineOrdinal-Member dieser und anderer planerbezogener Strukturen ist ein nullbasierter Index. Der Wert von EngineAffinity ist 1 <<EngineOrdinal, und EngineOrdinal ist die höchste Bitposition in EngineAffinity.

Pakete, die von der Engine-Zurücksetzung nicht betroffen sind

Der Treiber wird möglicherweise vom GPU-Planer aufgefordert, Pakete, die zu spät an die Hardwarewarteschlange der Engine übermittelt wurden, erneut zu übermitteln, um sie vollständig zu verarbeiten, bevor die Engine zurückgesetzt wurde. Der Treiber muss die folgenden Richtlinien befolgen, um solche Pakete erneut zu übermitteln:

  • Auslagerungspakete: Der Treiber wird vom GPU-Planer aufgefordert, Pagingpakete mit ihren ursprünglichen Zaun-IDs und in der reihenfolge, in der sie ursprünglich übermittelt wurden, erneut zu übermitteln. Solche Pakete werden erneut übermittelt, bevor der Hardwarewarteschlange neue Pakete hinzugefügt werden.
  • Renderpakete: Der GPU-Scheduler weist Renderpakete neue Zaun-IDs zu und übermittelt sie dann erneut.

Aufrufsequenz zum Zurücksetzen einer Engine

Wenn DxgkDdiResetEngine erfolgreich ist, stellt der GPU-Planer sicher, dass der LastAbortedFenceId-Wert , der vom Engine reset-Aufruf zurückgegeben wird, entweder einer vorhandenen Zaun-ID in der Hardwarewarteschlange oder der letzten abgeschlossenen Zaun-ID auf der GPU entspricht. Die letztere Situation kann auftreten, wenn die Hardwarewarteschlange geleert wird, nachdem das GPU-Timeout erkannt wurde, aber bevor der Rückruf zum Zurücksetzen der Engine aufgerufen wird.

Der letzte abgeschlossene Zaun-ID-Wert auf der GPU muss vom Treiber jederzeit verwaltet werden, da er auch zum Festlegen des DmaPreempted.LastCompletedFenceId-Elements einer DXGKARGCB_NOTIFY_INTERRUPT_DATA Benachrichtigungsstruktur für Unterbrechungsunterbrechungen erforderlich ist. Die zuletzt abgeschlossene Zaun-ID sollte nur in diesen Situationen erweitert werden:

  • Wenn ein Paket abgeschlossen (nicht vorzeitig entfernt) wird, sollte die letzte abgeschlossene Zaun-ID auf die Zaun-ID des abgeschlossenen Pakets festgelegt werden.
  • Wenn DxgkDdiResetEngine erfolgreich ist, sollte die letzte abgeschlossene Zaun-ID auf den Wert des LastCompletedFenceId-Elements festgelegt werden, das vom Engine reset-Aufruf zurückgegeben wird.
  • Für die adapterweite Zurücksetzung sollte die letzte abgeschlossene Zaun-ID auf allen Knoten zur letzten übermittelten Zaun-ID zum Zeitpunkt des Zurücksetzens erweitert werden.

Dies ist eine chronologische Abfolge einer erfolgreichen Engine-Zurücksetzung, wie vom GPU-Scheduler gesehen:

  1. Es wird ein Vorbeengungsversuch ausgegeben.

  2. Ein GPU-Timeout wird erkannt.

  3. Eine Momentaufnahme der letzten übermittelten und abgeschlossenen Zaun-IDs wird vom GPU-Scheduler übernommen, und Unterbrechungen der Timeout-Engine werden ignoriert. Dies ist ein atomischer Vorgang auf der Geräteunterbrechungsebene.

  4. Wenn sich zu diesem Zeitpunkt keine Pakete in der Hardwarewarteschlange befinden, beenden Sie. Dies kann passieren, wenn ein Paket im Zeitfenster zwischen Den Schritten 2 und 3 abgeschlossen wurde.

  5. Alle DPCs in der Warteschlange werden geleert.

  6. Bereiten Sie sich auf die Engine-Zurücksetzung vor.

  7. Rufen Sie DxgkDdiResetEngine auf.

  8. Wenn das LastAbortedFenceId-Element kleiner als die letzte abgeschlossene Zaun-ID oder größer als die zuletzt übermittelte Zaun-ID ist, führt das DirectX-Grafikkernsubsystem zu einer Systemfehlerüberprüfung. In einer Absturzabbilddatei wird der Fehler durch die Meldung BugCheck 0x119 mit den folgenden vier Parametern notiert:

    • 0xA, d. h., der Fahrer hat eine ungültige abgebrochene Zaun-ID gemeldet.
    • LastAbortedFenceId-Wert , der vom Treiber zurückgegeben wird
    • Id des letzten abgeschlossenen Zauns
    • Ein interner Betriebssystemparameter
  9. Wenn der LastAbortedFenceId-Wert gültig ist, fahren Sie mit der Wiederherstellung des Moduls wie folgt fort. Wenn ein Pagingpaket von der Engine-Zurücksetzung betroffen war, folgt der GPU-Planer der Engine-Zurücksetzung mit einer adapterweiten Zurücksetzung. Alle Geräte, auf die von diesem Pagingpaket verwiesene Zuordnungen besitzen, werden ebenfalls in den Fehlerzustand versetzt. Das Systemgerät selbst wird jedoch nicht in den Fehlerzustand versetzt und setzt die Ausführung nach Abschluss des Zurücksetzens fort.

Spezialfälle

Eine besondere Situation kann auftreten, wenn ein Paket auf der GPU zwischen den oben beschriebenen Schritten 3 und 7 abgeschlossen wird. In diesem Fall sollte LastAbortedFenceId vom Treiber auf die Zaun-ID des letzten abgeschlossenen Pakets festgelegt werden, wenn aus Treibersicht keine Pakete in der Hardwarewarteschlange vorhanden sind. Aus Sicht des Planers scheint es, dass ein solches Paket abgebrochen wurde, und das entsprechende Gerät wird in einen Fehlerzustand versetzt, obwohl das Paket schließlich abgeschlossen wurde.

Wenn der Treiber keinen Zurücksetzungsvorgang durchführen kann, weil sich die Hardware in einem ungültigen Zustand befindet oder die Hardware die Knoten nicht zurücksetzen kann, sollte der Treiber einen Fehler status Code zurückgeben. Wenn der GPU-Scheduler einen Fehler status Code empfängt, führt er einen adapterweiten Zurücksetzungs- und Neustartvorgang nach dem TDR-Verhalten vor Windows 8 aus.

Selbst wenn sich ein Treiber für das TDR-Verhalten Windows 8 und höher entschieden hat, gibt es Fälle, in dem der GPU-Planer ein Zurücksetzen und einen Neustart des gesamten logischen Adapters anfordert. Daher muss der Treiber weiterhin die Funktionen DxgkDdiResetFromTimeout und DxgkDdiRestartFromTimeout implementieren, und ihre Semantik bleibt die gleiche wie vor Windows 8. Wenn der Versuch, einen physischen Adapter mit DxgkDdiResetEngine zurückzusetzen, zu einer Zurücksetzung des logischen Adapters führt, zeigt der Befehl !analyze des Windows-Debuggers an, dass der TdrReason-Wert des TDR-Wiederherstellungskontexts auf den neuen Wert TdrEngineTimeoutPromotedToAdapterReset = 9 festgelegt ist.