Freigeben über


Kontextüberwachung

Dieser Artikel enthält Informationen zur Kontextüberwachung, die eine flexible Synchronisierung zwischen GPU-Engines oder über CPU-Kerne und GPU-Engines hinweg ermöglicht. Ein überwachtes Zaunobjekt, bei dem es sich um eine erweiterte Form der Zaunsynchronisierung handelt, ermöglicht es entweder einem CPU-Kern oder einer GPU-Engine, ein bestimmtes Zaunobjekt zu signalisieren oder darauf zu warten.

Überwachte Zaunerstellung

Die Direct3D-Runtime erstellt ein überwachtes Zaunobjekt, indem der CreateSynchronizationObjectCb-Rückruf des Benutzermodustreibers (UMD) mit dem D3DDDI_MONITORED_FENCE Synchronisierungsobjekttyp aufgerufen wird.

Ein überwachtes Zaunobjekt wird zusammen mit den folgenden Attributen erstellt:

  • Anfangswert
  • Flags (angeben des Warte- und Signalverhaltens)

Beim Erstellen gibt der Grafikkern ein Fence-Objekt zurück, das aus den folgenden Elementen besteht:

Element BESCHREIBUNG
hSyncObject Handle mit dem Synchronisierungsobjekt. Wird verwendet, um in einem Aufruf des Grafikkernels darauf zu verweisen.
FenceValueCPUVirtualAddress Schreibgeschützte Zuordnung des Zaunwerts (64 Bit) für die CPU. Diese Adresse ist WB (zwischenspeicherbar) aus Sicht der CPU auf Plattformen zugeordnet, die E/A-Koherenz, UC (nicht zwischengespeichert) auf anderen Plattformen unterstützen. Ermöglicht der CPU, den Status des Zauns zu verfolgen, indem sie einfach diesen Speicherspeicherort liest. Die CPU darf nicht in diesen Speicherspeicherort schreiben. Um den Zaun zu signalisieren, muss die CPU das SignalSynchronizationObjectFromCpuCb aufrufen. Adapter, die IoMmu unterstützen, sollten diese Adresse für den GPU-Zugriff verwenden. Die Adresse wird in diesem Fall als Lese-/Schreibzugriff zugeordnet.
FenceValueGPUVirtualAddress Lese-/Schreibzuordnung des Zaunwerts (64 Bit) für die GPU. Diese Adresse wird so zugeordnet, dass E/A-Kohärenz auf plattformen erforderlich ist, die sie unterstützen. Um den Zaun zu signalisieren, darf die GPU direkt an diese virtuelle GPU-Adresse schreiben. IoMmu-GPUs sollten diese Adresse nicht verwenden.

Der Zaunwert ist ein 64-Bit-Wert mit den jeweiligen virtuellen Adressen, die an einer 64-Bit-Grenze ausgerichtet sind. GPUs sollten über das hinzugefügte DXGK_VIDSCHCAPS::No64BitAtomics-Flag deklarieren, ob sie 64-Bit-Werte atomar aktualisieren können. Wenn eine GPU nur in der Lage ist, 32-Bit-Werte atomar zu aktualisieren, verarbeitet das Betriebssystem den Umbruchfall automatisch. Sie legt jedoch eine Einschränkung fest, dass ausstehende Warte- und Signalzaunwerte nicht mehr als UINT_MAX/2 vom letzten Signalzaunwert entfernt sein dürfen.

GPU-Signal

Wenn eine GPU-Engine nicht in der Lage ist, mithilfe seiner virtuellen Adresse in einen überwachten Zaun zu schreiben, verwendet der Benutzermodustreiber (UMD) den SignalSynchronizationObjectFromGpuCb-Rückruf , um ein Softwaresignalpaket im GPU-Kontext in die Warteschlange zu stellen.

Um den Zaun von der GPU zu signalisieren, fügt die UMD einen Zaunschreibbefehl direkt in einen Kontextbefehlsstream ein, ohne den Kernelmodus zu durchlaufen. Der Mechanismus, mit dem der Kernel den Zaunstatus überwacht, hängt davon ab, ob eine bestimmte GPU-Engine die grundlegende oder erweiterte Implementierung des überwachten Zauns unterstützt.

Wenn ein Befehlspuffer die Ausführung auf der GPU abgeschlossen hat, zeigt der Grafikkern Folgendes:

  • Durchläuft die Liste der Zaunobjekte mit ausstehenden Wartezeiten, die für diesen Prozess signalisiert werden könnten
  • Liest den aktuellen Zaunwert
  • Bestimmt, ob Wartezeiten nicht mehr ausgeführt werden müssen.

GPU-Wartezeit

Um auf einen überwachten Zaun für eine GPU-Engine zu warten, muss die UMD zuerst den ausstehenden Befehlspuffer leeren und dann WaitForSynchronizationObjectFromGpuCb aufrufen, um das Zaunobjekt (hSyncObject) und den zu wartenden Zaunwert anzugeben. Der Grafikkern führt die Abhängigkeit mit seiner internen Datenbank in die Warteschlange und kehrt dann sofort an die UMD zurück, damit die Arbeit hinter dem Wartevorgang fortgesetzt werden kann. Befehlspuffer, die nach dem Wartevorgang übermittelt werden, werden erst dann für die Ausführung geplant, wenn der Wartevorgang erfüllt ist.

CPU-Signal

Der SignalSynchronizationObjectFromCpuCb-Rückruf wurde hinzugefügt, damit die CPU ein überwachtes Zaunobjekt signalisieren kann. Wenn die CPU ein überwachtes Zaunobjekt signalisiert, aktualisiert der Grafikkern den Speicherort des Zaunspeichers mit dem Signalwert. Dieser Wert wird für jeden Benutzermodusleser sofort sichtbar und löst sofort alle zufriedenen Wartezeiten aus.

CPU-Wartezeit

Ein WaitForSynchronizationObjectFromCpuCb-Rückruf wurde hinzugefügt, damit die CPU auf ein überwachtes Zaunobjekt warten kann. Es stehen zwei Arten von Wartevorgängen zur Verfügung. Im ersten Formular blockiert WaitForSynchronizationObjectFromCpuCb , bis die Wartezeit erfüllt ist. In der zweiten Form übernimmt WaitForSynchronizationObjectFromCpuCb ein Handle für ein CPU-Ereignis, das signalisiert wird, sobald die Wartebedingung erfüllt ist.