Freigeben über


Vorzeitige GPU-Entfernung

Das GPU-Preemptionsmodell wurde in Windows 8 (WDDM 1.2) aktualisiert. Im aktualisierten Modell, das Betriebssystem:

Anforderung BESCHREIBUNG
Treiberimplementierung – Vollständige Grafik und nur Rendern Obligatorisch
WHLK-Anforderungen und -Tests Device.Graphics... Vorabtest, Device.Graphics... FlipOnVSyncMmIo

Wenn das Betriebssystem lang laufende Pakete nicht erfolgreich präemptieren kann, dann:

  • Die GPU-Arbeit mit hoher Priorität (z. B. arbeit, die vom Desktop Window Manager (DWM) benötigt wird, kann verzögert werden. Diese Verzögerung führt zu Störungen während Fensterübergängen und Animationen.
  • Der TDR-Prozess kann die GPU wiederholt zurücksetzen und schließlich eine Systemfehlerprüfung verursachen.

Alle WDDM 1.2 KMDs müssen das Windows 8-Präemptionsmodell unterstützen. Während des Betriebs können WDDM 1.2-Treiber jedoch auch das Windows 8-Vorrangmodell ablehnen und das Windows 7-Verhalten vom DirectX-Grafik-Kernel-Subsystem (Dxgkrnl) bewahren.

GPU-Präemptionsschnittstelle

KMD kann die folgenden DDIs verwenden, um das Windows 8 GPU-Vorabmodell zu implementieren.

Schritte zur Treiberimplementierung

Führen Sie die folgenden allgemeinen Schritte aus, um das Windows 8 GPU-Vorabmodell in Ihrer KMD zu implementieren:

  1. Kompilieren Sie Ihren Treiber anhand von Headern, die DXGKDDI_INTERFACE_VERSION>= DXGKDDI_INTERFACE_VERSION_WIN8 haben.
  2. Erklären Sie die Unterstützung für das Windows 8 GPU-Preemption-Modell, indem Sie die Mitglieder PreemptionAware und MultiEngineAware der DXGK_VIDSCHCAPS-Struktur auf 1 festlegen. Um das Windows 7-Vorabmodell zu unterstützen, legen Sie PreemptionAware auf Null fest.
  3. Geben Sie die unterstützte Granularitätsebene in der D3DKMDT_PREEMPTION_CAPS Struktur an, die konstante Werte aus den Enumerationen D3DKMDT_GRAPHICS_PREEMPTION_GRANULARITY und D3DKMDT_COMPUTE_PREEMPTION_GRANULARITY akzeptiert.
  4. Wenn die Hardware lazy context switching unterstützt, übermitteln Sie einen Puffer der Länge null an die Funktion DxgkDdiSubmitCommand und setzen Sie das pSubmitCommand->Flags->ContextSwitch-Element auf 1. Beachten Sie die Diskussion im Zusammenhang mit dem ContextSwitch-Mitglied 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 in den Anmerkungen 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. Initialisieren Sie beim Vorbereiten des DMA-Puffers als Reaktion auf einen Aufruf der DxgkDdiBuildPagingBuffer-Funktion die Kontextressource, indem Sie die interne InitContextResource-Struktur innerhalb 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 die speicherzugeordnete E/A-Umschaltung bei der nächsten Vertikalsynchronisation unterstützen. In Windows 8 versucht der GPU-Scheduler, die Hardware vorübergehend zu unterbrechen, auch wenn Umschaltungen ausstehen. Um das Zerreißen und Rendern von Artefakten zu verhindern, muss der Treiber das im Arbeitsspeicher zugeordnete E/A-Flip-Modell 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

Befolgen Sie diese Anleitung, um einen robusten Treiber zu erstellen, der das Windows 8 GPU-Vorabmodell unterstützt und eine qualitativ hochwertige Benutzererfahrung bietet:

  • Fordern Sie die Vorabräumung des Mid-DMA-Puffers von der GPU an, wenn der Dxgkrnl-Scheduler einen Befehl zur Vorabräumung sendet. Hardwaregeräte mit einer feineren Granularität der Mid-DMA-Puffervorenthaltung sollten eine bessere Benutzererfahrung bieten.
  • Zulassen, dass Zaun-IDs von Pagingbefehlen wiederverwendet werden: Wenn eine Unterbrechungsanforderung dazu führte, dass Pagingbefehle in der Hardwarewarteschlange unterbrochen wurden, wird der Dxgkrnl-Scheduler die unterbrochenen Pagingbefehle mit denselben ursprünglich verwendeten Zaun-IDs erneut einreichen, und die Pagingbefehle werden vor allen anderen Befehlen in dieser Engine geplant. Nicht-paging-Befehle werden mit neu zugewiesenen Zaun-IDs erneut übermittelt.
  • Stellen Sie eine Patch-Standortliste für geteilte DMA-Puffer bereit. Weitere Informationen finden Sie unter Aufteilen eines DMA-Puffers.
  • Ein Überprüfungsmodus, der als Bindungsleckerkennung bezeichnet wird, ist verfügbar. Dieser Überprüfungsmodus durchläuft die Patchspeicherortliste und lehnt Pakete ab, die nicht getrennt werden oder die keine Zuordnungen für jedes geteilte Paket neu programmieren. Einige Hardware unterstützt virtuelle Adressen und ermöglicht eine zusätzliche Indirektionsebene, die diese Überprüfung unnötig machen kann. Um in diesem Fall anzugeben, dass der Treiber den Überprüfungsmodus deaktiviert, legen Sie 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-Vorabmodell kann der Scheduler Renderpakete aus einem anderen Kontext zwischen zwei geteilten Paketen ausführen, die demselben Renderbefehl entsprechen. Infolgedessen sollten Treiber, die sich über die Preemption bewusst sind, eine geteilte/teilweise DMA-Paketübermittlung auf die gleiche Weise behandeln wie eine normale vollständige Paketübermittlung. Insbesondere muss der GPU-Zustand an der Grenze für solche Übermittlungen gespeichert oder wiederhergestellt werden.
  • Ein präemptionsfähiger Treiber darf den Inhalt eines geteilten DMA-Puffers nicht ändern, wenn er im Modus für verknüpfte Grafikkarten (Linked Display Adapter, LDA) an mehrere Adapter gesendet wird, wobei mehrere physische GPUs zu einer einzigen, schnelleren virtuellen GPU verbunden werden. Im Vorabmodell von Windows 8 garantiert der Dxgkrnl-Scheduler nicht mehr die synchrone Ausführung einer geteilten Paketsequenz, ohne zu einem 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 beeinträchtigen. Wenn das Paket auf einer anderen Engine ausgeführt würde, würde es mit derselben Kopie der DMA-Pufferdaten arbeiten.
  • Im Windows 8-GPU-Unterbrechungsmodell ermöglicht der Dxgkrnl-Scheduler die Unterbrechung für Pakete, denen "signal on submit"-Synchronisationsprimitiven zugeordnet sind. Wenn ein Gerät "Signal beim Senden"-Synchronisierungsgrundtypen mit hardwarebasierten Wartezuständen verwendet, muss es die Möglichkeit unterstützen, eine Warteanweisung vorab zu deaktivieren, 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 WHLK-Dokumentation zu Device.Graphics…Preemption-Test und Device.Graphics…FlipOnVSyncMmIo.