Hlavní navigace

Revoluce: Microsoft vydává DirectX pro Linux (ale jen pro Windows 10)

Microsoft již brzy zpřístupní ve Windows 10 věci jako DirectX / Direct3D 12, CUDA či OpenGL, OpenCL a DirectML. Pracuje také na obecné podpoře běhu linuxových GUI aplikací pod Windows 10.
David Ježek
Doba čtení: 7 minut

Sdílet

Microsoft představil novinku pro Windows Subsystem for Linux v2 (WSL2), kdy na něm umožní provozovat obecně GPU akceleraci, a to jak DirectX jako taková, tak výpočetní záležitosti kolem OpenCL či CUDA, díky spolupráci s Nvidií.

Po otevření DirectX, resp. jejich implementaci pro Linux volají hráči už mnoho let. Často se to používá jako jeden z hlavních argumentů v debatě o tom, proč mají Windows stále tak dominantní postavení. V následujících řádcích si však ujasníme, že Microsoft sice de facto vydal DirectX pro linuxový systém, ale ne v podobě, která by umožnila provozovat DirectX na Linuxu. Stále celá ta věc musí mít pod sebou Windows 10 a má to určité architektonické důvody.

Virtualizace GPU pro WSL 2

V několika posledních vydáních Windows Microsoft pracoval na modelu ovladačů Windows Display Driver Model, který by umožňoval virtualizaci GPU (první verze WDDM 1.0 se objevila s Windows Vista přibližně před 14 lety). Ta se začala objevovat s vydáním WDDM 2.5 (přišla s Windows 10 October 2018 Update, alias Version 1809). Pokud ovladač grafické karty či grafického jádra obecně podporuje WDDM 2.5, pak podporuje virtualizaci GPU. Tuto technologii Microsoft označuje jako WDDM GPU Paravirtualization, zkráceně GPU-PV. Využita je samotným Microsoftem například v Windows Defender Application Guard, Windows Sandbox či emulátoru Hololens 2. Dosud je omezena jak na Windows hosty (tedy Windows běžící uvnitř virtuálního stroje nebo v kontejneru), což se nyní změní.

Nová verze rozhraní WDDM 2.9 totiž přinese tuto věc do WSL 2, GPU-PV bude přístupné i linuxovým hostům. Stane se tak v první polovině roku 2021. API i ovladače budou moci být sestaveny tak, aby využívaly příslušné abstrakce, která už je k dispozici pro Windows hosty a kterou lze snadno portovat pro Linux.

Ovladač DirectX pro linuxové jádro


Autor: Microsoft

A tím se dostáváme možná k tomu nejzajímavějšímu. Aby vše mohlo fungovat, musí samozřejmě vedle podpory na straně Windows a jejich subsystému WDDM být i podpora v Linuxu (která pak bude využita ve WSL 2).

Microsoft tak přichystal jaderný ovladač pro Linux označený dxgkrnl, který zpřístupňuje zařízení /dev/dxg v uživatelském módu na Linuxu. A zařízení /dev/dxg se stará o přístup k sadě IOCTL, která věrně napodobují nativní servisní vrstvu WDDM D3DKMT ze samotných Windows. Zjednodušeně řečeno se tak ovladač dxgkrnl v Linuxu propojuje přes VM Bus ke svému velkému bratru Windows a používá toto spojení ke komunikaci s fyzickým GPU. Tento odstavec se sluší zakončit citátem reklamního sloganu z uvedení Windows Vista: Řekněte WOW!

Pokud má hostitel více GPU, všechna tato GPU jsou k dispozici v linuxovém prostředí (samozřejmě za předpokladu, že jejich ovladače umí WDDM 2.9). Každopádně technicky vzato tak linuxové aplikace běžící ve WSL 2 mají stejně kvalitní přístup ke GPU jako nativní Windows aplikace. Nejsou zde žádná omezení a řízení toho, kdo dostane jaké zdroje z GPU se řídí tím, co kdo zrovna potřebuje. Pokud tedy běží jediná aplikace vyžadující GPU, tak bez ohledu na to, zdali běží ve WSL 2 nebo ne, může dostat 100 % zdrojů/výkonu GPU.

Zařízení /dev/dxg je přitom automaticky viditelné pro libovolnou linuxovou distribuci, kterou by uživatel v rámci WSL 2 chtěl provozovat (distro samozřejmě musí běžet ve WSL 2 režimu). Nevyžaduje žádné další balíčky. A jak vyplývá z logicky přítomnosti ovladače dxgkrnl v Linuxu, tento ovladač byl vyvinut jako open-source a jeho zdrojový kód je k dispozici na GitHubu pod GPL v2.0.

Direct3D 12 pro Linux

Princip je tedy takový: linuxové systémy běžící ve WSL 2 mohou plně využívat možností GPU, které běží v rámci samotných Windows 10. Vše je z hlediska architektury plně transparentní, akcelerace funguje naplno. A tak není důvodu, aby linuxové systémy ve WSL 2 neměly k dispozici i 3D akcelerační API Direct3D 12.


Autor: Microsoft

Direct3D 12 API je tak plně k dispozici, bez omezení. Knihovna libd3d12.so je pro WSL 2 kompilována ze stejných zdrojových kódů jako originální d3d12.dll a nabízí stejný výkon (mínus drobounká režie virtualizace) a funkčnost. Chybí pouze podpora Present(), tedy prezentace, jelikož WSL je zatím konzolová záležitost. Jinak toto Direct3D 12 API podporuje i rendering a výpočty offscreen, prozatím ale bez možnosti posílat pixely v případě potřeby na obrazovku.

Další součástí je DxCore ( libdxcore.so), což je zjednodušená verze dxgi, kde už jsou legacy DirectX záležitosti nahrazeny jejich moderní verzí. DxCore je k dispozici pro Windows i Linux a také umožňuje hostovat lehčí verzi D3DKMT API, kterou ovladače založené na WDDM používají ke komunikaci s GPU – toto API dělá abstrakci nad tím, jak různé WDDM služby přistupují ke kernelu (servisní tabulka na Windows vs. IOCTL na Linuxu).

Knihovny libd3d12.so a libdxcore.so mají uzavřený kód a jsou poskytovány jako předkompilované binárky v rámci Windows. Jsou kompatibilní s distribucemi využívajícími glibc a automaticky se mountují do /usr/lib/wsl/lib, přičemž jsou viditelné při načítání. API tak funguje samo o sobě bez nutnosti cokoli nastavovat či doinstalovávat nějaké balíčky. Podpora je kvůli glibc v tuto chvíli omezena na distribuce jako Ubuntu, Debian, Fedora, Centos, Suse atd.

Ke svému běhu potřebuje Direct3D 12 samozřejmě podporu od výrobců DPU, kteří přichystají příslušný user mode driver (UMD). Dlužno připomenout, že zas tolik jich není, vedle AMD, Intelu a Nvidie už prakticky nikdo další na x86 platformě Windows není. UMD pak zodpovídá za věci jako kompilace shaderů na specifický kód pro dané GPU, překlad požadavků API na konkrétní instrukce GPU atd. Microsoft na tomto úzce spolupracoval s výrobci GPU, a tak nyní hrdě hlásí, že jejich Direct3D 12 UMD se podařilo upravit pro překlad na Linux a běhu tak z tohoto hlediska nic nebrání.

Souběžně se pak objeví jak nová verze WSL (o které je tento článek), tak WDDM 2.9 ovladače od výrobců GPU. Jinak hostitelské ovladače jsou ve WSL přimountovány v /usr/lib/wsl/drivers  a jsou tak přímo přístupné použití s Direct3D 12 API.

DirectML a AI


Autor: Microsoft

Navíc k D3D12 a DxCore portují inženýři Microsoftu do Linuxu pod WSL také firemní API pro strojové učení, DirectML. To v hierarchii sedí nad Direct3D 12 API a poskytuje uživateli sadu výpočetních operací pro tento typ úloh. Zpočátku zde Microsoft bude implementovat podporu věcí pro studenty a začátečníky, do budoucna ale bude funkcionalita narůstat tak, aby bylo možné DirectML používat i v profi nasazení. K dispozici je nyní například balíček TensorFlow s integrovaným DirectML backendem. Studenti mohou využít tutoriály atd. Tedy až vše bude zveřejněno (což má nastat v nějakém rozumném horizontu, podrobnosti ve videu).

OpenGL, OpenCL či Vulkan

Nyní už hledíme trochu víc do budoucnosti. Microsoft začal pracovat na podpoře na Linuxu tradičních API od Khronos Group, tedy OpenGL, OpenCL (a Vulkan).


Autor: Microsoft

Co se týče OpenGL a OpenCL, probíhají práce na mapovací vrstvě, které přinese hardwarovou akceleraci OpenCL a OpenGL nad DirectX 12. Pro WSL tuto podporu zajistí použití projektu Mesa. A až budou práce hotovy, postačí, aby distribuce dostala aktuální balík Mesa a vše bude fungovat. Vše samozřejmě bude opět závislé na tom, že GPU poběží s ovladačem splňujícím WDDM 2.9 (či vyšším).

Ohledně Vulkanu zatím reálné práce na implementaci nezačaly. Programátoři v Microsoftu momentálně řeší, kterou konkrétní cestou se v podpoře tohoto API pod WSL vydat.

Nvidia CUDA pod WSL

Když už tedy umí Microsoft přímo zpřístupnit GPU v Linuxu ve WSL 2, pak není důvod, aby vedle Direct3D či OpenGL a OpenCL na tomto systému neběželo nejpoužívanější GPGPU API, tedy CUDA od Nvidie. CUDA sama o sobě je samozřejmě od začátku multiplatformní, takže běhat může jak přes WDDM abstrakci na Windows, tak přes GPU abstrakci na Linuxu. Microsoft s Nvidií spolupracoval na vytvoření varianty CUDA pro Linux, která bude přímo cílit na WDDM abstrakci, kterou obstarává ve WSL 2 právě ovladač /dev/dxg. Varianta není omezena, použitá knihovna libcuda.so podporuje akceleraci CUDA-X knihoven jako cuDNN, cuBLAS či TensorRT.


Autor: Microsoft

Podpora pro CUDA přes WSL bude zahrnuta v budoucím Nvidia ovladači s podporou WDDM 2.9. Podobně jako u Direct3D 12, i CUDA API zde pak bude automaticky nainstalováno a zpřístupněno na všech distrech stavějících na glibc stejnou cestou, jaká je výše popsána pro  libd3d12.so.

Vedle podpory CUDA také do WSL 2 míří docker nástroje Nvidia, takže stejné využití Nvidia GPU, jaké je možné v kontejnerizované podobě, bude možné i pod WSL. Nástroje Nvidia-docker ale nebudou automaticky předinstalovány, tak jako dosud si je bude uživatel doinstalovávat, ale budou nově obsahovat podporu pro hardwarovou akceleraci pod WSL.

Kompletní podrobnosti shrnuje text na webu Nvidie.

Aplikace s GUI

Zatímco dnes je WSL de facto záležitostí příkazové řádky, s příští verzí přinese vedle výše uvedeného i obecně podporu aplikací s GUI. Uživatelé Windows 10 tak budou moci spouštět linuxové aplikace vedle svých standardních windowsových. Jak konkrétně to bude fungovat po technické stránce, to se prý dozvíme zase někdy příště.

tip_Ansible

Kdy novinky WDDM 2.9 čekat

V rámci Windows Insider Fast se objeví WDDM 2.9 již brzy a s ním i výše uvedené věci jako DxCore, D3D12, DirectML a Nvidia CUDA. Ve stejné době přinese Microsoft preview TensorFlow v podobě instalovatelného PyPI balíčku. Podrobnosti k celé věci lze sledovat přímo u Microsoftu.

Podpora mapovací vrstvy pro OpenGL/OpenCL a GUI aplikací se objeví později, taktéž nejprve v Insider buildu – podrobnosti se objeví v release notes k Windows Insider a v aktualizacích blogu.