Como pode ser adivinhado pelo assunto, eu tenho um laptop Optimus. Enquanto eu estava executando o 19.04, consegui alternar para o Nvidia dGPU e voltar, usando o Prime (através do prime-select {intel|nvidia}
comando). As coisas mudaram após a atualização para 19.10: no dia seguinte à atualização, o sistema congelou com o kernel reclamando sobre algumas tarefas travadas, como uma rmmod
. Consegui recuperar meu sistema executando prime-select nvidia
em um ambiente de login root chroot.
Não vou entrar muito em detalhes secundários, como remover os drivers iGPU / dGPU do initramfs (o que eles têm que fazer no initramfs de qualquer maneira?), Mas agora ele inicializa pelo menos, com ou sem o dGPU ativado por prime .
E é aí que chego ao problema: se meu sistema inicializar com o perfil intel ativado, mudar para o perfil nvidia não funciona, pois o dGPU não é detectado no hardware. E, de fato, está ausente de uma listagem lspci. Eu tenho que reiniciar para que o dGPU seja detectado novamente. Portanto, quando eu desligar meu sistema, devo sempre pensar em ativar o perfil nvidia de antemão, ou terei que reiniciar para poder usá-lo na próxima vez.
Esse é o meu principal problema. Outra, menos irritante, é que sempre tenho que reiniciar o serviço gdm ao alternar da nvidia para a intel. Eu posso viver com isso, mas isso é um problema que eu não tinha em 19.04.
Conselhos sobre este problema são bem-vindos! Ou evite que a dGPU desapareça da lista de hardware ou um método para que ela seja detectada novamente pelo sistema, sem reinicializar.
Fwiw, minha iGPU é Intel HD Graphics 4600, e minha dGPU é uma Nvidia GTX 880M.
EDIT: @Syfer Polski, obrigado pela sua resposta informativa!
Percebi que havia um perfil sob demanda, mas descartei-o como provavelmente uma tentativa inútil, pois havia lido há pouco tempo que uma implementação Optimus realmente funcional não chegaria tão cedo... Eu deveria ter lido esse leia-me !
Então eu imediatamente tentei esse perfil sob demanda. No começo, não funcionou, pois eu tinha o driver 430 que não o suporta. Deve ter havido alguma verificação de driver se recusando a habilitar o perfil para pessoas que não estão executando uma versão de suporte, e suspeito que é por isso que meu sistema travou, porque esse perfil sob demanda foi ativado automaticamente durante a atualização (só supondo que eu não t verifique na hora).
Enfim... então eu instalei o driver 435 e de fato o perfil sob demanda funciona. No entanto, não acho satisfatório o suficiente, já que minha GPU não é desligada quando não é usada, e tentar desligar sozinho não funciona. Tentei desligá-lo por meio de uma chamada direta de ACPI e, de fato, desligou, mas:
NVRM: GPU at PCI:0000:01:00: GPU-9b8a3387-4913-0c33-619e-da118e532a5f
NVRM: Xid (PCI:0000:01:00): 79, pid=29013, GPU has fallen off the bus.
NVRM: GPU 0000:01:00.0: GPU has fallen off the bus.
NVRM: A GPU crash dump has been created. If possible, please run
NVRM: nvidia-bug-report.sh as root to collect this data before
NVRM: the NVIDIA kernel module is unloaded.
Então, infelizmente para mim, desde que os drivers proprietários não consigam desligar meu dGPU quando ele não for usado, acho que vou ficar com o sistema clássico de perfis intel/nvidia.
O que me traz de volta à minha pergunta original , quando inicializo com o modo Intel ativado: como posso recuperar meu dGPU sem reinicializar?
Um rescan( echo 1 >/sys/bus/pci/rescan
) mostra isso nos logs:
pci 0000:01:00.0: [10de:1198] type 00 class 0x030000
pci 0000:01:00.0: reg 0x10: [mem 0xf6000000-0xf6ffffff]
pci 0000:01:00.0: reg 0x14: [mem 0xe0000000-0xefffffff 64bit pref]
pci 0000:01:00.0: reg 0x1c: [mem 0xf0000000-0xf1ffffff 64bit pref]
pci 0000:01:00.0: reg 0x24: [io 0xe000-0xe07f]
pci 0000:01:00.0: reg 0x30: [mem 0xf7000000-0xf707ffff pref]
pci 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s x16 link at 0000:00:01.0 (capable of 126.016 Gb/s with 8 GT/s x16 link)
pci 0000:01:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
Mas lspci permanece em silêncio. Eu posso ligar/desligar o dispositivo à vontade através de chamadas ACPI, o kernel mostra na nova varredura, mas não é detectado pelos drivers que, consequentemente, não serão carregados. Deve haver algo a fazer, mas o quê?
nvidia-prime
mudou mais uma vez entre o Ubuntu 19.04 e 19.10.Entre o Ubuntu 16.04 e o Ubuntu 18.04, o Ubuntu usou
bbswitch
o , um módulo de kernel construído pela comunidade, para desligar a GPU Nvidia em laptops Optimus.nouveau
No entanto, o módulo parou de ser mantido e, portanto, no Ubuntu 18.10 (desde o backport para o Ubuntu 18.04), a alternância entre as GPUs foi realizada carregando os drivers de código aberto. No entanto, isso não desligou totalmente a GPU (ainda estava usando ~ 2W).Simultaneamente, a Nvidia estava finalmente trabalhando na coexistência com outros drivers de GPU. GLVND (Graphics Library Vendor Neutral Display) tornou-se uma coisa no Xorg 1.20 e permitiu que vários drivers de GPU fossem carregados e alimentando um servidor de exibição. Isso permite controle granular - cada aplicativo pode usar drivers separados. Na prática, é quase sempre sobre GPUs Intel e Nvidia em laptops Optimus. Existem agora três modos
prime-select
que permitem que você escolha:intel
O modo desliga fisicamente a GPU Nvidia, economizando energia adicional, mas requer uma reinicialização para ligá-la, e não apenas um logout.nvidia
é o inverso.Para pessoas que mudam de modo com frequência, o modo sob demanda é recomendado - no
on-demand
, a GPU usada para desenhar um programa é determinada por variáveis de ambiente. Existem diferentes variáveis de ambiente para aplicativos OpenGL e Vulkan e, se não estiverem definidas, a GPU integrada (Intel) será usada. Veja o README da Nvidia para uma explicação completa sobre as variáveis de ambiente envolvidas (__NV_PRIME_RENDER_OFFLOAD
,__GLX_VENDOR_LIBRARY_NAME
e__VK_LAYER_NV_optimus
)Dependendo de qual série de drivers suporta sua GPU, o perfil sob demanda pode não funcionar para você - o driver suportado mais antigo parece ser a série 435.
Solução encontrada! Eu não estava fazendo algumas coisas em ordem . Então o procedimento para ter a dGPU de volta é:
Defina o perfil para
nvidia
ouon-demand
(se suportado pelo seu driver):prime-select {nvidia|on-demand}
Ligue o dGPU. O BIOS geralmente liga na inicialização, portanto, não deve haver problemas aqui. Se você o desativou nesse meio tempo, suponho que saiba como ativá-lo novamente. Caso fique desligado por algum outro motivo, você pode tentar a sorte com
apt install acpi-call-dkms
. Você encontrará exemplos úteis em/usr/share/doc/acpi-call-dkms/examples
. Manuseie com cuidado, pois pode travar seu sistema mal! No meu caso, a seguinte chamada ACPI ativa meu dGPU:\_SB_.PCI0.PEG0.PEGP._ON
. Eu dou o meu como exemplo, o seu pode muito bem não ser o mesmo. Não se esqueça de escapar da barra invertida, se tiver alguma.Verifique novamente o barramento PCI:
echo 1 >/sys/bus/pci/rescan
. Pode ser suficiente para redigitalizar apenas parte do ônibus.(pode ser opcional) Carregue o módulo nvidia:
modprobe nvidia
AVISO: Não desligue sua GPU com uma chamada direta de ACPI, a menos que tenha certeza de que não está vinculado a nenhum driver (de forma mais simples, o módulo nvidia deve ser descarregado) ou o driver travará (exemplo de falha fornecido na pergunta ).
Contanto que esteja carregado, é o driver que aciona a GPU, e você pegar o volante de surpresa geralmente não fará muito bem.
No entanto, o driver da Nvidia possui um recurso de gerenciamento de energia que está desativado por padrão, mas pode ser ativado passando o seguinte parâmetro para o
nvidia
módulo:NVreg_DynamicPowerManagement=0x01
. Infelizmente, funciona apenas para Turing e GPUs mais recentes (ou seja, não para o meu Kepler) ... Retirado de/usr/src/nvidia-435.21/nvidia/nv-reg.h
: