Freigeben über


MCDM-Architektur

Der Microsoft Compute Driver Model (MCDM)-Treiber ist ein Framework zur Unterstützung leistungsintensiver Computeraufgaben auf Windows-Plattformen. Er stellt eine standardisierte Schnittstelle für die Entwicklung von Treibern bereit, die GPU, NPU und andere Computeressourcen für parallele Verarbeitungsaufgaben verwenden können. MCDM-Treiber sind für Anwendungen unerlässlich, die intensive Rechenleistung erfordern, z. B. wissenschaftliche Simulationen, Datenanalysen und maschinelles Lernen.

In diesem Artikel werden die Architekturkonzepte von MCDM beschrieben. Ein MCDM-Treiber (oder Compute-Only-Treiber) verfügt sowohl über einen Kernelmodustreiber (.sys-Treiber) als auch über eine Dynamic Link Library (DLL) im Benutzermodus.

Weitere Informationen:

Befehlswarteschlange

Eine Befehlswarteschlange ist ein DirectCompute-Konstrukt, das für die Übermittlung von Arbeit verwendet wird. Der Treiber ist für das Erstellen eines oder mehrerer Kontexte verantwortlich, die dann zum Ausführen der übermittelten Arbeit verwendet werden. Der Treiber ist dafür verantwortlich, die durch Aufrufe an seine DDI ausgedrückten Arbeiten in DMA-Puffer umzuwandeln, die dann zur Ausführung an einen Kontext gesendet werden.

Kontext

Ein Kontext ist eine Warteschlange für Computingaufgaben, die von einem Treiber für eine Engine mit instanzspezifischem Zustand übermittelt werden. Die Computing-Arbeit wird als DMA-Puffer ausgedrückt, der in einer SW-Warteschlange gespeichert wird, die auf die Übermittlung an die Engine wartet.

SW-Warteschlange

Für die Ausführung an einen Kontext übermittelte DMA-Puffer werden in einer SW-Warteschlange gespeichert. Die Länge einer SW-Warteschlange ist nur durch Ressourcen begrenzt. Es besteht eine 1:1-Zuordnung zwischen einem Kontext und der entsprechenden SW-Warteschlange. Es liegt in der Verantwortung des Schedulers, die DMA-Puffer aus der SW-Warteschlange zu entfernen und die Puffer an die entsprechende Engine zu übermitteln, die den Puffer wiederum in einer eigenen HW-Warteschlange platziert.

Zeitplaner

Der Scheduler wird vom Betriebssystem implementiert, und der Treiber hat keine Kontrolle über diese Planung.

Der Scheduler ist für die Planung der Arbeit in SW-Warteschlangen verantwortlich, die auf Engines ausgerichtet sind. Er sorgt für einen fairen Einsatz begrenzter Engine-Ressourcen in allen SW-Warteschlangen und zieht bei Bedarf Arbeiten vor, um diese Fairness sicherzustellen und dafür zu sorgen, dass Arbeiten mit höherer Priorität zeitnah abgeschlossen werden.

Wenn der Scheduler Arbeiten vorzieht, ist er dafür verantwortlich, die vorgezogene Arbeit nach Bedarf erneut in die Warteschlange zu setzen.

Motor

Eine Engine führt die erforderlichen Aktionen aus, um die Arbeit auszuführen, die in einer Sequenz von DMA-Puffern ausgedrückt wird. Jeder DMA-Puffer wird in einem bestimmten Kontext und Adressraum ausgeführt. Die Engine muss angeben, wann die Ausführung eines DMA-Puffers abgeschlossen ist. Dies muss in derselben Reihenfolge erfolgen, in der die DMA-Puffer empfangen wurden.

Eine Engine sollte unabhängig fortschreiten können, auch wenn explizite oder implizite Abhängigkeiten fehlen, die in den DMA-Puffern angegeben sind. Wenn zwei oder mehr Engines vorhanden sind, werden sie in der Annahme geplant, dass die Arbeit jeder Engine zeitnah und ohne Beeinträchtigung der in anderen Engines durchgeführten Arbeit fortgesetzt wird.

Da ein DMA-Puffer mit einem bestimmten Adressraum ausgeführt wird, können mehrere Engines nur unterstützt werden, wenn jede Engine in der Lage ist, DMA-Puffer in unterschiedlichen Adressräumen auszuführen.

Ein Treiber legt fest, wie viele Engines er meldet und wie diese Engines von dem von ihnen erstellten Kontext verwendet werden.

HW-Warteschlange

Eine Engine erhält eine Sequenz von DMA-Puffern, die konzeptionell in einer Warteschlange mit der Bezeichnung HW-Warteschlange platziert werden. Derzeit wird diese Warteschlange nur mit höchstens zwei DMA-Puffer-Einträgen gefüllt. Eine Engine muss die DMA-Puffer in der Reihenfolge der Übermittlung abschließen.

Vorzeitige Entfernung

Eine Engine muss in der Lage sein, Arbeiten vorzuziehen, sodass die Ausführung teilweise abgeschlossener DMA-Puffer unterbrochen oder abgebrochen werden kann.

Wenn sie aufgefordert wird, ausstehende Arbeiten vorzuziehen, muss eine Engine mindestens den Abschluss aller teilweise abgeschlossenen DMA-Puffer und den Abbruch aller DMA-Puffer, die noch nicht gestartet wurden, unterstützen.

Die Angabe des Abschlusses oder des Vorziehens von DMA-Puffern muss weiterhin in der Reihenfolge erfolgen, in der die DMA-Puffer übermittelt wurden. Wenn ein DMA-Puffer vorgezogen wird, werden auch alle nachfolgenden DMA-Puffer (derzeit höchstens ein weiterer Puffer) vorgezogen.

Wenn ein DMA-Puffer teilweise ausgeführt wurde, muss der Treiber genügend Informationen für die Fortsetzung der Ausführung speichern.

DMA-Puffer

Der Treiber konvertiert die über Aufrufe an die DDI übermittelte Arbeit in DMA-Puffer, die dann zur Ausführung übermittelt werden. Eine Engine führt die erforderlichen Aktionen aus, um die Arbeit auszuführen, die in einer Sequenz von DMA-Puffern ausgedrückt wird. Jeder DMA-Puffer wird in einem bestimmten Kontext und Adressraum ausgeführt. Die Engine muss angeben, wann die Ausführung eines DMA-Puffers abgeschlossen ist. Dies muss in derselben Reihenfolge erfolgen, in der die DMA-Puffer empfangen wurden.

Adressraum

Ein Adressraum wird verwendet, um virtuelle Geräteadressen physischen Geräteadressen zuzuordnen. Für jeden hostseitigen Prozess wird ein einzelner Adressraum verwendet.

Engines sind von Prozessen gemeinsam genutzte Ressourcen und müssen daher den Wechsel zwischen Adressräumen unterstützen, da DMA-Puffer aus verschiedenen Prozessen heraus ausgeführt werden.

Geräte, die nur einen Adressraum unterstützen, müssen hinsichtlich ihrer Verwendung eingeschränkt sein. Nur ein einziger Prozess kann jeweils das Gerät verwenden. Während ein Prozess das Gerät verwendet, schlagen alle Versuche anderer Prozesse zum Zugriff auf das Gerät fehl. Geräte, die den Zugriff nur durch einen einzelnen Prozess unterstützen können, werden als Single Use-Geräte bezeichnet.

Ein Adressraum wird durch einen einzelnen Zeiger auf die Stammseitentabelle des Adressraums angegeben. Ein Wechsel zu einem anderen Adressraum erfordert lediglich die Angabe einer anderen Stammseitentabellen-Adresse.

Das Betriebssystem verwaltet eine Adressraumseitentabelle. Um Änderungen an der Seitentabelle vorzunehmen, fordert das Betriebssystem den Treiber auf, diese Änderungen in DMA-Puffern aufzuzeichnen, die später zum entsprechenden Zeitpunkt an die jeweilige Engine übermittelt werden.