Após uma serie de tópicos recorrentes sobre o assunto de alternância de GPU no Linux, resolvi criar um tópico definitivo sobre o assunto, pois desde da primeira vez que tentei realizar essa alternancia muita coisa mudou e eu aprendi bastante. Esse texto será divido em duas partes: teoria e prática. As soluções serão apresentadas na parte prática (para os apressados), mas a parte teórica é importante para qualquer adaptação ou extrapolação dessas soluções pra outras situações, recomendo a leitura de ambas.
TeoriaGPUGPU (Graphics processing unit) nada mais é do que a nossa conhecida placa de vídeo, seja ela embutida na placa-mãe ou no processador, o que chamados de placa de vídeo on board ou GPU integrada, ou uma placa em separado dedicada apenas a processar vídeo, o que chamamos placa de vídeo dedicada ou GPU Discreta. Como convenção, iremos utilizar aqui as denominações “GPU integrada” e “GPU discreta” para nos referirmos a vídeos on board e off board respectivamente.
Hybrid CardÉ uma tecnologia que permite que uma mesma maquina se utiliza de mais de uma GPU, uma ou mais GPUs discretas e uma ou mais GPUs integradas (geralmente, uma de cada). Com isso, uma maquina pode alternar, ou seja, mudar de uma GPU pra outra de acordo com a necessidade.
Considerando que GPUs integradas tem uma grande capacidade de economia de energia, sendo ideais pra utilizar quando se precisa de pouco poder de processamento e baixo consumo energético (notebooks usando a bateria e sendo usados pra editar um texto, por exemplo). Já GPUs Discretas são ideias pra quando se precisa de grande poder de processamento (para jogos ou aplicativos gráficos mais exigentes) e não há preocupação com um gasto a mais de energia (notebooks ligados a tomada e sendo usados para rodar o jogo DOOM, por exemplo). Assim, é possível escolher a GPU que mais se adequa a necessidade do momento.
Atualmente, o exemplo mais evidente do uso dessa tecnologia são notebooks com processadores da linha core-i da intel, que possuem uma GPU integrada no próprio processador, e também utilizam uma GPU discreta AMD ATI ou NVIDIA. Outra situação comum são notebooks com processadores AMD e uma GPU integrada a placa-mãe, em conjunto com uma GPU discreta AMD ATI ou NVIDIA.
Essas duas combinações cobrem 90% das ocorrências de Hybrid Card, outras circunstancias podem ocorrer mas são casos pontuais. Por ser o caso mais comum, esse texto ira tratar especificamente de processadores core-i (i3, i5 ou i7) em conjunto com uma GPU AMD ATI (qualquer). Qualquer outro caso poderá ser resolvido com a extrapolação das soluções aqui propostas.
Alternado entre GPUsA alternância entre GPUs é realizada através de software, o que no Windows acontece de forma automática ou via demanda e sem a necessidade de reinicio do sistema. Isso se deve ao fato do software necessário ser disponibilizado pelos próprios fabricantes, o que garante bom funcionamento e estabilidade.
Já no linux, não há qualquer software proprietario disponível para resolver essa questão ate o momento em que escrevemos isso. O mais próximo da solução encontrada no Windows é um modulo do kernel desenvolvido a partir da versao 2.6.34 do mesmo, sendo incorporado como padrão a partir da versão 2.6.35. O nome desse modulo é VGAswitcheroo.
O VGAswitcheroo permite alternacia de GPU em sistemas GNU/Linux. Infelzimente funcionalidade do memso ainda é restrita se comparado ao que ocorre no Windows, já que no Linux é necessário o reinicio do X Server para que a mudança ocorra, o que provoca o reinicio da sessão. Alem disso, ainda não há qualquer software adequado a realizar mudanças por contexto (dependendo da situaçao energia/aplicativo utilizado) e o suporte a GPUs discretas NVIDIA ainda é altamente experiemental e instavel, tendo sido implementado muito recentemente via patch.
O VGAswitcherooO modulo VGAswitcheroo, a qual nos refererimos como switcheroo a partir de agora, é um modulo do kernel que se destina a realizar a alternacia de GPU em sistemas GNU/Linux, seu funcionamento é baseado na interaçao com um arquivo de texto (switch), que atraves de algumas palavras de comando especificas permite ligar, desligar e alternar entre GPUs.
VGAswitcheroo e versoes diferentes de kernelDependendo da versao do kernel utilizado, o switcheroo pode ter um comportamento diferente, o que faz com que uma sequência de passos especifica para implementar seu uso possa não funcionar universalmente, sendo necessário a analise caso a caso. Alem disso, configuraçoes especificas de hardware tambem podem exigir certa atençao especial.
No kernel 2.6.34 o switcheroo não vem ativado por padrão, caso seja necessário utiliza-lo com esse kernel será preciso recompilar o kernel habilitando a opção "EXTRAVERSION = -vgaswitcheroo" alem da montagem do diretorio /sys/kernel/debug. A realizaçao desse procedimento nao sera contemplada aqui, recomendamos sempre a atualizaçao do kernel.
Do kernel 2.6.35 em diante, o switcheroo vem ativado por padrão e o diretorio /sys/kernel/debug também já vira montado por padrão. Para as versoes 2.6.35 e 2.6.36 do kernel o arquivo switch não contem informações indicativas de qual das entradas nele presentes pertence a GPU integrada e qual pertence a GPU discreta, fazendo que com que seja necessário identifica-las de outras formas (esse assunto será melhor abordado a frente), alem disso, há um padrão de carregamento de módulos de vídeo que utiliza sempre a GPU integrada como padrão, carregando seu modulo primeiro e garantindo a inicializaçao do sistema.
Do 2.6.37 ate o kernel lançado ate o momento em que escrevemos (3.0.0) o arquivo switch contem informaçao de que entrada pertence a qual GPU, o que permite uma manipulaçao mais refinada do mudolo, mas em compensaçao a ordem de carregamento dos modulos de video não é mais padronizada, fazendo com que muitas vezes o sistema tente iniciar usando a GPU integrada mas o driver carregado seja o da GPU discreta, o que resulta em crash na inicializaçao do sistema.
VGAswitcheroo e drivers proprietariosAte o momento em que escrevemos esse texto, não é do nosso conhecimento qualquer compatibilidades entre o switcheroo e drivers proprietarios para GPUs AMD ATI ou NVIDIA. A instalaçao de drivers proprietarios desabilita o modulo e torna impossivel o uso do mesmo para alternar entre GPUs. Para que o modulo possa ser usado é necessario que apenas drivers livres (que já acompnham o próprio kernel) sejam utilizados.
Parametros passados ao kernel como “nomodeset” e “noapic”, alem de alguns procedimentos de correção de erros do Playmounth tambem podem desabilitar o modulo em questao, portanto, caso o diretorio do arquivo switch não esteja visivel mesmo com a opção para uso do switcheroo habilitada no kernel, sera necessario verificar essas questoes antes de qualquer outra.
Interagindo com o VGAswitcherooNa parte pratica, alguns scripts prontos serao apresentados para interagir com o switchroo, mas esses scripts não são nada alem de uma modo de implementar de forma mais facil e grafica os comandos necessarios a interaçao com o modulo. Esses comandos podem ser realizados manualmente caso seja necessario ou conveniente. Para tal, deve-se utilizar o comando “echo' atraves do shell, direcionando as palavras reservadas para o arquivo /sys/kernel/debug/vgaswitcheroo/switch, o comando deve ser realizado como root ou atraves do uso do 'sudo', pois só o root tem as permissoes necessarias para le-lo ou escrever nele. As palavras reservadas para uso como comando pelo modulo em questão e seus respectivos significados são:
ON – altera o estado de uma GPU secundaria, ou seja, que não esta sendo utilizada na sessão atual, de “desligada” para “ligada”.
OFF – altera o estado de uma GPU secundaria de “ligada” para “desligada ”.
DDIS – torna a GPU discreta, quando já não o for, a GPU primaria da sessão.
DIGD - torna a GPU integrada, quando já não o for, a GPU primaria da sessão.
os comandos ON e OFF podem ser executados normalmente, ja os os comandos DDIS DIGD necessitarao do reinicio do servidor X para que sejam aplicados, caso a GPU em correspondente ao comando ja nao seja a GPU primaria da sessao.
PraticaObserve as situaçoes abaixo e veja em qual delas se encaixa seu caso.
*Minha interface gráfica esta iniciando e o diretorio /sys/kernel/debug/vgaswitcheroo esta visivel.Se o seus sistema esta iniciando normalmente, e você apenas deseja poder usar toda a capacidade da sua GPU discreta, faça os teste realize os procedimentos a seguir e depois utilize o script correpondente ao seu caso. Para saber qual utilizar utilize o comando abaixo:
$ sudo cat /sys/kernel/debug/vgaswitcheroo/switch
se a sua saída for do tipo:
0:+:Pwr:0000:01:05.0
1: :Pwr:0000:02:00.0
ou seja, sem o identificador de tipo de GPU (DIS e IGD), use o script 1.
se a sua saída for do tipo
0:DIS: :Pwr:0000:01:00.0
1:IGD:+:Pwr:0000:00:02.0
ou seja, com o identificador de tipo de GPU (DIS e IGD), use o script 2.
*Minha interface grafica esta iniciando mas o diretorio /sys/kernel/debug/vgaswitcheroo nao esta visivel.Isso pode ocorrer em mais comumente nas seguintes situaçoes:
1) Sua versao do kernel é anterior a 2.6.35.
2) modulo VGAswitcheroo nao esta habilitado nas configuraçoes do kernel.
3) Ha um driver proprietario de GPU instalado no seu sistema.
4) Um dos modulos, seja o da GPU discreta ou do integrada, nao esta carregado.
5) durante o boot, os parametros “nomodeset” ou “vga=775” foram passados ao kernel.
6) Outros procedimentos afetaram o funcionamento do modulo.
Os casos mais comuns sao nº 3 e o nº 5, tambem sao os mais simples de solucionar, basta, respectivamente, desistalar o driver proprietario e retirar os parametros da inicializaçao no arquivo /boot/grub/menu.ls. Nos outros casos citados sera necessario uma melhor analise.
*Minha interface grafica nao esta iniciando.Se voce esta obtendo apenas uma tela preta na iniciializaçao, ha basicamente duas possibilidades
1) Ha um driver proprietario de GPU instalado no seu sistema.
2) O modulo da sua GPU discreta (no nosso caso, considerando uma GPU AMD ATI, sera o modulo ‘radeon’) esta sendo carregado antes do modulo da sua GPU integrada, levando o sistema ao crash.
A solucaçao do nº 1 é a mesma apresentada para o nº 3 na questao anterior, a diferença esta no fato de que, para poder faze-lo, sera necessario restaurar as configuraçoes de video padrao atraves do console de recuperaçao, para isso, durante o boot do sistema presione a tecla “esc” ou, elguns casos “g’ ou “e’, para entrar na tela de seleçao do grub (em caso de multiboot a tela aparecera automaticamente). no menu que abrir selecione a opçao de correçao de video e dentro dela selecione a opçao de usar uma configuraçao padrao de video. isso permitra que a interface grafica inicie e voce podera seguir os passos da opçao acima.
ja a soluçao para o nº 2 é adicionar o modulo em questao a blacklist. Para faze-lo siga os seguintes passos:
Entre no modo de recuperaçao como no passo acima, ou acesse o arquivo via live cd. abra o terminal e faça:
$ sudo nano /etc/modprobe.d/blacklist.conf
adicione o seguinte conteúdo ao fim do arquivo
# Inativando modulo de video ATI
blacklist radeon
Apos isso, use a combinaçao de teclas crtl+O para salvar, aperte enter, e em seguida crtl+x para sair, ao reiniciar o problema a interface grafica deve funcionar normalmente.
*Minha GPU discreta é uma NVIDIA.Nao tenho nenhuma experiencia com o uso do switcheroo em conjunto com GPUs NVIDIA, e inicialmente esse modulo so tinha suporte a GPUs AMD ATI, mas nos ultimos meses APARENTEMENTE surgiu um patch nao so para user os GPUs NVIDIA como tambem APARENTEMENTE permite instalar e usar o driver proprietario NVIDIA. deve chamar atençao para as palavras em maiusculas, ou seja, nada disso foi confirmado. Mas caso queria achance de testar (e tenha o hardware adequado) abaixo segue o link da PPA que APARENTEMENTE disponibiliza o patch.
https://launchpad.net/~kayo-k11-4/+archive/nv-switcherooos scripts que se seguem dependem do zenity, se nao o tiver instalado, instale-o.
################################################################
########################### SCRIPT 01 ###########################
################################################################
#!/bin/bash
#Script para alternar entre placas de video by kriador
#versao 20110429 para ubuntu+kernel 2.6.38
#subindo o modulo radeon
modprobe radeon
#checando que placa é a integrada
VGAIGD=`lspci | grep VGA | grep Integrated | cut -c4-5`
if [ "$VGAIGD" == "01" ]
then VGADIS="02"
elif [ "$VGAIGD" == "02" ]
then VGADIS="02"
else
then VGADIS="XX"
fi
#Checando status das GPUs
STATEDIS=`cat /sys/kernel/debug/vgaswitcheroo/switch | grep :$VGADIS: | cut -c2-8`
STATEIGD=`cat /sys/kernel/debug/vgaswitcheroo/switch | grep :$VGAIGD: | cut -c2-8`
#Definindo status das GPUs
if [ "$STATEDIS" == ":+:Pwr:" ] && [ "$STATEIGD" == ": :Pwr:" ] || [ "$STATEDIS" == ":+:Pwr:" ] && [ "$STATEIGD" == ": :Off:" ]
then
VGASTATE="GPU para Alto Desempenho"
VGAOFF="GPU para Economia de Energia"
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
elif [ "$STATEDIS" == ": :Pwr:" ] && [ "$STATEIGD" == ":+:Pwr:" ] || [ "$STATEDIS" == ": :Off:" ] && [ "$STATEIGD" == ":+:Pwr:" ]
then
VGASTATE="GPU para Economia de Energia"
VGAOFF="GPU para Alto Desempenho"
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
else
VGASTATE="Erro de Leitura de estado"
VGAOFF="Erro de Leitura de estado"
fi
#pegando o PID do X
PIDX=`pgrep X`
#criando a dialog
zenity --question --title "VGA Switcher" --text "Unidade Grafica Atualmente Em Uso:\n\n$VGASTATE\n\nDeseja Alternar para $VGAOFF ?"
#realizando a mudança
if [ "$?" == "0" ]
then
if [ "$STATEDIS" == ":+:Pwr:" ]
then
echo ON > /sys/kernel/debug/vgaswitcheroo/switch
echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
zenity --warning --title "VGA Switcher" --text "Alternando para GPU Integrada\nSua Sessão será reiniciada"
kill $PIDX
elif [ "$STATEIGD" == ":+:Pwr:" ]
then
echo ON > /sys/kernel/debug/vgaswitcheroo/switch
echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
zenity --warning --title "VGA Switcher" --text "Alternando para GPU Discreta\nSua Sessão será reiniciada"
kill $PIDX
else zenity --warning --title "VGA Switcher" --text "Houve um erro inesperado, por favor notificar a criador desse script no e-mail kriador@gmail.com"
fi
else exit
fi
################################################################
########################### SCRIPT 02 ###########################
################################################################
#!/bin/bash
#Script para alternar entre placas de video by kriador
#versao 20110429 para ubuntu+kernel 2.6.38
#subindo o modulo radeon
modprobe radeon
#Checando status das GPUs
STATEDIS=`cat /sys/kernel/debug/vgaswitcheroo/switch | grep :DIS: | cut -c6-12`
STATEIGD=`cat /sys/kernel/debug/vgaswitcheroo/switch | grep :IGD: | cut -c6-12`
#Definindo status das GPUs
if [ "$STATEDIS" == ":+:Pwr:" ] && [ "$STATEIGD" == ": :Pwr:" ] || [ "$STATEDIS" == ":+:Pwr:" ] && [ "$STATEIGD" == ": :Off:" ]
then
VGASTATE="GPU para Alto Desempenho"
VGAOFF="GPU para Economia de Energia"
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
elif [ "$STATEDIS" == ": :Pwr:" ] && [ "$STATEIGD" == ":+:Pwr:" ] || [ "$STATEDIS" = ": :Off:" ] && [ "$STATEIGD" = ":+:Pwr:" ]
then
VGASTATE="GPU para Economia de Energia"
VGAOFF="GPU para Alto Desempenho"
echo OFF > /sys/kernel/debug/vgaswitcheroo/switch
else
VGASTATE="Erro de Leitura de estado"
VGAOFF="Erro de Leitura de estado"
fi
#pegando o PID do X
PIDX=`pgrep X`
#criando a dialog
zenity --question --title "VGA Switcher" --text "Unidade Grafica Atualmente Em Uso:\n\n$VGASTATE\n\nDeseja Alternar para $VGAOFF ?"
#realizando a mudança
if [ "$?" == "0" ]
then
if [ "$STATEDIS" == ":+:Pwr:" ]
then
echo ON > /sys/kernel/debug/vgaswitcheroo/switch
echo DIGD > /sys/kernel/debug/vgaswitcheroo/switch
zenity --warning --title "VGA Switcher" --text "Alternando para GPU Integrada\nSua Sessão será reiniciada"
kill $PIDX
elif [ "$STATEIGD" = ":+:Pwr:" ]
then
echo ON > /sys/kernel/debug/vgaswitcheroo/switch
echo DDIS > /sys/kernel/debug/vgaswitcheroo/switch
zenity --warning --title "VGA Switcher" --text "Alternando para GPU Discreta\nSua Sessão será reiniciada"
kill $PIDX
else zenity --warning --title "VGA Switcher" --text "Houve um erro inesperado, por favor notificar a criador desse script no e-mail kriador@gmail.com"
fi
else exit
fi
Sugiro, e espero a anuencia da moderaçao, para que qualquer duvida, sugestao, correçao ou critica futura no tocante a questao de VGAswitcheroo deva ser tratada nesse topico. Estou disponivel para qualquer esclarecimento sobre o assunto (se estiver dentro das minhas capacidades), obrigado.