👉 歡迎加入T客邦telegram ( https://t.me/TechbangNEWS )
透過GPU虛擬化加速WSL2
Windows Subsystem for Linux(以下簡稱WSL)為能夠在Windows作業系統原生執行Linux執行檔(ELF格式)的相容層,可讓開發人員接在Windows執行GNU/Linux環境中大部分的命令列工具、公用程式和應用程式,使用者也能將Linux容器部署於WSL並執行,簡化了程式開發與測試流程,而Microsoft也推出了改善執行效能的WSL2。
在近期的Windows更新中,Microsoft花了許多心力於繪圖處理器(Graphics Processing Unit,以下簡稱GPU)虛擬化,並在WDDM(Windows Display Driver Model)2.5版之後支援原生GPU虛擬化,並將WDDM GPU半虛擬化(WDDM GPU Paravirtualization,以下簡稱GPU-PV)技術應用於Windows沙盒、Hololens 2模擬器等情境,但目前技術限制僅能支援在Windows環境中執行的虛擬機器或容器等Windows客戶機(Guest)。
為了能在WSL2中使用GPU加速功能,Microsoft在WDDM 2.9中將GPU-PV延伸至Linux客戶機,並由Linux核心中的Dxgkrnl驅動程式,透過虛擬機器的VM Bus連接至Windows宿主機(Host),如此一來Linux環境下的使用者模式(User Mode)程式就能與實體GPU溝通並存取其資源。
WDDM 2.9還能支援多路GPU,讓Linux程式得以存取所有GPU,同時它也沒有設下任何權限限制,WSL2中的程式能與Windows宿主機動態調整共享GPU資源,如果只有Linux應用程式佔用GPU,它甚至能享有全部資源。
加速AI應用程式
Microsoft透過libd3d12.so與libdxcore.so函數庫為WSL2提供完整的D3D12與DxCore功能,但因為WSL2沒有圖型化介面,僅提供命令列介面,雖然D3D12 API支援畫面外繪圖(Offscreen Rendering),但不支援可以將畫面複製到螢幕的Swapchain,因此繪圖功能的實用價值並不大。
值得注意的是,Microsoft為WSL2移植了許多AI、機器學習所需的API,首先D3D12中整合了DirectML,能針對機器學習運算的效能最佳化。至於Linux使用者比較常用的OpenGL、OpenCL、Vulkan等API部分,WSL2透過映射層(Mapping Layer)將OpenCL和OpenGL硬體加速功能架構於DirectX 12之上,來解決相容性問題,而Vulkan的相關細節將於未來公布。
而業界常見的NVIDIA CUDA加速,則能讓程式透過Windows的WDDM GPU抽象層或Linux上的NVIDIA GPU抽象層與GPU溝通以相容CUDA-X函數庫(libcuda.so),以達到相容cuDNN、cuBLAS、TensorRT等運算框架的效果。
雖然libd3d12.so和libdxcore.so仍是閉源程式,但Microsoft已將Linux版Dxgkrnl開源並與社群共享,有興趣的讀者可以在GitHub上取得更多資訊。