Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

Windows 10: nová správa paměti pro grafické karty!

8.9.2015, Pavel Šantrůček, recenze
Windows 10: nová správa paměti pro grafické karty!
Windows 10 nepřinášejí pro hráče pouze nové DirectX 12, ale také novou verzi WDDM (Windows Display Driver Model). Zatímco na hry využívající DX12 si budeme muset ještě nějakou tu chvilku počkat, z výhod WDDM 2.0 můžeme u současných her těžit už nyní.

WDDM 2.0 Memory Management


Celý WDDM 2.0 byl upraven tak, aby si práci při renderingu, hlavně pak plánování a alokaci zdrojů, mohly organizovat grafické karty (ve spolupráci s řadičem) samy.

K tomuto účelu bylo zapotřebí přepracovat mnoho věcí, zejména pak nově přerozdělit práci UMD a KMD, zavést podporu Virtual memory a stanovit pravidla a nástroje pro efektivní správu paměti (Paging engine, Page faulting...).

Všechny tyto změny WDDM 2.0 pak musí podporovat také grafické karty samotné (a jejich ovladače). To však zase až takový problém není, protože grafické karty toto vše umějí již dávno, jen prostě nebyl prostor, kde toho využít. U WDDM 2.0 tento prostor grafické karty konečně dostaly.

Aby si grafická karta mohla plánovat svou práci sama, musí samozřejmě vědět, kde přesně v paměti jsou umístěné zdroje nutné pro samotný rendering (surfaces). U dřívějšího modelu WDDM 1.X byly tyto zdroje alokovány ve fyzické paměti kontinuálně. Protože však k této paměti neměla přístup pouze samotná aplikace (třeba hra), ale mohly ji využívat i aplikace jiné, mohlo se stát, že tyto surfaces byly přesunuty na jiné místo (adresu) fyzické paměti. Takovéto nečekané a neplánované přesunutí alokace zdrojů by samozřejmě mohlo být pro plánovač GPU osudné.

Z tohoto důvodu byla ve WDDM 2.0 zavedena paměť virtuální (Virtual memory), která je izolovaná a jedinečná pro danou aplikaci, takže žádná další aplikace ji využívat nemůže. Pokud jsou tedy alokovány nějaké zdroje v této virtuální paměti, k žádnému jejich neplánovanému přesunutí dojít nemůže a všechny alokované zdroje zůstávají po celou dobu jejich „životnosti“ na stejném místě (adrese uvnitř VM). Protože se jedná o paměť virtuální, nemusí být alokována pouze v lokální paměti GPU (VRAM), ale může přesahovat také do paměti systémové (RAM). Virtuální paměť je pak fyzicky rozdělena a spravována po blocích (pages) o velikosti 4 KB (nebo u VRAM také i 64 KB).

Je-li například ve virtuální paměti alokována nějaká textura, je rozdělena a zarovnána do těchto stránek (pages) tak, aby případná další textura začínala opět na stránce nové. Pro samotný rendering tak již není nezbytné používat texturu celou, ale jen tu její část, která je definována pouze některými stránkami (pages).


GpuMMU


Virtuální paměť tedy přináší nejen trvalou, neměnnou alokaci a rozdělení zdrojů (surfaces), ale díky tomu, že její alokace byla rozšířena také do prostoru systémové paměti (RAM), může být její celková velikost mnohem větší než ta, kterou fyzicky nabízí VRAM konkrétní grafické karty.

Samozřejmě grafická karta nemůže provádět rendering se zdroji (surfaces), které jsou umístěny v pomalé systémové paměti (kde je také umístěna část VM). Všechny zdroje nutné pro rendering (working set) musejí být fyzicky umístěny ve VRAM a grafická karta se proto také musí o přenos těchto zdrojů z RAM do VRAM postarat.

O přenosy zdrojů mezi RAM a VRAM se fyzicky stará Dedicated Paging Engine. Tento engine provádí takzvané stránkování (kopírování stránek mezi RAM a VRAM), kde ale nejsou přenášeny (kopírovány) zdroje celé, nýbrž pouze jejich jednotlivé části – stránky (pages), které jsou naprosto nezbytné pro aktuální práci GPU.

Dedicated Paging Engine pracuje pomocí DMA paralelně s 3D Enginem, což značí, že zatímco 3D Engine provádí rendering jednoho obsahu (snímku), Paging Engine může v tu samou chvíli provádět stránkovací operace na obsahu jiném (třeba kopírování stránek zdrojů do VRAM nutných pro rendering snímků následujících).

Pokud bychom mohli vše hodně zjednodušit, pak celý systém správy paměti pod WDDM 2.0 pracuje tak, že z paměti VRAM se stal pouze jakýsi zásobník (buffer), ve kterém jsou umístěny jen zdroje potřebné pro rendering aktuálního snímku (working set), nebo několika následujících snímků. Tento buffer je pak na jedné straně doplňován zdroji, potřebnými pro další práci GPU, z RAM a na straně druhé jsou z něj již (pro další práci) nepotřebné zdroje odstraňovány. Grafická karta má tedy vždy všechny potřebné zdroje ve VRAM a může tak bez přerušení renderovat snímky. Fakticky se jedná o podobné řešení virtuální paměti, jakým již nějaký ten pátek disponují operační systémy Windows, kdy je část obsahu operační paměti umístěna na HDD.

Menší nevýhodou paralelní práce Paging engine je pak konzumace určité části šířky pásma VRAM. Při stránkovacích operacích totiž Paging Engine musí ke VRAM přistupovat souběžně s 3D Enginem, který právě renderuje snímek a „okrádá“ ho tak o část šířky pásma VRAM při jeho práci.

Aplikujeme-li chování nového memory managementu na naši hru „Zabij padoucha“, mohlo by to vypadat asi nějak takto.

Všechny textury (surfaces), včetně té obrovské textury mapy světa, jsou alokovány ve virtuální paměti. Protože se ale celá textura světa do VRAM nevešla, je ve virtuální paměti alokována z větší části v RAM. Do VRAM je nataženo pouze to, co je potřeba pouze pro aktuální rendering (working set), tedy pouze ty stránky (pages) této obrovské textury, které obsahují mapu Česka, plus sousedící státy.

Paging Engine při hře sleduje využití zdrojů a při přechodu hranice Česka na Slovensko začne (paralelně k 3D Enginu) kopírovat do VRAM ty stránky textury světa, které obsahují mapu Ukrajiny. Stránky obsahující mapu Německa jsou pak zase z VRAM odstraněny.

Jak vidíte i přes to, že se všechny zdroje (surfaces) do VRAM nevešly, stačí, aby se do VRAM vešel především working set a rendering bude probíhat hladce - bez trhání. Pokud by hra takové nároky na zdroje neměla a do VRAM by se vešel celý surface, vše by probíhalo podobně jako dříve a k žádnému stránkování by nedocházelo.

Analogicky lze pak říci, že pokud vlastníte grafickou kartu s menší video pamětí, rendering bude probíhat podobně hladce a bez záseků jako u grafické karty, která disponuje VRAM daleko větší. Pokud jste majiteli grafické karty s pamětí naopak větší, máte větší pravděpodobnost, že se vám do VRAM vejde celý surface a vyhnete se tak stránkování paměti.

Na závěr našeho popisu WDDM 2.0 je třeba říci, že celá tato záležitost kolem správy paměti WDDM 2.0 je ještě mnohem složitější a rozsáhlejší, než co je popsáno v tomto článku. Záměrně jsme se vyhnuli problematice třeba kolem nového chování UMD (User Mode Driveru) a omezení funkcí KMD (Kernel Mode Driveru), vlastní alokaci zdrojů, ošetření přístupu k nealokované paměti (Page fault) nebo vylepšeného přepínání zdrojů (Context Switch). Na toto vše se snad dostane někdy příště, ale dnes nám šlo pouze o vysvětlení základních principů chování nové správy paměti ve WDDM 2.0.

Abychom však dnes nezůstali pouze u teorie, pojďme se na novou správu paměti WDDM 2.0 podívat také trochu z praxe a nějakou tu grafickou kartu si otestovat na reálných hrách pod Windows 10.
Doporučujeme náš velký přehled desktopových grafických čipů.