Adres wirtualny procesora GPU

W tym artykule opisano pojęcia dotyczące wirtualnego adresu procesora GPU (GPUVA) oraz sposób zarządzania nimi, począwszy od wersji WDDM 2.0 (Windows 10).

Procesy GPUVA są zarządzane na poziomie interfejsu sterownika urządzenia (DDI) na logicznych stronach o rozmiarze 4 KB lub 64 KB. Użycie tych rozmiarów stron umożliwia procesorom GPUVA odwołowanie się do jednej z następujących opcji:

  • Pamięć systemowa, która jest zawsze przydzielana z precyzją 4 KB.
  • Strony segmentu pamięci, którymi można zarządzać przy użyciu 4 KB lub 64 KB.

Menedżer pamięci wideo (VidMm) obsługuje wielopoziomowy schemat tłumaczenia adresów wirtualnych, na którym do tłumaczenia adresu wirtualnego służy kilka poziomów tabel stron:

  • Poziomy są numerowane od zera. Poziom zero jest przypisywany do poziomu liścia.
  • Tłumaczenie rozpoczyna się od tabeli stron na poziomie głównym.

Jeśli liczba poziomów tabeli stron wynosi dwa, można zmienić rozmiar tabeli stron na poziomie głównym, aby pomieścić proces ze zmiennym rozmiarem miejsca GPUVA. Każdy poziom jest opisany przez strukturę DXGK_PAGE_TABLE_LEVEL_DESC, którą sterownik wyświetlania trybu jądra (KMD) wypełnia podczas wywołania DxgkDdiQueryAdapterInfo. Usługa KMD wypełnia również strukturę DXGK_GPUMMUCAPS caps w celu opisania obsługi procesora GPUVA.

Każdy proces ma własną przestrzeń GPUVA. Zanim można ustawić kontekst graficzny procesu do wykonania, wywoływana jest funkcja DxgkDdiSetRootPageTable w celu ustawienia adresu tabeli stron głównych.

Translacja adresów wirtualnych dla dwóch poziomów tabeli stron jest pokazana na poniższym diagramie.

Diagram przedstawiający translację adresów wirtualnych z dwoma poziomami tabeli stron.

  • Procesor GPUVA ma DXGK_GPUMMUCAPS::VirtualAddressBitCount bitów.

  • Małe bity [0–11] reprezentują przesunięcie w bajtach na stronie.

  • Następny DXGK_PAGE_TABLE_LEVEL_DESC::PageTableIndexBitCount bity reprezentują indeks wpisu tabeli stron w tabeli stron na poziomie liścia.

  • Liczba wpisów w tabeli stron to 2DXGK_PAGE_TABLE_LEVEL_DESC::PageTableIndexBitCount, a rozmiar tabeli stron to DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes bajtów.

  • Pozostałe bity reprezentują indeks do wpisu tabeli stron w tabeli głównej strony. Tabela strony głównej może być zmieniana dla schematu translacji na poziomie dwóch poziomów. DxgkDdiGetRootPageTableSize DDI uzyskuje jego rozmiar.

Struktura DXGK_PTE jest używana za pośrednictwem interfejsu DDI do reprezentowania wpisu tabeli stron. Ta struktura reprezentuje informacje o każdym wpisie, którym zarządza jądro grafiki DirectX (Dxgkrnl). Sterownik używa tych informacji do tworzenia wpisów tabeli stron dla konkretnego sprzętu.

Tworzenie alokacji tabeli stron

Tabele stron są tworzone jako niejawne alokacje i nie mają sterownika trybu użytkownika (UMD) ani uchwytu KMD.

Aby przydzielić tabelę stron, VidMm przydziela alokację rozmiaru DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSizeInBytes z segmentu określonego w DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId. Po utworzeniu VidMm inicjuje każdy wpis w tabeli stron jako nieprawidłowy. Tabele stron nigdy nie zmieniają rozmiaru, z wyjątkiem tabeli strony głównej w schemacie translacji na poziomie dwóch poziomów.

VidMm obsługuje zmianę rozmiaru tabeli strony głównej w schemacie translacji na poziomie dwóch poziomów. Gdy jest tworzona tabela stron głównych obejmująca określoną ilość przestrzeni adresowej, VidMm wywołuje DxgkDdiGetRootPageTableSize w celu określenia wymaganego rozmiaru alokacji. VidMm następnie przydziela alokację o tym rozmiarze w segmencie, określonym przez DXGK_PAGE_TABLE_LEVEL_DESC::PageTableSegmentId dla poziomu głównego. Po utworzeniu VidMm inicjuje każdy wpis w tabeli stron jako nieprawidłowy, wykorzystując nową operację UpdatePageTable stronicowania. Główna tabela stron może powiększać się lub pomniejszać w miarę, gdy przestrzeń adresowa wideo potrzebna procesowi powiększa się lub kurczy. Po utworzeniu tabeli stron głównych VidMm wywołuje DxgkDdiSetRootPageTable, aby skojarzyć nowo utworzoną tabelę stron głównych z różnymi kontekstami, w których będą one wykonywać operacje.

W konfiguracjach połączonych kart wyświetlania tabele stron głównych są tworzone jako alokacje typu LinkMirrored. Te alokacje mają identyczną zawartość i znajdują się pod tym samym adresem fizycznym na każdym procesorze GPU w linku. Tabele stron niższego poziomu są przydzielane jako alokacja LinkInstanced, aby odzwierciedlić fakt, że ich zawartość może się różnić między procesorami GPU, zazwyczaj z powodu różnych mapowań równorzędnych. Zawartość tabel stron jest aktualizowana oddzielnie na wszystkich procesorach GPU.

Zwiększanie i zmniejszanie tabeli stron głównych

Ta sekcja ma zastosowanie tylko w przypadku systemów z dwoma poziomami tabel stron. Gdy liczba poziomów tabeli stron jest większa niż dwa, rozmiar tabeli stron dla każdego poziomu jest definiowany przez wirtualne limity adresowania i jest stały.

Gdy UMD żąda adresów GPUVA, VidMm zwiększa rozmiar przestrzeni adresowej procesu, aby uwzględnić to żądanie. W ten sposób rośnie rozmiar bieżącej tabeli stron głównych (w razie potrzeby) i przydzielając nowe tabele stron dla nowego zakresu.

Aby zwiększyć tabelę stron głównych, VidMm tworzy kolejną alokację tabeli stron głównych, robi ją rezydentną, inicjuje jej wpisy i niszczy starą alokację. Funkcja DxgkDdiGetRootPageTableSize służy do pobierania rozmiaru nowej tabeli stron w bajtach.

Aby zmniejszyć tabelę stron głównych, VidMm tworzy nową alokację tabeli stron, sprawia, że jest ona rezydentna, kopiuje część starej tabeli stron do nowej i niszczy starą alokację.

Po zakończeniu operacji zmiany rozmiaru VidMm wywołuje DxgkDdiSetRootPageTable, aby skojarzyć dotknięte konteksty z nową tabelą stron głównych.

Aktualizowanie tabeli stron

Gdy powierzchnie przemieszczają się w pamięci, VidMm aktualizuje zawartość tabel stron w celu odzwierciedlenia nowej lokalizacji powierzchni.

Przenoszenie tabeli stron

* VidMm może przenosić lub usuwać tabele stron, gdy urządzenie nie wykonuje żadnych operacji lub jest zawieszone. Gdy VidMm przenosi tabelę stron, aktualizuje tabelę stron wyższego poziomu, aby odwoływać się do nowej lokalizacji tabeli stron.

Gdy sama tabela stron głównych zostanie przeniesiona, VidMm wywołuje DxgkDdiSetRootPageTable, aby poinformować dotknięte konteksty o nowej lokalizacji ich katalogu stron.

Rozmiar strony fizycznej

Jak wspomniano wcześniej, VidMm obsługuje dwa rozmiary stron. Pamięć systemowa jest zawsze zarządzana w 4-KB stronach, podczas gdy segmenty pamięci mogą być zarządzane na poziomie 4-KB lub 64-KB szczegółowości określonej przez KMD.

Jeśli zdecydujesz się na zarządzanie pamięcią wirtualną na stronach 64 KB, wszystkie alokacje są automatycznie wyrównane i mają rozmiar wielokrotności 64 KB.

Rozszerzenie wszystkich alokacji do 64 KB może mieć znaczący wpływ na pamięć. UMD jest odpowiedzialny za pakowanie małych alokacji do większej, aby uniknąć marnowania pamięci.

Gdy VidMm mapuje procesor GPUVA na dużą stronę segmentu pamięci 64 KB, mapuje wpisy tabeli 4 KB na 16 ciągłych stron 4 KB w segmencie pamięci. Zarówno adres wirtualny, jak i adres fizyczny mają zagwarantowane to samo wyrównanie 64 KB. Oznacza to, że dolne 16 bitów adresu wirtualnego i adresu fizycznego są gwarantowane, że będą pasować.