Condividi tramite


Memoria virtuale GPU in WDDM 2.0

Questo articolo fornisce informazioni dettagliate sulla gestione della memoria virtuale GPU a partire da Windows 10 (WDDM 2.0). Descrive perché WDDM è stato modificato per supportare l'indirizzamento virtuale GPU e il modo in cui i driver lo usano.

Introduzione

Prima di Windows Display Driver Model (WDDM) 2.0, è stata creata l'interfaccia DDI (Device Driver Interface) in modo che i motori GPU fossero tenuti a fare riferimento alla memoria tramite indirizzi fisici segmentati. Man mano che i segmenti sono stati condivisi tra applicazioni e over-committed, le risorse sono state rilocate per tutta la durata e gli indirizzi fisici assegnati sono stati modificati. Questo processo richiedeva il rilevamento dei riferimenti alla memoria all'interno dei buffer dei comandi tramite elenchi di percorsi di allocazione e patch. Questi buffer devono quindi essere patchati con il riferimento di memoria fisica corretto prima dell'invio a un motore GPU. Questo rilevamento e applicazione di patch era costoso. Essenzialmente imponeva un modello di pianificazione in cui il gestore di memoria video (VidMm) doveva ispezionare ogni pacchetto prima di poter essere inviato a un motore.

Nel corso del tempo, più fornitori di hardware si spostano verso un modello di pianificazione basato su hardware. In questo modello, il lavoro viene inviato alla GPU direttamente dalla modalità utente e la GPU gestisce le varie code di lavoro stesso. Questa evoluzione ha reso necessario eliminare la necessità di VidMm di controllare e applicare patch a ogni buffer dei comandi prima dell'invio a un motore GPU.

A tale scopo, WDDM supporta l'indirizzamento virtuale GPU a partire da WDDM 2.0. In questo modello, a ogni processo viene assegnato uno spazio di indirizzi virtuali GPU (GPUVA) univoco in cui può essere eseguito ogni contesto GPU. A un'allocazione creata o aperta da un processo viene assegnata una GPUVA univoca all'interno dello spazio di indirizzi virtuale GPU del processo. Questa GPUVA assegnata rimane costante e univoca per la durata dell'allocazione. Il driver di visualizzazione in modalità utente (UMD) è quindi in grado di fare riferimento alle allocazioni tramite l'indirizzo virtuale GPU senza doversi preoccupare della memoria fisica sottostante che cambia attraverso la sua durata.

I singoli motori di una GPU possono funzionare in modalità fisica o virtuale:

  • In modalità fisica, il modello di pianificazione rimane uguale a quello di WDDM v1.x. L'UMD continua a generare gli elenchi di percorsi di allocazione e patch. Questi elenchi di allocazione vengono inviati con un buffer dei comandi e vengono usati per applicare patch ai buffer dei comandi agli indirizzi fisici effettivi prima dell'invio a un motore.

  • In modalità virtuale un motore fa riferimento alla memoria tramite indirizzi virtuali GPU. UMD genera buffer dei comandi direttamente dalla modalità utente e usa nuovi servizi per inviare tali comandi al kernel. La messaggistica unificata non genera elenchi di località di allocazione o patch, anche se è comunque responsabile della gestione della residenza delle allocazioni. Per altre informazioni sulla residenza dei driver, vedere Residenza dei driver in WDDM 2.0.

Modelli di memoria GPU

WDDM v2 supporta due modelli distinti per l'indirizzamento virtuale GPU, GpuMmu e IoMmu. Un driver deve acconsentire esplicitamente al supporto di uno o entrambi i modelli. Un singolo nodo GPU può supportare entrambe le modalità contemporaneamente.

Modello GpuMmu

Nel modello GpuMmu VidMm gestisce l'unità di gestione della memoria GPU e le tabelle di pagina sottostanti. VidMm espone anche i servizi alla messaggistica unificata che consentono di gestire il mapping degli indirizzi virtuali GPU alle allocazioni. GpuMmu implica che la GPU usa tabelle di pagine GPU per accedere ai dati. Le tabelle di pagine possono puntare alla memoria di sistema o alla memoria del dispositivo locale.

Per altre informazioni, vedere Modello GpuMmu.

Modello IoMmu

Nel modello IoMmu la CPU e la GPU condividono uno spazio indirizzi comune e tabelle di pagine della CPU. In questo caso è possibile accedere solo alla memoria di sistema, quindi IoMmu è adatto alle GPU integrate. IoMmu offre un modello di programmazione più semplice, in cui la GPU e la CPU possono usare lo stesso puntatore per accedere alla memoria. Non è necessario gestire un set separato di tabelle di pagine nella memoria accessibile tramite GPU. Detto questo, il modello IoMmu può comportare prestazioni ridotte a causa del sovraccarico della traduzione e della gestione degli indirizzi.

Per altre informazioni, vedere Modello IoMmu.