Condividi tramite


Indirizzo virtuale GPU

Gli indirizzi virtuali dell'unità di elaborazione grafica (GPU) vengono gestiti in pagine 4 KB logiche o 64 KB a livello DDI (Device Driver Interface). Ciò consente agli indirizzi virtuali GPU di fare riferimento alla memoria di sistema, che viene sempre allocata a una granularità di 4 KB o a pagine di segmento di memoria, che possono essere gestite a 4 KB o 64 KB.

La gestione della memoria video supporta uno schema di conversione degli indirizzi virtuali multivelo, in cui vengono usati diversi livelli di tabelle di pagine per convertire un indirizzo virtuale. I livelli sono numerati da zero e il livello zero viene assegnato al livello foglia. La traduzione inizia dalla tabella della pagina del livello radice. Quando il numero di livelli di tabella di pagina è due, la tabella della pagina radice può essere ridimensionata per supportare un processo con dimensioni variabili dello spazio degli indirizzi virtuali gpu. Ogni livello è descritto dalla struttura DXGK_PAGE_TABLE_LEVEL_DESC che viene riempita dal driver in modalità kernel durante una chiamata DxgkDdiQueryAdapterInfo. Il driver in modalità kernel compila anche la struttura dei limiti DXGK_GPUMMUC piattaforma di strumenti analitici per descrivere il supporto degli indirizzi virtuali GPU.

Ogni processo ha un proprio spazio indirizzi virtuale GPU. Prima di impostare un contesto grafico di un processo per l'esecuzione, il driver in modalità kernel otterrà una chiamata DxgkDdiSetRootPageTable che imposta l'indirizzo della tabella della pagina radice.

La conversione degli indirizzi virtuali per il caso di due livelli di tabella delle pagine è illustrata nel diagramma seguente.

Diagramma che mostra la conversione degli indirizzi virtuali per due livelli di tabella delle pagine.

L'indirizzo virtuale GPU ha bit DXGK_GPUMMUC piattaforma di strumenti analitici::VirtualAddressBitCount.

I bit bassi [0 - 11] rappresentano un offset in byte in una pagina. I bit successivi DXGK_PAGE_TABLE_LEVEL_DESC::PageTableIndexBitCount rappresentano l'indice di una voce di tabella di pagina in una tabella pagina a livello foglia.

Il numero di voci in una tabella di pagine è 2DXGK_PAGE_TABLE_LEVEL_DESC::P ageTableIndexBitCount e le dimensioni della tabella di pagina sono DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes byte.

Il resto dei bit rappresenta un indice di una voce di tabella di pagina nella tabella della pagina radice. La tabella di pagina radice è ridimensionabile per lo schema di conversione a 2 livelli e viene introdotto un nuovo DDI DxgkDdiGetRootPageTableSizeper ottenere le dimensioni.

La struttura DXGK_PTE viene utilizzata tramite DDI per rappresentare una voce di tabella di pagina. Questa struttura rappresenta informazioni su ogni voce, gestita dal kernel grafico Microsoft DirectX. Il driver usa queste informazioni per compilare voci di tabella di pagine specifiche dell'hardware.

Creazione di allocazioni di tabelle di pagine

Le tabelle di pagine vengono create come allocazioni implicite e non hanno un driver in modalità utente o un handle del driver in modalità kernel.

Per allocare una tabella di pagine, la gestione memoria video alloca un'allocazione di dimensioni DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes dal segmento, specificato in DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId. Dopo la creazione, la gestione memoria video inizializza ogni voce nella tabella di pagine in modo che non sia valida usando la nuova operazione di paging UpdatePageTable. Le tabelle di pagine non cambiano mai le dimensioni, ad eccezione della tabella della pagina radice nello schema di conversione a 2 livelli.

Gestione memoria video supporta il ridimensionamento della tabella di pagina radice nello schema di conversione a 2 livelli. Quando viene creata una tabella di pagina radice, che copre una quantità specificata di spazio indirizzi, il gestore della memoria video chiama il nuovo DDI DxgkDdiGetRootPageTableSizeper determinare le dimensioni di allocazione necessarie. Gestione memoria video alloca quindi un'allocazione di tale dimensione nel segmento, specificata da DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId per il livello radice. Dopo la creazione, la gestione memoria video inizializza ogni voce nella tabella di pagine in modo che non sia valida usando la nuova operazione di paging UpdatePageTable. La tabella della pagina radice può aumentare o ridursi man mano che la quantità di spazio indirizzi video richiesto da un processo si espande e si riduce. Dopo aver creato la tabella della pagina radice, il gestore della memoria video chiama il nuovo DDI DxgkDdiSetRootPageTableper associare la tabella di pagina radice appena creata al contesto che verrà eseguito all'interno.

Nelle configurazioni delle schede di visualizzazione collegate, le tabelle di pagina radice vengono create come allocazioni LinkMirrored , che hanno contenuto identico e si trovano nello stesso indirizzo fisico in ogni GPU nel collegamento. Le tabelle di pagine di livello inferiore vengono allocate come allocazione LinkInstanced per riflettere il fatto che il contenuto può variare tra GPU, in genere a causa di mapping peer diversi. Il contenuto delle tabelle di pagine viene aggiornato separatamente in tutte le GPU.

Aumento e compattazione di una tabella di pagine radice

Questa sezione è applicabile solo per i sistemi con due livelli di tabelle di pagine. Quando il numero di livelli di tabella di pagina è maggiore di due, le dimensioni della tabella di pagina per ogni livello vengono definite dai limiti di indirizzamento virtuale e sono fisse.

Quando il driver in modalità utente richiede indirizzi virtuali GPU, la gestione della memoria video aumenta le dimensioni dello spazio degli indirizzi di un processo per soddisfare la richiesta. Questa operazione viene eseguita aumentando le dimensioni della tabella della pagina radice corrente (se necessario) e allocando nuove tabelle di pagine per il nuovo intervallo.

Per aumentare le dimensioni di una tabella di pagine radice, il gestore della memoria video crea un'altra allocazione di tabelle di pagine radice, lo rende residente e inizializza le voci usando le operazioni UpdatePageTable e elimina definitivamente l'allocazione precedente. La funzione DxgkDdiGetRootPageTableSize viene usata per ottenere le dimensioni della nuova tabella di pagine in byte.

Per compattare una tabella di pagine radice, la gestione memoria video crea una nuova allocazione di tabelle di pagine, la rende residente, copia una parte della tabella di pagina precedente nel nuovo usando l'operazione di paging CopyRootPageTable e elimina l'allocazione precedente.

Al termine dell'operazione di ridimensionamento, il gestore della memoria video chiama dxgkDdiSetRootPageTable DDI per associare i contesti interessati alla nuova tabella della pagina radice.

Aggiornamento della tabella di pagine

Man mano che le superfici si spostano in memoria, la gestione memoria video aggiorna il contenuto delle tabelle di pagine in modo da riflettere la nuova posizione delle superfici. Questa operazione viene eseguita tramite le nuove DDI di paging UpdatePageTable.

Spostamento di una tabella di pagine

Le tabelle di pagine possono essere rilocate o rimosse dalla gestione della memoria video quando un dispositivo è inattiva o sospeso. Quando si sposta una tabella di pagine, gestione memoria video aggiorna la tabella delle pagine dei livelli più elevati per fare riferimento alla nuova posizione della tabella di pagine usando le DDI UpdatePageTable.

Quando la tabella della pagina radice stessa viene rilocata, la gestione della memoria video chiama l'DDI DxgkDdiSetRootPageTableper informare i contesti interessati della nuova posizione della directory della pagina.

Dimensioni pagina fisica

Come accennato in precedenza, la gestione della memoria video supporta due dimensioni di pagina. La memoria di sistema viene sempre gestita in pagine da 4 KB, mentre i segmenti di memoria possono essere gestiti con granularità di 4 KB o 64 KB, come determinato dal driver in modalità kernel.

Quando si sceglie di gestire la memoria virtuale in pagine da 64 KB, tutte le allocazioni vengono automaticamente allineate e ridimensionate in modo che siano multiple di 64 KB.

L'espansione di tutte le allocazioni a 64 KB può avere un impatto significativo sulla memoria. È responsabilità del driver in modalità utente comprimere le allocazioni di piccole dimensioni in uno più grande per evitare di sprecare memoria.

Quando si esegue il mapping di un indirizzo virtuale GPU a una pagina di segmento di memoria di 64 KB di grandi dimensioni, la gestione memoria video eseguirà il mapping delle voci della tabella di pagine da 4 KB a 16 pagine contigue di 4 KB nel segmento di memoria. Sia l'indirizzo virtuale che l'indirizzo fisico sono garantiti per condividere lo stesso allineamento di 64 KB ,ad esempio i 16 bit inferiori dell'indirizzo virtuale e l'indirizzo fisico sono garantiti per la corrispondenza.