Virtualização de GPU, como funciona e para que é usado

Uma das limitações das placas gráficas de desktops e laptops é a incapacidade de executar vários sistemas operacionais ao mesmo tempo ou máquinas virtuais. Essa diferenciação que algumas GPUs possuem é chamada de virtualização e neste artigo vamos explicar o que é e quais mudanças requer no hardware.

Antes da chegada do computador pessoal, as pessoas trabalhavam em terminais conectados a um minicomputador central, que se encarregava de realizar todas as tarefas. Com o advento da computação em nuvem rodando vários sistemas operacionais em máquinas virtuais, a virtualização não é necessária apenas em CPUs, mas também em GPUs.

Virtualização GPU

Por que a virtualização é necessária em GPUs?

A virtualização é a capacidade do hardware de criar várias versões de si mesmo para que possa ser usado por várias máquinas virtuais. Por exemplo, uma parte de um CPU que foi virtualizado será visto por um sistema operacional em execução em uma máquina virtual, enquanto outras máquinas virtuais verão outras partes da CPU como uma CPU única e distinta. Nesse caso, virtualizamos a CPU, pois criamos uma versão virtual de cada sistema operacional em execução no sistema.

No caso das GPUs, as listas de comandos para gráficos e computação são escritas em certas partes da memória em particular e, em geral, as GPUs que montamos em nossos PCs são projetadas para funcionar em um único sistema operacional sem nenhuma máquina virtual entre eles. .

Não é o caso das placas gráficas para data centers, onde normalmente estão rodando várias instâncias diferentes, máquinas virtuais, de um sistema operacional e é necessário que cada cliente acesse GPU. É neste caso que a virtualização em GPUs é necessária

Virtualização do lado da GPU

GPU AMD Vega

As GPUs também precisam de mudanças no nível do hardware para dar suporte à virtualização. Por causa disso, as placas gráficas com essa capacidade geralmente são vendidas apenas para mercados distantes dos PCs desktop e, portanto, têm um preço muito mais alto do que as GPUs desktop. Hoje você pode contratar o poder de uma GPU na nuvem para acelerar certos trabalhos científicos, renderizar uma cena remotamente para um filme ou série e assim por diante.

SR-IOV

SR-IOV

Cada periférico PCI Express possui um endereço de memória exclusivo no mapa de memória de cada PC. O que significa que, se estivermos usando um ambiente virtualizado, não podemos acessar o hardware que está conectado a essas portas, como placas de vídeo, muitas vezes. Normalmente, as máquinas virtuais que executamos em PCs desktop não têm a capacidade de usar a placa de vídeo, que só estará acessível para o sistema operacional convidado.

A solução para isso é SR-IOV, que virtualiza a porta PCI Express e permite que várias máquinas virtuais acessem esses endereços de memória simultaneamente. No PC, a comunicação periférica é feita por meio de chamadas para determinados endereços de memória. Embora hoje essas chamadas não correspondam a endereços de memória física, mas sim virtuais, a regra inviolável é que o conteúdo de um endereço de memória não pode ser manipulado por dois clientes ao mesmo tempo, pois então há conflitos quanto ao conteúdo dos dados.

O SR-IOV para funcionar precisa de um controlador de rede integrado no dispositivo PCI Express, no caso em que se trata de placa gráfica, que recebe as solicitações das diferentes máquinas virtuais que precisam acessar seus recursos.

Mudanças nas unidades de DMA para virtualização de GPU

Canales DMA

A primeira mudança ocorre nas unidades de DMA, essas unidades geralmente vêm em pares nas GPUs que usamos nos PCs e dão acesso aos RAM do sistema, não confundir com o VRAM, por meio de um canal alternativo. A cada frame a GPU terá que acessar para ler a lista de telas em uma parte da RAM ou terá que copiar os dados da RAM para a VRAM caso precise desses dados posteriormente. Isso usa uma unidade DMA em cada direção. No caso de GPUs com virtualização? Eles usam várias unidades DMA em paralelo ou uma unidade DMA com vários canais de acesso simultâneos .

A utilização dos diferentes canais pelas GPUs virtuais é gerida pelo controlador de rede integrado, que é responsável por gerir os pedidos à RAM, quer fisicamente quer a outro periférico também ligado à porta PCI Express. Portanto, se as diferentes GPUs virtuais precisam acessar, por exemplo, um SSD disco, eles o fazem através das unidades DMA.

Alterações de processador de comando GPU

Processadores Comandos Tipos

A segunda mudança está no processador de comandos. Todas as GPUs para computação sem gráficos no meio estão acostumadas a trabalhar em vários contextos ao mesmo tempo, isso porque são listas de comandos muito pequenas que se resolvem em pouco tempo, por outro lado se falamos de gráficos a coisa que muda completamente, uma vez que geralmente é usada uma única lista de comandos.

E quanto às GPUs não virtualizadas que usam vários monitores? Não é o mesmo que usar vários sistemas operacionais em máquinas virtuais, já que a lista de telas, nesses casos, vem de um único sistema operacional que indica à GPU a saída de vídeo pela qual cada imagem deve ser transmitida.

Portanto, é necessário implementar um processador de comandos gráficos especial, que funcione em conjunto com as unidades DMA e o controlador de rede integrado para funcionar não como um GPU, mas como vários GPUs diferentes e virtuais.

Os recursos da GPU são distribuídos na virtualização

Todas as placas gráficas contemporâneas são geralmente divididas em vários blocos dentro de outros blocos, por exemplo, se pegarmos o GA102 do NVIDIA RTX 3080 ou 3090 veremos que inicialmente é composto por vários GPCs, dentro dos quais existem vários TPCs e em cada TPC temos 2 SM.

Dependendo de como a distribuição dos recursos foi proposta pelo fabricante, podemos encontrar uma distribuição em que cada máquina virtual corresponde a um GPC, portanto no caso do GA102 estaríamos falando de uma virtualização da GPU em 7 diferentes. Embora também fosse possível fazê-lo no nível TPC, nesse caso podem ser criadas até 36 máquinas virtuais, mas como entendemos o poder de cada uma seria muito diferente.

Nas GPUs, o que é atribuído na NVIDIA é um GPC completo ou o que em AMD é conhecido como Shader Engine, pois cada uma dessas partes tem todos os componentes necessários para funcionar como uma GPU por si só. Nos casos em que a GPU virtualizada não é usada para renderização, mas para computação, a distribuição está no nível TPC ou seu equivalente em AMD RDNA, o WGP.