2020年6月17日にリリースされたWindows 10 Insider Previewの最新バージョン「Build 20150」にて、WSLがNVIDIAのコンピューティングプラットフォーム「CUDA」をサポートしました。この機能強化により、Linuxのみに対応している計算ソフトや専門的なツールを、WSL上で動作させることが可能になります。
WSL1は「LXCore」と呼ばれるプログラムを経由してLinuxのアプリケーションを提供していたため、動作不可能なLinuxアプリケーションも存在していました。それに対して最新版のWSL2からは実際のLinuxカーネルをHyper-V上で動かすことで、ほとんどのLinuxアプリケーションを動作させることが可能になっています。WSL2やGPU準仮想化技術の「GPU-PV」により、DirectXのサポートなど、WSL上でのGPU計算が実現したわけです。
そして新たに、WSLがCUDAをサポートしました。WSLでCUDAを有効にするためには、まずNVIDIAのGPUを搭載したPCにWindows 10 Insider Previewの最新バージョン「Build 20150」をインストールする必要があります。さらに、WDDM2.9に対応したNVIDIAのプレビュー版GPUドライバーをホストOSにインストールし、WSL2を利用する必要があるとのこと。通常のWindowsで使用されるDirextX用カーネルドライバー「dxgkrnl」と、Linux用カーネルドライバー「dxgkrnl」はVM Busで接続されており、露出しています。それに対して、CUDAドライバーの「libcuda」は共有ライブラリ「libdxcore」を経てGPUを利用するという仕組みを採用しました。
機械学習ライブラリのTensorFlowをWSL上で動作させている様子が以下。WSLのターミナルである左下の赤枠部分に「Geforce GTX 1070」の文字が見えます。NVIDIAはWSL上でCUDAを動作させるプロジェクトに積極的に取り組み、調整を行っていくとのこと。また、GPU-PVによるパフォーマンスの低下をできるだけ減らしていくとNVIDIAはコメントしています。
NVIDIAはWSLによるCUDAサポートに加え、DockerコンテナでホストOSのGPUを利用可能にする「NVIDIA Container Toolkit」のWSL対応も発表。これによりWSL上で動作するDockerコンテナでもGPUが利用できるようになります。「libnvidia-container」ライブラリによってlibdxcoreが検知され、CUDAライブラリなどとともにコンテナ内に取り込まれるという仕組みになっています。
WSL上のDockerコンテナでN体シミュレーションを実行した画像も公開されており、「GeForce GTX 1070」という赤文字が見えることから、GPUがホストOSからWSL、そしてDockerコンテナへパススルーされていることがわかります。
dxgkrnlドライバーを含んだプレビュー段階のWSL2用Linuxカーネルは、以下からソースコードを確認することができます。