微软在//build 2020大会上宣布,适用于Linux的Windows子系统WSL 2(Windows Subsystem for Linux 2)开始支持GPU硬件加速,简单来说,微软发布了一个虚拟GPU驱动程序,将虚拟化的GPU暴露给Windows主机上,在虚拟机中执行的用户模式应用程序,而这样可以让WSL 2环境中的Linux虚拟机,能够和Windows主机共享GPU,实现GPU硬件加速。
WSL是一个可以在Windows上执行Linux应用程序的环境,因此当开发者要开发在云中部署的Linux容器应用程序,则可以先在Windows上进行本地开发和测试,而为了要支持更广泛的应用,现在微软让Linux应用程序和工具,也可以在WSL中获得GPU加速。
微软在过去一段时间,发展了客户端GPU虚拟化技术,而这项技术现在已经集成到了Windows显示驱动程序模型(WDDM)中,所有WDDM v2.5以及更高版本的驱动程序,都原生支持GPU虚拟化。微软提到,这项技术被称为WDDM GPU半虚拟化(GPU Paravirtualization),已经是Windows基础的一部分,被用在Windows Defender、Application Guard、Windows Sandbox和Hololens 2模拟器等使用案例,不过目前这项技术还仅限于Windows访客使用,像是在Windows中执行的虚拟机以及容器。
将GPU加速带入WSL 2,是通过WDDM将GPU半虚拟化扩展到Linux访客,而这依赖新的Linux核心驱动程序实例,该驱动程序利用半虚拟化协议将GPU暴露给用户模式的Linux,GPU投射抽象遵循WDDM GPU抽象模型,并将针对该抽象所构建的API和驱动程序,移植到Linux环境中使用。
Dxgkrnl是一个全新的Linux核心驱动程序,会将/dev/dxg设备暴露给用户模式Linux,微软提到,当主机上有多个GPU,则所有GPU都会提供给Linux环境使用,在Linux环境中执行的应用程序,其对GPU访问权限和在Windows上的主机应用程序相同,Linux和Windows之间没有资源分区,也没有对Linux应用程序设下限制,资源共享是完全动态的,取决于当下哪个程序需要什么资源。微软强调,共享GPU的两个Windows应用程序,和共享GPU的Linux和Windows应用程序没有差别,当只有Linux应用程序需要GPU,那该应用程序将占用所有GPU资源。
由于要在Linux投射兼容WDDM的抽象,因此微软便重新编译图形API DirectX,使其可以在WSL环境中的Linux上运行,微软提到,这个是真正完整的D3D12 API,并非模拟或是重新实例,libd3d12.so是使用Windows上d3d12.dll相同的程序代码编译而来,在不考虑虚拟化造成的影响,其提供与Windows相同等级的功能和性能。唯一例外是Present,D3D12 API目前可用于屏幕外渲染和运算,但尚未支持Swapchain将像素直接复制到屏幕上。
除此之外,微软还移植了机器学习API DirectML,现在DirectML可在WSL中的Linux上运行,因此开发者将可以在Linux执行高性能机器学习训练和预测功能。DirectML创建在D3D12 API之上,提供优化的机器学习工作负载运算集合,为了简化开发者使用DirectML的工作,微软还发布集成DirectML后端的TensorFlow预览组件,加速初学者上手。
而且WSL也将会支持Nvidia CUDA加速功能,CUDA是跨平台API,可以借由Windows上的WDDM GPU抽象,或Linux上的Nvidia GPU抽象和GPU沟通,微软和Nvidia合作构建Linux的CUDA版本,该版本针对/dev/dxg暴露的WDDM抽象,微软提到,这是libcuda.so的完整功能版本,可以用来加速cuDNN、cuBLAS、TensorRT等CUDA-X函数库。
另外,WSL还支持Nvidia的Docker工具,让原本在云计算中执行的容器化GPU工作负载,也可以搬到WSL上执行,微软提到,他们不会在用户计算机上预装Nvidia Docker工具,而是跟目前一样,让用户选择安装软件组件包,只是新的软件组件兼容WSL并且提供硬件加速功能。