Como lidar com placas gráficas híbridas usando o PRIME

O processamento gráfico híbrido consiste em uma solução envolvendo 2 GPUs gráficas — cada qual dedicada a uma determinada tarefa.
O suporte a este tipo de solução ainda é experimental no Linux, mas está avançando a cada dia.
Se você tem um notebook com uma configuração deste tipo, sugere-se que você instale a versão mais atual do kernel ou use a versão mais atual da sua distribuição GNU/Linux favorita.

O PRIME GPU offloading e o Reverse PRIME são um conjunto de tentativas para dar suporte muxless a sistemas de processamento gráfico híbrido dentro do kernel Linux.
Se você tiver instalados o DRI2 e um kernel atual, provavelmente poderá usar o recurso.

Em notebooks, configurações híbridas de processamento gráfico tem várias utilidades. Uma delas é prover poder de processamento avançado em 3D quando o equipamento estiver ligado na tomada — uma vez que, nestas atividades, o consumo de energia é maior.
Quando você estiver em deslocamento e sem a possibilidade de usar o laptop conectado à rede elétrica, este se limita a fazer uso da GPU interna/integrada, com menos poder de processamento e, portanto, bem mais econômica.

A idéia é semelhante a dos carros híbridos movidos a combustíveis derivados de petróleo/energia elétrica.

Outro cenário é o uso predominante da GPU integrada que, além de mais econômica, esquenta menos. O calor interno é uma das maiores preocupações dos projetistas do seu notebook.
Quando a carga de trabalho aumenta, a segunda GPU é mais eficiente na execução das tarefas e no consumo.
A AMD, bem como a NVIDIA, oferece placas gráficas híbridas em conjunto com a Intel.
Uma dos efeitos indesejados de uma má configuração é as 2 placas ficarem ligadas simultaneamente, causando o sobreaquecimento e ruído excessivo, causado pela ventoinha (fan).
Como consequência do sobreaquecimento, o BIOS reduz o clock do processador, velocidade do disco rígido etc. para proteger o computador.
laptop dell inspiron 14 5000 special edition amd radeon and intel core i7 badge
Este post irá abordar a configuração de um hardware de processamento gráfico híbrido AMD/Intel em um notebook com a distro GNU/Linux Debian 9 “Stretch”, com kernel 4.5, com o GNOME (sem o Wayland).
Os procedimentos podem ser aplicados, com as devidas adequações, a outras placas de vídeo e a outras distros Linux — sem problemas! 😉
Clique nos links para obter informações mais detalhadas sobre o assunto em questão e dê uma olhada no final do arquivo para encontrar as referências deste texto.
Se você quiser compartilhar com os outros leitores, os detalhes de como está lidando com sua configuração híbrida, use a sessão de comentários.
O hardware examinado consiste em uma configuração de processamento gráfico híbrido, composta por uma placa Intel Broadwell U, com 256 MiB RAM e uma AMD/ATI Radeon R7 M260/265 com 2 GiB, que fazem parte de uma das edições do laptop Dell Inspiron 14 5000.

A GPU ou placa gráfica secundária é comumente chamada, também, de add-on card, discrete card, GPU secundária etc. Apesar do que estas nomenclaturas possam dar a entender, ela é, na maioria das vezes, a GPU mais poderosa.

Pôr este hardware para funcionar, sem usar software proprietário, vai ser algo muito difícil.
Mas vamos começar trabalhando com o que a gente tem — uma instalação padrão do Debian 9 “non-free”, que já vem com alguns firmwares e aplicativos proprietários mínimos para rodar o principal destas GPUs.
Para medir o desempenho do sistema, vamos fazer uso do glmark2 e do Unigine — este segundo é uma ferramenta de benchmarking que ajuda a levar a sua GPU ao stress extremo.

Como obter informações e diagnosticar suas placas gráficas

Com a ferramenta lshw, somado ao comando grep, é possível inquirir o seu sistema para obter dados dos seus componentes.
Veja alguns exemplos de funcionamento:

sudo lshw -short | grep display
/0/100/2                  display        Broadwell-U Integrated Graphics
/0/100/1c.4/0             display        Topaz XT [Radeon R7 M260/M265]

Pra ficar bem claro, a primeira (Intel Broadwell), é a placa integrada à placa-mãe. A segunda (Radeon), é a placa secundária, com recursos de renderização avançados 3D.
Tecnicamente, a segunda GPU é chamada discrete GPU.
Use a opção ‘-class’ para obter informações mais detalhadas, com o lshw

sudo lshw -class display
  *-display               
       description: VGA compatible controller
       product: Broadwell-U Integrated Graphics
       vendor: Intel Corporation
       physical id: 2
       bus info: pci@0000:00:02.0
       version: 09
       width: 64 bits
       clock: 33MHz
       capabilities: msi pm vga_controller bus_master cap_list rom
       configuration: driver=i915 latency=0
       resources: irq:50 memory:c1000000-c1ffffff memory:d0000000-dfffffff ioport:5000(size=64)
  *-display UNCLAIMED
       description: Display controller
       product: Topaz XT [Radeon R7 M260/M265]
       vendor: Advanced Micro Devices, Inc. [AMD/ATI]
       physical id: 0
       bus info: pci@0000:04:00.0
       version: 00
       width: 64 bits
       clock: 33MHz
       capabilities: pm pciexpress msi cap_list
       configuration: latency=0
       resources: memory:b0000000-bfffffff memory:c0000000-c01fffff ioport:3000(size=256) memory:c2000000-c203ffff memory:c2040000-c205ffff

Acima, o termo UNCLAIMED pode significar que o kernel não reconhece os drivers instalados da placa, que os módulos não estão carregados ou, simplesmente, que ela não está em uso.
O comando lspci pode dar uma pista sobre se os módulos relativos ao dispositivo estão carregados ou não:

sudo lspci -knn | grep -A 2 -i "display\|vga"

… e parece que sim.

00:02.0 VGA compatible controller [0300]: Intel Corporation Broadwell-U Integrated Graphics [8086:1616] (rev 09)
	Subsystem: Dell Broadwell-U Integrated Graphics [1028:0643]
	Kernel driver in use: i915
	Kernel modules: i915
--
04:00.0 Display controller [0380]: Advanced Micro Devices, Inc. [AMD/ATI] Topaz XT [Radeon R7 M260/M265] [1002:6900]
	Subsystem: Dell Topaz XT [Radeon R7 M260/M265] [1028:0643]
	Kernel modules: amdgpu

Note que a linha kernel driver in use está presente para a placa gráfica integrada Intel, mas não para a segunda placa.
O comando xrandr, tão útil para configurar o monitor, pode ser usado para listar os dispositivos provedores de gráficos:

xrandr --listproviders 
Providers: number : 1
Provider 0: id: 0x48 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 5
 associated providers: 0 name:Intel

Como você pode ver, o xrandr não consegue estabelecer contato com a segunda provedora gráfica, ou graphic provider. Ele só enxerga a primeira.
Neste caso, é necessário carregar o módulo de kernel ‘amdgpu’:

sudo modprobe amdgpu

Se o módulo amdgpu não estiver instalado, veja, a seguir, como fazer isso.

Como encontrar software de drivers, bibliotecas e módulos nos repositórios Debian para a minha GPU

Você pode usar o ‘apt search’ para fazer uma busca por itens instaláveis, nos repositórios para a sua placa.

apt search amdgpu

Você pode obter informações detalhadas sobre qualquer item, usando o comando ‘apt show’:

apt show firmware-amd-graphics

A linha de comando acima irá mostrar uma relação (bem extensa) de chipsets suportados pelos firmwares contidos no pacote.
Para instalar o pacote, use o apt:

sudo apt install firmware-amd-graphics

Reinicie o sistema, após a instalação para poder ver a segunda placa:

xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x78 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 5 associated providers: 0 name:Intel
Provider 1: id: 0x4f cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 0 outputs: 0 associated providers: 0 name:TOPAZ @ pci:0000:04:00.0

Como direcionar a execução de programas para a placa gráfica secundária

Para continuar, é necessário mais um curto procedimento, com o uso do xrandr.
No resultado, logo acima, cada Provider tem um código id em hexadecimal (0x78 e 0x4f).
Esta informação é que será usada no comando abaixo:

xrandr --setprovideroffloadsink 0x4f 0x78

Agora é possível usar o glxinfo para obter informações sobre o segundo provedor gráfico:

DRI_PRIME=1 glxinfo | grep -i "opengl renderer"
_
OpenGL renderer string: Gallium 0.4 on AMD ICELAND (DRM 3.1.0, LLVM 3.8.0)

Se apareceu a palavra “AMD”, no meu caso, então o procedimento correu como esperado.
Daqui para frente, e possível direcionar a execução do glmark2 e de qualquer outro aplicativo para a discrete GPU, agregando o comando “DRI_PRIME”:

DRI_PRIME=1 glmark2
_

ou para a GPU integrada …

DRI_PRIME=0 glmark2
_

Avalie os scores.
Após o “DRI_PRIME”, é possível executar qualquer outro programa que necessita do processamento 3D, inclusive o steam:

DRI_PRIME=1 steam
_

Conclusão

Esta abordagem, por um lado, ajuda a obter controle sobre a GPU discrete.
Mas o resultado para mim não foi bom e traz o inconveniente de ter que repetir o processo ‘xrandr –setprovideroffloadsink’, a cada vez que eu reiniciar a máquina.
Se o resultado for bom para você, então é melhor colocar este comando na inicialização — isto resolve o inconveniente.
Você ainda pode elaborar scripts curtos que executem o “DRI_PRIME=1” junto ao comando de execução de seus aplicativos (jogos) que fazem uso de renderização 3D.
Se você não conseguiu resolver o seu problema, espero que este texto tenha te dado algumas ferramentas para entender melhor o seu hardware, para prosseguir pesquisando.

Referẽncias

https://wiki.debian.org/AtiHowTo#Supported_Devices

Publicado por

Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como “Rick and Morty” e “BoJack Horseman”.
Me siga no Twitter e vamos trocar ideias!

2 thoughts on “Como lidar com placas gráficas híbridas usando o PRIME”

  1. Obrigado amigo, eu queria muito um aprofundamento nessa parte em relação ao opensuse, mas esse tópico foi de grande ajuda. inclusive o opensuse foi o que se deu melhor no meu Notebook Dell Inspiron com AMD 7730HD.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *