DirectXのサポート計画
「WSL」上で動作するLinuxアプリから「DirectX」を経由したGPUの活用が可能になります。GPUの仮想化(GPU-PV)
Windowsで行われているGPU仮想化の取り組み及びその成果は、「WDDM(Windows Display Driver Model)」へ取り込まれており、「WDDM 2.5」以降のドライバーでネイティブなGPUの仮想化がサポートされています。このGPU仮想化は、GPU準仮想化(GPU Paravirtualization)とも呼ばれており、これを省略して「GPU-PV」とも表現されます。
仮想環境における「GPU-PV」は、VM(仮想マシン)やコンテナー内で動作するWindowsでのみ利用可能です。
言い換えれば仮想環境で動作するLinuxから「GPU-PV」は利用できません。
WDDMの拡張
「WDDM 2.9」では、GPUアクセラレーションを「WSL 2」で利用できるようにするため、Linuxゲストへ「GPU-PV」を提供する仕組みが追加されました。これは「GPU-PV」プロトコルを活用する新しいLinux kernelドライバーを通じて実現され、このドライバーによりLinuxのユーザーモードにGPUが公開(投影)されます。
Linux側に公開されるGPUの抽象化モデルは、「WDDM」が持つGPU抽象化モデルにほぼ沿った形になります。
これによりGPU抽象化モデルに沿って構築されたAPIやドライバーは、簡単にLinux向けに移植することができます。
Linux版dxgkrnl
Linux版「dxgkrnl」は新しいLinux kernelドライバーであり、「/dev/dxg」デバイスをLinuxのユーザーモードに提供します。Linux版ということは、Windows側で動作するWindows版「dxgkrnl」もあります。
「/dev/dxg」デバイスは、WindowsネイティブのWDDM D3DKMTカーネルサービスレイヤーをほぼ模倣した一連の「IOCTL」を提供します。
VM Bus経由で物理GPUにアクセスする
Linux kernel内で動作する「dxgkrnl」は「VM Bus」を使用し、Windowsホスト側の「dxgkrnl」に接続します。その後この「VM Bus」接続を使用して、物理GPUにアクセスします。
ホストに搭載されているすべてのGPUが利用可能
ホストに複数のGPUが搭載されている場合、それらのGPUが「WDDM 2.9」ドライバーで動作しているなら、それらのGPUはすべてLinux側に公開されます。LinuxアプリはWindowsアプリと同じようにGPUへアクセス可
LinuxアプリはWindowsアプリと同じようにGPUへアクセスすることができます。この時LinuxとWindows間でリソースの分割はありませんし、Linuxアプリに課される制限もありません。
GPUリソースの共有はGPUの利用状況に応じて動的に調整されます。
Windowsアプリ間で同一GPUを共有する状況と、WindowsとLinuxアプリ間で同一GPUを共有する状況は、基本的に同じです。
もしLinuxアプリのみがGPUを利用する場合、そのLinuxアプリはGPUの全リソースを活用できます。
WSL 2と適切なGPUドライバーが必要
LinuxアプリからGPUへアクセスするには、Windowsに適切なGPUドライバーがインストールされており、Linuxディストリビューションが「WSL 2」上で動作している必要があります。この条件を満たせば、Linux側に「/dev/dxg」デバイスが自動的に提供されます。
この時Linuxディストリビューション側に追加パッケージ等のインストール作業は必要ありません。
Linux版dxgkrnlはオープンソース
Linux版「dxgkrnl」はWindows版と同じ名称及び同じバージョンが付けられていますが、「GPU-PV」プロトコルに基づくLinux GPUドライバーをクリーンルーム方式で実装したものです。Windows版の同名の「dxgkrnl」とは、何も共有する実装はありません。
Linux版「dxgkrnl」のソースコードは、以下で参照できます。
Linux環境におけるDxCoreとD3D12
WDDM互換の抽象化されたGPUをLinux側に公開することで、主要なグラフィックAPIを再コンパイルし、Linux側へそれらのAPIを持ち込めるようになりました。これらのAPIは本物かつ完全な「D3D12 API」です。
libd3d12.so
「libd3d12.so」はLinux向けの共有ライブラリーであり、Windowsの「d3d12.dll」と同じソースコードからコンパイルされます。「libd3d12.so」は「d3d12.dll」と同じ水準の機能とパフォーマンスを提供します。
(ただしパフォーマンスに関しては、仮想化のオーバーヘッド分のコストが余計に掛かります。)
Present
唯一の例外は「Present()」です。現在「WSL」はコンソールのみが対象であり、「WSL」でプレゼンテーションの統合が存在しないためです。
「D3D12 API」はオフスクリーンレンダリングやコンピューティングに利用できますが、ピクセルを直接スクリーンにコピーするスワップチェーンのサポートはまだありません。
DxCore
「DxCore(libdxcore.so)」は「DXGI」の簡易バージョンであり、レガシーなAPIはモダンなAPIに置き換えられています。「DxCore」はWindows及びLinuxで利用可能であり、GPUと対話するためWindowsのWDDMベースのドライバーで使用される「D3DKMT API」のフラットバージョンをホストするために使用されます。
この抽象化APIは、様々なWDDMサービスがカーネルにアクセスする方法とは異なります。(Windowsのサービステーブル対LinuxのIOCTL)
libd3d12.soとlibdxcore.so
「libd3d12.so」と「libdxcore.so」はプリコンパイルされたユーザーモードバイナリー(ライブラリー)であり、クローズドソースで提供されます。またこれらのバイナリーは、Windowsの一部として提供されます。
これらのバイナリーは「glibc」ベースのLinuxディストリビューションと互換性があり、自動的に「/usr/lib/wsl/lib」以下にマウント(配置)され、ローダーからアクセスできるようになります。
つまりLinuxディストリビューション側で追加パッケージのインストールや設定の変更なしに、これらのバイナリーを利用できます。
現時点でこれらのバイナリーは、「Ubuntu」や「Debian」、「Fedora」、「Centos」、「SUSE」といった「glibc」ベースのLinuxディストリビューションでのみ利用可能です。
GPUベンダーとGPUドライバー
「D3D12」はGPUベンダーが提供する「UMD(ユーザーモードドライバー)」なしに動作することはできません。「UMD」には、シェーダーをハードウェア固有のバイトコードにコンパイルしたり、描画を要求するAPIをGPUで実行される実際のGPU命令に変換するといった役割があります。
GPUベンダーと連携し「D3D12 UMD」をLinux向けにも提供できるように、GPUドライバーの再コンパイルが実施されました。
このサポートは「WDDM 2.9」ドライバーに含まれ、「WSL」でGPUのサポートをシームレスにエンドユーザーに提供します。
また「WDDM 2.9」ドライバーは、Linux向けにコンパイルされた「DX12 UMD」版のドライバーを提供します。
ホストドライバーのパッケージは「/usr/lib/wsl/drivers」にマウント(配置)され、「D3D12 API」に直接アクセス可能です。
DirectMLとAIトレーニング
「D3D12」と「DxCore」に加え「ML API」も移植され、「WSL」上で動作するLinuxディストリビューションで「DirectML」が動作するようになりました。「DirectML」は「D3D12 API」の上に配置され、MLのワークロードに必要な機能を提供します。
目標
人気のあるMLツールやライブラリー、フレームワークと共にハードウェアアクセラレーションによる推論やトレーニング機能の統合を目標としています。しかし「DirectML」によるトレーニングワークフローのサポートにあたり、まずは学生や初心者をターゲットにしたサポートが行われます。
TensorFlowプレビューパッケージ
簡単に「DirectML」でトレーニングを始められるように、「DirectML」バックエンドを統合した「TensorFlow」のプレビューパッケージがリリースされます。OpenGLとOpenCLとVulkan
「OpenGL」と「OpenCL」でハードウェアアクセラレーションをサポートするマッピングレイヤーを「DX12」上に構築する取り組みが行われています。このレイヤーを使用して「Mesa」ライブラリーを通じ、「WSL」にハードウェアアクセラレーションをサポートした「OpenGL」と「OpenCL」を提供します。
Mesaのアップデートが必要になる
まだ作業は完了していませんが作業完了後に「WSL」でハードウェアアクセラレーションをサポートした「OpenGL」と「OpenCL」を利用するには、「Mesa」のアップデートが必要になります。「Mesa」をアップデートしWindowsホストに「WDDM 2.9」以降のドライバーがインストールされていれば、自動的にハードウェアアクセラレーションが有効になります。
Vulkanのサポートはまだこれから
「WSL」で「Vulkan」をどのようにサポートするのが最善なのか、現在調査や検討が行われています。今後詳しい内容が公開されるでしょう。
NVIDIA CUDA
「WSL」で「NVIDIA CUDA」が利用可能になります。「CUDA」はWindowsの「WDDM」ドライバーやLinuxのNVIDIA GPUドライバーを通じGPUを活用するクロスプラットフォームのAPIです。
libcuda.so
「/dev/dxg」デバイスによって提供される抽象化された「WDDM」を直接ターゲットにしたLinux向けCUDAを構築するため、NVIDIAと連携した作業が行われました。これは「cuDNN」「cuBLAS」「TensorRT」といった「CUDA-X」ライブラリーのアクセラレーションを有効にする「libcuda.so」の完全機能版です。
WDDM 2.9ドライバーで利用可能に
NVIDIAの「WDDM 2.9」ドライバーに「WSL」での「CUDA」サポートが含まれます。「D3D12」と同様に「NVIDIA GPU」を搭載したPCなら、「CUDA API」のサポートは自動的にインストールされ、「glibc」ベースのLinuxディストリビューションで利用可能になります。
「libcuda.so」ライブラリーはホスト上に「libd3d12.so」と共に配置され、前述した仕組みと同様にLinux側にマウントされ、それらのライブラリーをロードできるようにローダー検索パスが追加されます。
nvidia-dockerツール
「WSL」で「nvidia-docker」ツールもサポートされます。クラウドで実行されるコンテナー化されたGPUワークロードは、そのまま「WSL」内でも実行可能です。
「nvidia-docker」ツールはプリインストールされませんが、今日同様にユーザーがインストール可能なパッケージが提供されます。
このパッケージは互換性が確保され、「WSL」内でハードウェアアクセラレーションを利用できます。
Linux GUIアプリケーション
「WSL」でLinux GUIアプリケーションが利用可能になります。現在「WSL」はコンソールアプリのみが対象ですが、今後LinuxのGUIアプリもWindowsデスクトップ上で利用可能になります。
つまりWindowsアプリとLinuxアプリがWindowsデスクトップ上でシームレスに共存します。
今後の計画
「DxCore」「D3D12」「DirectML」「NVIDIA CUDA」のサポートは、数カ月以内にリリースされる「Windows Insiders Fast Ring」で利用可能になる予定です。「TensorFlow」のプレビューパッケージは、「PyPI.org」にある既存の「TensorFlow」パッケージと共に、インストール可能なPyPIパッケージとしてほぼ同時に利用可能になる予定です。
「OpenGL」と「OpenCL」のマッピングレイヤーとLinux GUIアプリのサポートは、上記のサポートよりももっと後になります。(時期未定)