Architettura MCDM
Il driver McDM (Microsoft Compute Driver Model) è un framework progettato per supportare attività di elaborazione ad alte prestazioni nelle piattaforme Windows. Fornisce un'interfaccia standardizzata per lo sviluppo di driver che possono usare GPU, NPU e altre risorse di calcolo per le attività di elaborazione parallele. I driver MCDM sono essenziali per le applicazioni che richiedono potenza di calcolo intensiva, ad esempio simulazioni scientifiche, analisi dei dati e Machine Learning.
Questo articolo descrive i concetti dell'architettura MCDM. Un driver MCDM o un driver solo di calcolo dispone di un driver in modalità kernel (driver .sys ) e di una libreria di collegamento dinamico in modalità utente (DLL).
Vedere anche:
- Panoramica del modello di driver di calcolo Microsoft
- Linee guida per l'implementazione del driver in modalità kernel MCDM
- Flusso dell'operazione WDDM
Coda dei comandi
Una coda di comandi è un costrutto DirectCompute usato per l'invio del lavoro. Il driver è responsabile della creazione di uno o più contesti che usa per eseguire l'esecuzione del lavoro inviato. Il driver è responsabile della trasformazione del lavoro espresso tramite chiamate al relativo DDI in buffer DMA che quindi invia a un contesto per l'esecuzione.
Contesto
Un contesto è una coda di lavoro di calcolo inviato da un driver destinato a un motore con stato specifico dell'istanza. Il lavoro di calcolo viene espresso come buffer DMA che vengono mantenuti in una coda SW in attesa di invio al motore.
Coda SW
I buffer DMA inviati per l'esecuzione a un contesto vengono mantenuti in una coda SW. La lunghezza di una coda SW è limitata solo dalle risorse. Esiste un'associazione uno-a-uno tra un contesto e la corrispondente coda SW. È responsabilità dell'utilità di pianificazione rimuovere i buffer DMA dalla coda SW e inviare i buffer al motore appropriato, che a sua volta posiziona il buffer sulla propria coda HW.
Utilità di pianificazione
L'utilità di pianificazione viene implementata dal sistema operativo e il driver non ha alcun controllo su questa pianificazione.
L'utilità di pianificazione è responsabile della pianificazione del lavoro accodato nelle code SW destinate ai motori. Garantisce un uso equo delle risorse del motore limitate in tutte le code SW e impedisce il funzionamento in base alle esigenze per garantire questa equità e garantire che il lavoro con priorità più alta venga completato in modo tempestivo.
Quando l'Utilità di pianificazione annulla il lavoro, è responsabile della ripetizione della coda in base alle esigenze del lavoro che è stato interrotto.
Motore
Un motore esegue le azioni necessarie per completare il lavoro espresso in una sequenza di buffer DMA. Ogni buffer DMA viene eseguito in un determinato contesto e nello spazio indirizzi. Il motore deve indicare quando l'esecuzione di un buffer DMA è completa e queste indicazioni devono essere fornite nello stesso ordine in cui sono stati ricevuti i buffer DMA.
Un motore deve essere in grado di avanzare in modo indipendente in assenza di dipendenze esplicite o implicite espresse nei buffer DMA. Se esistono due o più motori, sono pianificati con il presupposto che il lavoro di ogni motore procederà in modo tempestivo e senza problemi di lavoro condotto in altri motori.
Poiché un buffer DMA viene eseguito con uno spazio indirizzi specificato, è possibile supportare più motori solo se ogni motore è in grado di eseguire buffer DMA in spazi di indirizzi diversi.
Un driver determina il numero di motori segnalati e il modo in cui questi motori vengono usati dal contesto creato.
Coda HW
A un motore verrà assegnata una sequenza di buffer DMA che vengono inseriti concettualmente in una coda denominata coda HW. Attualmente, questa coda viene riempita solo con al massimo due voci del buffer DMA. Un motore deve completare i buffer DMA nell'ordine di invio.
Precedenza
Un motore deve essere in grado di preemption, consentendo l'esecuzione di buffer DMA parzialmente completati per essere interrotti o annullati.
Quando richiesto di annullare il lavoro in sospeso, un motore deve supportare minimamente il completamento di eventuali buffer DMA parzialmente completati e annullare tutti i buffer DMA non ancora avviati.
L'indicazione del completamento o della precedenza dei buffer DMA deve comunque essere eseguita nell'ordine in cui sono stati inviati i buffer DMA. Se viene preempted un buffer DMA, vengono annullati anche tutti i buffer DMA successivi (attualmente al massimo un altro buffer).
Se un buffer DMA viene eseguito parzialmente, il driver deve salvare informazioni sufficienti per la ripresa dell'esecuzione.
DMA Buffer
Il driver converte il lavoro inviato tramite chiamate alla relativa DDI in buffer DMA che vengono quindi inviati per l'esecuzione. Un motore esegue le azioni necessarie per completare il lavoro espresso in una sequenza di buffer DMA. Ogni buffer DMA viene eseguito in un determinato contesto e nello spazio indirizzi. Il motore deve indicare quando l'esecuzione di un buffer DMA è completa e queste indicazioni devono essere fornite nello stesso ordine in cui sono stati ricevuti i buffer DMA.
Spazio di indirizzi
Uno spazio indirizzi viene usato per eseguire il mapping degli indirizzi dei dispositivi virtuali agli indirizzi dei dispositivi fisici. Per ogni processo sul lato host viene usato un singolo spazio indirizzi.
I motori sono una risorsa condivisa tra processi e pertanto devono supportare il passaggio tra Spazi di indirizzi perché i buffer DMA vengono eseguiti da processi diversi.
I dispositivi che supportano un solo spazio indirizzi devono essere limitati nel modo in cui vengono usati. È consentito usare il dispositivo solo un processo alla volta. Mentre un processo usa il dispositivo, tutti i tentativi da parte di altri processi di accedere al dispositivo avranno esito negativo. I dispositivi che possono supportare l'accesso solo tramite un singolo processo vengono definiti dispositivi a uso singolo.
Uno spazio indirizzi viene specificato da un singolo puntatore alla tabella della pagina radice dello spazio indirizzi. Una modifica a uno spazio indirizzi diverso richiede solo la specifica di un indirizzo di tabella della pagina radice diverso.
Il sistema operativo gestisce una tabella della pagina dello spazio indirizzi. Per apportare modifiche alla tabella di pagine, il sistema operativo invia richieste al driver per registrare queste modifiche nei buffer DMA che vengono successivamente inviati al motore appropriato al momento appropriato.