Economizando energia em notebooks com gráficos híbridos no Linux

Economizando energia em notebooks com gráficos híbridos no Linux

Embora os processadores Intel Sandy Bridge tragam uma GPU consideravelmente aprimorada em relação aos processadores anteriores da Intel, elas ainda são apenas passáveis para jogos e aplicativos pesados, permitindo apenas jogar a resoluções baixas e com baixo nível de detalhes. Como resultado, muitos fabricantes optaram por oferecer notebooks com gráficos híbridos onde a GPU integrada do Sandy Bridge é combinada com uma GPU dedicada da AMD ou da nVidia.

Estas GPUs dedicadas são muito boas para quem gosta de jogar um pouco nas horas vagas, já que embora estejam muito longe de oferecer um desempenho competitivo com uma GPU high-end, elas oferecem na maioria dos casos um desempenho suficiente para rodar jogos com um nível médio de detalhes usando a resolução nativa da tela.

Um bom exemplo é o Dell Vostro 3550, que oferece a opção de incluir uma GPU AMD HD6630M, uma GPU mid-range com 480 unidades de processamento, 1 GB de memória dedicada e clock de 480 MHz para a GPU, que na maioria dos jogos oferece um desempenho cerca de 3 vezes superior ao da Intel HD 3000:

O grande problema é que a GPU dedicada fica por default parcialmente ativa na maioria dos modelos, consumindo energia mesmo quando não é usada. No caso das GPUs da AMD no Windows, o chaveamento é programado com base no aplicativo através do Catalyst, permitindo que a GPU dedicada seja automaticamente usada ao rodar jogos ou aplicativos específicos, deixando que a GPU integrada se encarregue dos aplicativos do dia a dia, já que ela oferece um consumo mais baixo. O chaveamento é também suportado no Linux nas versões recentes do driver proprietário da AMD, mas ele possui o mesmo problema que temos no driver do Windows: a GPU dedicada fica sempre em stand-by, continuando a gastar energia mesmo quando não está sendo usada.

Se você estiver usando o driver open-source, que é a opção default em quase todas as distribuições, a situação é ainda pior, pois ou a GPU dedicada simplesmente ficará ativa o tempo todo, mesmo que a GPU integrada é que esteja sendo usada, reduzindo a autonomia do notebook em até 40% e ainda por cima fazendo com que ele aqueça bem mais que o normal.

A solução em ambos os casos é manter a GPU dedicada desativada até que você precise dela, uma solução atrativa principalmente para quem usa a GPU dedicada apenas para jogos, preferindo a economia da GPU dedicada na maior parte do tempo.

A desativação/ativação pode ser feita através do módulo acpi_call, que adiciona diversas chamadas de ACPI para controle do hardware, que normalmente não ficam disponíveis. Ele não vem instalado por padrão na maioria das distribuições, por isso é necessário instalá-lo através do git. Para isso, certifique-se de que você possui o pacote “git” instalado, bem como o GCC, kernel-headers e os outros compiladores básicos necessários para gerar módulos do kernel.

Comece instalando o git e baixando o código através dele (mais rápido que o tradicional baixar manualmente e descompactar):

$ sudo apt-get install git
$ cd ~
$ git clone http://github.com/mkottman/acpi_call.git

Com isso, será criada a pasta “acpi_call” no seu diretório home, contendo o código fonte do módulo. Acesse-a e execute o “make” e “make install” para gerar e instalar o módulo:

$ cd acpi_call
$ make
$ sudo make install

Se houver algum problema nessa etapa, verifique a instalação dos compiladores, headers do Kernel, etc. Cada vez mais distribuições estão vindo com esses componentes instalados por padrão, mas exceções ainda existem.

Continuando, rode o comando “lspci -vnnn | grep VGA”, que mostrará as GPUs instaladas, incluindo tanto a GPU integrada quanto a dedicada, sinal de que o sistema está reconhecendo ambas:

$ lspci -vnnn | grep VGA

Com isso, falta apenas desativar a GPU dedicada, o que pode ser feito rapidamente executando o script “test_off.sh” dentro da pasta:

$ chmod +x test_off.sh
$ sudo ./test_off.sh

Ele testa vários parâmetros possíveis do acpi_call até descobrir qual é o que desativa a GPU dedicada do seu notebook. É por isso que ele exibe vários “failed” até chegar no “works!”, ao encontrar o parâmetro correto:

Com isso a GPU estará desativada. Desconecte o notebook da tomada e acompanhe o uso da bateria, a diferença pode ser notável. Execute novamente o comando “lspci -vnnn | grep VGA” e a GPU dedicada deverá aparecer com uma entrada diferente. No meu caso por exemplo ela depois de desativada aparece como:

01:00.0 VGA compatible controller [0300]: Advanced Micro Devices [AMD] nee ATI Whistler [AMD Radeon HD 6600M Series] [1002:6741] (rev ff) (prog-if ff)

Você pode monitorar com mais precisão o consumo da bateria usando o comando:

$ cat /proc/acpi/battery/BAT0/state

No meu caso por exemplo, o consumo médio do notebook em tarefas leves no Ubuntu 12.04 caiu de 2050 mA (cerca de 25 watts) para apenas 1100 mA (13.5 watts), aumentando elevando a autonomia em tarefas leves para mais de 3 horas usando a bateria de 6 células padrão. Esta é uma boa marca, considerando que o Ubuntu 12.04 não é exatamente um campeão em matéria de economia de energia.

Concluindo, se você gostou da modificação, pode torná-la permanente com dois passos adicionais. O primeiro é adicionar a linha “acpi_call” no arquivo “/etc/modules” para que o módulo passe a ser carregado automaticamente durante o boot:

O segundo é fazer com que o parâmetro correto (o works! no test_off.sh) seja executado durante o boot, adicionando-o no arquivo /etc/rc.local.

No meu caso por exemplo, o comando que desativa a GPU é o “\_SB.PCI0.PEG0.PEGP._OFF”, por isso a linha no final do arquivo será:

echo \_SB.PCI0.PEG0.PEGP._OFF > /proc/acpi/call

Caso você deseje ativar a GPU externa em algum momento, basta executar o comando como root, trocando o “OFF” no final por “ON”, como em:

#  echo \_SB.PCI0.PEG0.PEGP._ON > /proc/acpi/call

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X