DirectX即将进入Linux的Windows子系统

2020-05-20 01:03:12

在//Build 2020上,我们宣布GPU硬件加速即将进入Windows Subsystem for Linux2(WSL2)。

什么是WSL?WSL是一个环境,用户可以在其中舒适地在Windows PC上运行他们的Linux应用程序。如果您是一名开发人员,正在处理将部署在Linux容器内的云中的集装化工作负载,则可以使用您熟悉的本地Linux工具在您的Windows PC上本地开发和测试这些工作负载。为了响应大众需求,这些Linux应用程序和工具现在可以从GPU加速中获益。

这个博客的目的是让您了解这种支持是如何实现的,以及各个部分是如何组合在一起的。

在过去的几个Windows版本中,我们一直忙于开发客户端GPU虚拟化技术。该技术集成到WDDM(Windows显示驱动程序模型)中,并且所有WDDMv2.5或更高版本的驱动程序都具有对GPU虚拟化的本机支持。该技术称为WDDM GPU半虚拟化,简称GPU-PV。GPU-PV现在是Windows的基础部分,用于Windows Defender Application Guard、Windows沙盒或Hololens 2模拟器等场景。如今,这项技术仅限于Windows来宾,即在VM或容器内运行的Windows。

为了给WSL2带来对GPU加速的支持,WDDMv2.9将把GPU-PV的覆盖范围扩展到Linux客户。这是通过一个新的Linux内核驱动程序实现的,该驱动程序利用GPU-PV协议向用户模式Linux公开GPU。GPU的计划抽象严格遵循WDDM GPU抽象模型,允许轻松移植针对该抽象构建的API和驱动程序,以便在Linux环境中使用。

Dxgkrnl是一个全新的Linux内核驱动程序,它将/dev/dxg设备暴露给用户模式Linux。/dev/dxg公开了一组IOCTL,它们非常类似于Windows上的本机WDDM D3DKMT内核服务层。Linux内核中的Dxgkrnl通过VM总线连接到Windows主机上的老大哥,并使用此VM总线连接与物理GPU通信。

如果主机有多个GPU,则所有GPU都会被投影并可用于Linux环境(假设所有这些GPU都运行WDDMv2.9驱动程序)。

在Linux环境中运行的应用程序与Windows上的本机应用程序具有相同的GPU访问权限。Linux和Windows之间没有资源分区,也没有对Linux应用程序施加限制。共享是完全动态的,基于谁需要什么。共享一个GPU的两个Windows应用程序与共享同一个GPU的Linux和Windows应用程序基本上没有区别。如果Linux应用程序单独运行在GPU上,它可能会消耗所有资源!

假设您在Windows主机上安装了正确的GPU驱动程序,则/dev/dxg会自动公开,并可用于安装的任何WSL发行版,而无需安装任何额外的软件包。请注意,发行版需要在WSL版本2模式(wsl-set-version<;divero>;2)下运行才能访问GPU。

尽管它们共享一个名称,但Linux内核中的dxgkrnl版本是基于我们的GPU-PV协议的Linux GPU驱动程序的净室实现,并且与其类似名称的Windows对应版本没有任何共同之处。Dxgkrnl Linux版正在开源,并与社区共享。在我们将这个新驱动程序上传的过程中,可以在微软针对WSL2的官方Linux内核分支中找到源代码。

在Linux中为GPU投射与WDDM兼容的抽象,使我们能够重新编译,并在运行在WSL中时将我们首屈一指的图形API带到Linux上。

这是真实和完整的D3D12API,没有模仿、伪装或在这里重新实现…。这才是真正的交易。libd3d12.so是从与Windows上的d3d12.dll相同的源代码编译而来,只是针对的是Linux目标。它提供相同级别的功能和性能(减去虚拟化开销)。唯一的例外是Present()。目前还没有与WSL集成的演示文稿,因为WSL目前只是一种控制台体验。D3D12API可以用于屏幕外渲染和计算,但是没有交换链支持将像素直接复制到屏幕上(还没有😊)。

DxCore(libdxcore.so)是dxgi的简化版本,其中API的传统方面已被现代版本取代。DxCore在Windows和Linux上都可用。DxCore还用于托管D3DKMT API的平面版本,Windows上基于WDDM的驱动程序使用该API与GPU通信。此API抽象了各种WDDM服务如何进入内核的差异(Windows上的服务表与Linux上的IOCTL)。

libd3d12.so和libdxcore.so是作为Windows一部分提供的封闭源代码、预编译的用户模式二进制文件。这些二进制文件与基于glibc的发行版兼容,自动挂载在/usr/lib/wsl/lib下,并使加载器可见。换句话说,这些API开箱即用,无需安装额外的软件包或调整发行版的配置。目前的支持仅限于基于glibc的发行版,如ubuntu、debian、feora、centos、suse等…。

如果没有我们的GPU制造商合作伙伴提供的GPU特定用户模式驱动程序(UMD),D3D12将无法运行。UMD负责将着色器编译为硬件特定的字节代码,并将API渲染请求转换为命令缓冲区中的实际GPU指令,以便由GPU执行。他们与我们的合作伙伴密切合作,将他们的D3D12 UMD重新编译为Linux目标,从而能够在WSL环境中执行这些驱动程序。此支持将集成到即将推出的WDDMv2.9驱动程序中,以便最终用户可以无缝地支持WSL中的GPU。WDDMv2.9驱动程序将携带为Linux编译的DX12 UMD版本。主机驱动程序包安装在WSL内部的/usr/lib/wsl/driver处,并可由d3d12API直接访问。如果您有WDDMv2.9驱动程序…。GPU神奇地出现在WSL中,变得完全可用。

除了D3D12和DxCore之外,我们还移植了我们的机器学习API DirectML,以便在WSL中运行时可以在Linux上运行。我们将DirectML的性能机器学习推理功能引入Linux,并扩展了它的功能以支持培训工作流!DirectML位于我们的D3D12 API之上,为机器学习工作负载提供计算操作和优化的集合。

DirectML团队的目标是将这些硬件加速的推理和培训功能与流行的ML工具、库和框架相集成。在使用DirectML支持培训工作流时,我们首先将重点放在学生和初学者的ML工作流上。我们希望确保大学生和行业工程师能够利用Windows硬件的广度来学习和获得新的ML技能。利用DirectML为这些学生和初学者提供了一条简单的途径来利用其现有系统中的硬件加速,方法是从在WSL 2中运行的基于Linux的ML工具进入支持DirectX 12的GPU。

随着我们投资于扩展DirectML的功能,与我们的硅合作伙伴的出色协作对于确保Windows生态系统中的GPU的广度从这些以ML为重点的投资中受益至关重要。这就是为什么我们很兴奋地宣布DirectML的培训将从今年夏天开始进入预览版!

为了让我们的客户更容易开始使用DirectML进行培训,我们发布了一个集成了DirectML后端的TensorFlow预览包。学生和初学者将能够开始使用TensorFlow教程,并为他们的未来奠定基础。此外,我们正在与TensorFlow社区接触,并正在进行RFC测试过程!预览版公开后,我们将继续进行投资,为DirectML添加新功能,并通过TensorFlow继续改进其端到端培训功能,使您的培训工作流程更加完善。

如果您对DirectML硬件加速的操作培训感兴趣,请查看标题为Windows AI:Windows设备上的硬件加速ML的//Build Skill会话。

在Linux上,用户通常使用Khronos API进行图形处理。那么,OpenGL、OpenCL或Vulkan对GPU加速的支持如何呢?

我们最近宣布了在映射层方面的工作,这将在DX12之上为OpenCL和OpenGL带来硬件加速。我们将使用这些层通过MESA库向WSL提供硬件加速的OpenGL和OpenCL。在我们的工作完成之后,WSL发行版将需要更新MESA来加速。对于获取此MESA更新的发行版,只要在Windows主机上安装了WDDMv2.9或更高版本的驱动程序,就会自动启用加速。

那伏尔坎呢?我们仍在探索如何最好地在WSL中支持Vulkan,并将在未来分享更多细节。另外,我们不能一次透露我们所有的计划,😊。

我们很高兴地宣布,NVIDIA CUDA加速也将进入WSL!CUDA是一个跨平台API,可以通过Windows上的WDDM GPU抽象或Linux上的NVIDIA GPU抽象与GPU通信。

我们与NVIDIA合作构建了一个用于Linux的CUDA版本,该版本直接针对/dev/dxg公开的WDDM抽象。这是libcuda.so的全功能版本,可以加速CUDA-X库,如cuDNN、cuBLAS、TensorRT。

NVIDIA的WDDMv2.9驱动程序将包含对WSL中的CUDA的支持。与D3D12支持类似,如果您有NVIDIA GPU,对CUDA API的支持将在任何基于glibc的WSL发行版上自动安装并可用。将libcuda.so库与libd3d12.so一起部署在主机上,并使用前面描述的相同机制将其挂载并添加到加载器搜索路径。

除了CUDA支持之外,我们还在WSL中引入了对NVIDIA-docker工具的支持。在云中执行的容器化GPU工作负载可以在WSL内部按原样运行。NVIDIA-docker工具将不会预装,而是像今天一样保留为用户可安装的软件包,但该软件包现在将兼容并在具有硬件加速的WSL中运行。

有关WSL即将推出的NVIDIA CUDA支持的更多详细信息和最新消息,请访问http://developer.nvidia.com/cuda/wsl.。

在//build,我们宣布WSL将支持Linux GUI应用程序。虽然今天的WSL只是一种控制台体验,但很快您就可以在Windows桌面上与其他Windows应用程序一起使用您最喜欢的Linux IDE或其他GUI应用程序。

像素将如何在Linux应用程序和托管它们的Windows桌面之间流动,各种窗口将如何集成到统一和无缝的体验中?这将是另一个“时代周刊”(Time😊)的故事。

如果你已经读到这一点,你可能会对所有这些东西感到兴奋,现在想知道你什么时候才能真正开始玩它!

Windows Insider Fast Build即将推出对DxCore、D3D12、DirectML和NVIDIA CUDA的支持。快速环目前在我们的锰(锰)OS分部。我们预计Fast Ring将在6月下旬切换到我们的Iron(Fe)分支,这将向内部人士展示这一新功能。TensorFlow的预览将与PyPI.org中现有的TensorFlow包一起作为可安装的PyPI包提供。在这一点上,您将能够复制所有这些很酷的//构建演示😊。要获得预览,请关注aka.ms/gpuinwsl,如果您对完善我们在ML的未来投资感兴趣,请花点时间完成我们的调查。

稍后将通过Insider Build Fighting提供对OpenGL/OpenCL映射层和GUI应用程序的支持。随着我们接近准备好这些技术,我们将通过Windows Insider版本发行说明和博客更新来通知您。