O DirectX está chegando ao WSL

O que é WSL? WSL é um ambiente no qual os usuários podem executar seus aplicativos Linux a partir do conforto do seu PC com Windows. Se você é um desenvolvedor que trabalha com carga de trabalho em contêiner que será implantada na nuvem dentro de contêineres Linux, poderá desenvolver e testar essas cargas de trabalho localmente no seu PC com Windows usando as mesmas ferramentas nativas do Linux às quais está acostumado. Em resposta à demanda popular, esses aplicativos e ferramentas Linux agora podem se beneficiar da aceleração da GPU.

Apresentando o dxgkrnl (Linux Edition)

Dxgkrnl é um novo driver de kernel para Linux que expõe o dispositivo /dev/dxg ao Linux no modo de usuário. /dev/dxg expõe um conjunto de IOCTL que imita de perto a camada de serviço do kernel nativo WDDM D3DKMT no Windows. Dxgkrnl dentro do kernel do Linux se conecta pelo barramento da VM que utiliza essa conexão de barramento da VM para se comunicar com a GPU física.

Se o host tiver várias GPUs, todas as GPUs serão projetadas e disponíveis no ambiente Linux (supondo que todas essas GPUs estejam executando drivers WDDMv2.9).

Os aplicativos em execução no ambiente Linux têm o mesmo acesso à GPU dos aplicativos nativos no Windows. Não há particionamento de recursos entre Linux e Windows ou limite imposto a aplicativos Linux. O compartilhamento é completamente dinâmico, com base em quem precisa de quê. Basicamente, não há diferenças entre dois aplicativos Windows que compartilham uma GPU versus um Linux e um aplicativo Windows que compartilham a mesma GPU. Se um aplicativo Linux estiver sozinho em uma GPU, poderá consumir todos os seus recursos!

Supondo que você tenha o driver GPU correto instalado no host do Windows, o /dev/dxg é automaticamente exposto e disponível para qualquer distribuição WSL instalada sem a necessidade de instalar pacotes adicionais. Observe que a distribuição precisa estar em execução no modo WSL versão 2 ( wsl –set-version 2 ) para obter acesso à GPU.

Embora eles compartilhem um nome, a versão do dxgkrnl dentro do kernel do Linux é uma implementação limpa de um driver de GPU do Linux baseado em nosso protocolo GPU-PV e não compartilha nada mais em comum com o seu homólogo do Windows, de nome semelhante. A edição do Dxgkrnl Linux está sendo feita de código aberto e compartilhada com a comunidade. Enquanto trabalhamos na atualização deste novo driver, o código fonte está disponível na filial oficial do kernel Linux da Microsoft para o WSL 2.

O dxgkrnl esta disponivel no github.

DxCore e D3D12 no Linux

Esta é a API D3D12 real e completa, o libd3d12.so é compilado a partir do mesmo código fonte do d3d12.dll no Windows, mas para um destino Linux. Ele oferece o mesmo nível de funcionalidade e desempenho (menos sobrecarga de virtualização). A única exceção é Present (). No momento, não há integração de apresentação com o WSL, pois o WSL é uma experiência apenas do console hoje. A API do D3D12 pode ser usada para renderização e computação fora da tela, mas não há suporte para swapchain para copiar pixels diretamente na tela.

DxCore (libdxcore.so) é uma versão simplificada do dxgi, em que os aspectos herdados da API foram substituídos por versões modernas. O DxCore está disponível no Windows e Linux. O DxCore também é usado para hospedar uma versão simples da API D3DKMT usada por um driver baseado em WDDM no Windows para conversar com a GPU. Essa API abstrai as diferenças de como os vários serviços WDDM chegam ao kernel (tabela de serviços no Windows versus IOCTL no Linux).

O libd3d12.so e libdxcore.so são binários em modo de usuário pré-compilados de código-fonte fechado que são fornecidos como parte do Windows. Esses binários são compatíveis com as distribuições baseadas na glibc e são montados automaticamente em /usr/lib/wsl/lib e tornados visíveis para o carregador. Em outras palavras, essas APIs funcionam imediatamente, sem a necessidade de instalar pacotes adicionais ou ajustar a configuração da distribuição. Atualmente, o suporte está limitado a distribuições baseadas em glibc, como Ubuntu, Debian, Fedora, Centos, SUSE, etc.

Infografico lidd3d12

O D3D12 não seria capaz de operar sem um UMD (driver de modo de usuário específico) da GPU fornecido por nossos parceiros fabricantes de GPU. O UMD é responsável por coisas como compilar shaders em códigos de bytes específicos de hardware e converter solicitações de renderização da API em instruções reais da GPU em buffers de comando a serem executados pela GPU. Trabalhando em estreita colaboração com nossos parceiros, eles recompilaram seu D3D12 UMD para um destino Linux, permitindo a execução desses drivers em um ambiente WSL.

Esse suporte está sendo integrado nos próximos drivers WDDMv2.9, de modo que o suporte à GPU na WSL é fácil para o usuário final. Os drivers WDDMv2.9 levarão uma versão do DX12 UMD compilado para Linux. O pacote do driver host é montado dentro da WSL em /usr/lib/wsl/ drivers e diretamente acessível à API do d3d12. Se você possui um WDDMv2.

NVIDIA CUDA

O suporte para CUDA no WSL será incluído no driver WDDMv2.9 da NVIDIA. Semelhante ao suporte ao D3D12, o suporte para a API CUDA será instalado automaticamente e estará disponível em qualquer distribuição WSL baseada em glibc, se você tiver uma GPU NVIDIA. A biblioteca libcuda.so é implantada no host ao lado de libd3d12.so, montada e adicionada ao caminho de pesquisa do carregador usando o mesmo mecanismo descrito anteriormente.

Além do suporte CUDA, também irá ter suporte para as ferramentas NVIDIA-docker na WSL. A mesma carga de trabalho da GPU em contêiner que é executada na nuvem pode ser executada como está dentro da WSL. As ferramentas NVIDIA-docker não serão pré-instaladas, permanecendo um pacote instalável pelo usuário, mas o pacote agora será compatível e será executado na WSL com aceleração de hardware.

OpenGL, OpenCL e Vulkan

No Linux, os usuários geralmente utilizam APIs para gráficos, OpenGL, OpenCL ou Vulkan, recentemente, foi anunciado o trabalho de mapeamento de camadas que trará aceleração de hardware para OpenCL e OpenGL sobre o DX12. Será utilizado para essas camadas OpenGL e OpenCL para WSL acelerados por hardware através da biblioteca Mesa. Para distros que receberem essa atualização do Mesa, a aceleração será ativada automaticamente sempre que um driver WDDMv2.9 ou superior for instalado no host do Windows.

No caso do Vulkan, ainda não se tem muitos detalhes sobre o suporte ao Vulkan no Windows Subsystem Linux (WSL).

Deixe uma resposta
You May Also Like