Freigeben über


GPU-Vorbeengung

Ab Windows 8 war ein neueres GPU-Preemptionsmodell verfügbar. In diesem Modell lässt das Betriebssystem nicht mehr zu, dass DMA-Pakete (Gpu Direct Memory Access) deaktiviert werden, und es garantiert, dass Vorabbescheidungsanforderungen an die GPU gesendet werden, bevor ein TDR-Prozess (Timeout Detection and Recovery) initiiert wird.

Anforderung BESCHREIBUNG
Mindestversion des Windows Display Driver Model (WDDM) 1.2
Windows-Mindestversion 8
Treiberimplementierung– Nur vollständige Grafiken und Rendern Obligatorisch.
WHLK-Anforderungen und -Tests Device.Graphics... Preemption Test, Device.Graphics... FlipOnVSyncMmIo

Wenn Pakete mit langer Ausführungsdauer nicht erfolgreich entfernt werden können, kann die GPU-Arbeit mit hoher Priorität, z. B. die arbeit, die für den Desktopfenster-Manager (DWM) erforderlich ist, verzögert werden, was zu Störungen bei Fensterübergängen und Animationen führt. Außerdem können GPU-Pakete mit langer Ausführungsdauer, die nicht vorzeitig entfernt werden können, dazu führen, dass ein TDR-Prozess die GPU wiederholt zurücksetzt, und schließlich kann eine Systemfehlerüberprüfung auftreten.

Hinweis Alle WDDM 1.2-Display-Miniporttreiber müssen das Windows 8 Preemption-Modell unterstützen. Im Betrieb können WDDM 1.2-Treiber jedoch auch das Windows 8 Vorkaufsmodell ablehnen und das Windows 7-Verhalten durch den Microsoft DirectX-Grafikkernsubsystemplaner beibehalten.

Gpu Preemption Device Driver Interfaces (DDIs)

Die folgenden Gerätetreiberschnittstellen (Device Driver Interfaces, DDIs) sind für den Display-Miniporttreiber verfügbar, um das Windows 8 GPU-Preemption-Modell zu implementieren.

Miniporttreiberimplementierung anzeigen

Führen Sie die folgenden allgemeinen Schritte aus, um das Windows 8 GPU-Vorkaufsmodell in Ihrem Display-Miniporttreiber zu implementieren:

  1. Kompilieren Sie Ihren Treiber für Header mit DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8.
  2. Deklarieren Sie unterstützung für das Windows 8 GPU-Preemption-Modell, indem Sie die Member PreemptionAware und MultiEngineAware der DXGK_VIDSCHCAPS-Struktur auf 1 festlegen. Legen Sie PreemptionAware auf Null fest, um das Windows 7-Vorablösungsmodell zu unterstützen.
  3. Geben Sie die unterstützte Ebene der Präemptionsgranularität in der D3DKMDT_PREEMPTION_CAPS-Struktur an, die konstante Werte aus den D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY - und D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY-Enumerationen übernimmt.
  4. Wenn die Hardware den verzögerten Kontextwechsel unterstützt, übermitteln Sie einen Puffer der Länge null an die DxgkDdiSubmitCommand-Funktion, und legen Sie den pSubmitCommand-Flags-ContextSwitch-Member >> auf 1 fest. Beachten Sie die Diskussion unter dem ContextSwitch-Member der DXGK_SUBMITCOMMANDFLAGS-Struktur .
  5. Legen Sie GPU-Kontextzuordnungen und Gerätekontextzuordnungen fest, indem Sie die DxgkCbCreateContextAllocation-Funktion aufrufen. Beachten Sie die spezifischen Anweisungen und Einschränkungen unter Hinweise für die Funktion.
  6. Rufen Sie die DxgkCbDestroyContextAllocation-Funktion auf, um GPU-Kontextzuordnungen und Gerätekontextzuordnungen zu zerstören, die mit DxgkCbCreateContextAllocation erstellt wurden.
  7. Wenn Sie den DMA-Puffer als Reaktion auf einen Aufruf der DxgkDdiBuildPagingBuffer-Funktion vorbereiten, initialisieren Sie die Kontextressource, indem Sie die interne InitContextResource-Struktur in der DXGKARG_BUILDPAGINGBUFFER-Struktur ausfüllen. Wenn Kontextressourcen entfernt oder verschoben werden, behält der Videospeicher-Manager den Inhalt der Kontextressourcen bei.
  8. Der Treiber muss speicherseitig zugeordnete E/A-Wendungen bei der nächsten vertikalen Synchronisierung unterstützen. In Windows 8 versucht der GPU-Planer, Hardware zu ersetzen, selbst wenn Flips ausstehen. Daher muss der Treiber das speicherbezogene E/A-Flipmodell unterstützen und das FlipOnVSyncMmIo-Element der DXGK_FLIPCAPS-Struktur auf 1 festlegen und die unter FlipOnVSyncMmIo beschriebenen Vorgänge unterstützen.

Überlegungen zur Speicherzuordnung in Ihrer Implementierung

Erstellen Sie einen robusten Treiber, der das Windows 8 GPU-Vorkaufsmodell unterstützt und eine hochwertige Benutzeroberfläche bietet, indem Sie die folgenden Anleitungen befolgen:

  • Fordern Sie die Vorzeitigsetzung des Mid-DMA-Puffers von der GPU an, wenn der DirectX-Grafikkernplaner (Dxgkrnl) einen Preemption-Befehl sendet. Hardwaregeräte mit einer feineren Granularität von Mid-DMA-Puffern sollten zu einer besseren Kundenfreundlichkeit führen.
  • Zulassen, dass Paging-Befehlszaun-IDs wiederverwendet werden: Wenn eine Vorablöschanforderung dazu führte, dass Pagingbefehle in der Hardwarewarteschlange aufgehoben wurden, übermittelt der Dxgkrnl-Planer zuvor aufgehobene Pagingbefehle erneut mit denselben Zaun-IDs, die ursprünglich für sie verwendet wurden, und die Pagingbefehle werden vor allen anderen Befehlen auf dieser Engine geplant. Nicht pagingende Befehle werden mit neu zugewiesenen Zaun-IDs erneut übermittelt.
  • Bereitstellen einer Patchspeicherortliste für geteilte DMA-Puffer – siehe Aufteilen eines DMA-Puffers.
  • Ein Überprüfungsmodus, der als Bindungsleckerkennung bezeichnet wird, ist verfügbar, der die Patchspeicherortliste durchläuft und Pakete ablehnt, die die Bindung nicht aufheben oder die Zuordnungen für jedes geteilte Paket nicht neu erstellen. Einige Hardware unterstützen virtuelle Adressen, wodurch eine zusätzliche De indirektierungsebene möglich ist, die diese Überprüfung überflüssig machen kann. Um anzugeben, dass der Treiber den Überprüfungsmodus deaktiviert, legen Sie in einem solchen Fall das NoDmaPatching-Element der DXGK_VIDSCHCAPS-Struktur auf 1 fest.
  • In Windows 7 garantiert der Dxgkrnl-Scheduler, dass alle geteilten DMA-Pakete, die demselben Renderbefehl entsprechen, sequenziell ausgeführt werden, ohne zu einem anderen Renderkontext zu wechseln. Im Windows 8-Präemptionsmodells kann der Planer Renderpakete aus einem anderen Kontext zwischen zwei geteilten Paketen ausführen, die demselben Renderbefehl entsprechen. Daher sollten Treiber, die sich der Vorzeitigkeit bewusst sind, eine geteilte/partielle DMA-Paketübermittlung auf die gleiche Weise behandeln wie eine reguläre vollständige Paketübermittlung. Insbesondere muss der GPU-Zustand an der Grenze für solche Übermittlungen gespeichert oder wiederhergestellt werden.
  • Ein treiber, der der Vorzeitigkeit dient, darf den Inhalt eines geteilten DMA-Puffers nicht ändern, wenn er im LDA-Modus (Linked Display Adapter) an mehrere Adapter übertragen wird, in dem mehrere physische GPUs verknüpft sind, um eine einzelne, schnellere virtuelle GPU zu bilden. Dies liegt daran, dass der Dxgkrnl-Planer im Windows 8-Vorkaufsmodell nicht mehr die synchrone Ausführung einer splitten Paketsequenz garantiert, ohne in einen anderen Kontext zu wechseln. Ein Treiber, der den Inhalt eines geteilten DMA-Pakets geändert hat, würde die Integrität der Daten des Pakets gefährden, da das Paket bei Ausführung auf einer anderen Engine mit derselben Kopie von DMA-Pufferdaten ausgeführt würde.
  • Im Windows 8 GPU-Preemption-Modell ermöglicht der Dxgkrnl-Planer die Vorzeitige Entfernung für Pakete, die zugeordnete "Signal bei Übermittlung"-Synchronisierungsgrundsätze aufweisen. Wenn ein Gerät "Signal on Submit"-Synchronisierungsgrundsätze in Verbindung mit hardwarebasierten Wartezuständen verwendet, muss es die Möglichkeit unterstützen, eine Warteanweisung zu entfernen, bevor die Wartebedingung erfüllt ist.

Hardwarezertifizierungsanforderungen

Informationen zu den Anforderungen, die Hardwaregeräte erfüllen müssen, wenn sie dieses Feature implementieren, finden Sie in der entsprechenden WHCK-Dokumentation unter Device.Graphics... Preemption Test and Device.Graphics... FlipOnVSyncMmIo.

Eine Übersicht über features, die mit Windows 8 hinzugefügt wurden, finden Sie unter WDDM 1.2-Features.