Comme on peut le deviner à partir du sujet, j'ai un ordinateur portable Optimus. Tant que j'exécutais le 19.04, j'ai pu passer au Nvidia dGPU et vice-versa, en utilisant Prime (via le prime-select {intel|nvidia}
commande). Cependant, les choses ont changé après la mise à niveau vers la version 19.10: le lendemain de la mise à niveau, le système a gelé, le noyau se plaignant du blocage de certaines tâches, comme une rmmod
. J'ai réussi à récupérer mon système en exécutant prime-select nvidia
dans un environnement de connexion root chroot.
Je n'entrerai pas trop dans les détails secondaires tels que la suppression des pilotes iGPU/dGPU des initramfs (que doivent-ils faire de toute façon dans les initramfs?), Mais maintenant il démarre au moins, avec ou sans le dGPU activé par le premier .
Et c'est là que j'en viens au problème: si mon système démarre avec le profil Intel activé, le passage au profil nvidia ne fonctionne pas, car le dGPU n'est pas détecté dans le matériel. Et en effet, il est absent d'une liste lspci. Je dois redémarrer pour que le dGPU soit à nouveau détecté. Par conséquent, lorsque j'arrête mon système, je devrais toujours penser à activer le profil nvidia au préalable, ou je devrai redémarrer pour pouvoir l'utiliser la prochaine fois.
Voilà mon principal problème. Un autre, moins ennuyeux, est que je dois toujours redémarrer le service gdm lors du passage de nvidia à intel. Je peux vivre avec ça, mais c'est un problème que je n'avais pas en 19.04.
Les conseils sur ce problème sont les bienvenus! Soit empêcher le dGPU de disparaître de la liste du matériel, soit une méthode pour le faire détecter à nouveau par le système, sans redémarrer.
Fwiw, mon iGPU est Intel HD Graphics 4600 et mon dGPU est un Nvidia GTX 880M.
EDIT: @Syfer Polski, merci pour votre réponse informative!
J'ai remarqué qu'il y avait un profil à la demande, mais je l'ai rejeté comme une tentative inutile, car j'avais lu il n'y a pas si longtemps qu'une implémentation Optimus vraiment fonctionnelle ne viendrait pas de si tôt ... J'aurais dû lire ce fichier Lisez-moi!
J'ai donc immédiatement essayé ce profil à la demande. Au début, cela n'a pas fonctionné car j'avais le pilote 430 qui ne le prend pas en charge. Il aurait dû y avoir une vérification de pilote refusant d'activer le profil pour les personnes qui n'exécutent pas une version de prise en charge, et je soupçonne que c'est pourquoi mon système s'est écrasé, car ce profil à la demande a été automatiquement activé pendant la mise à niveau (en supposant seulement que je n'ai pas '' t vérifier à l'époque).
Quoi qu'il en soit ... j'ai donc installé le pilote 435 et en effet le profil à la demande fonctionne. Cependant, je ne le trouve pas assez satisfaisant, car mon GPU n'est pas éteint lorsqu'il n'est pas utilisé, et essayer de le mettre hors tension ne fonctionne pas. J'ai essayé de l'éteindre via un appel direct ACPI, et en effet, il s'est éteint mais:
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.
Donc, malheureusement pour moi, tant que les pilotes propriétaires ne peuvent pas éteindre mon dGPU lorsqu'il n'est pas utilisé, je suppose que je m'en tiendrai au système de profils Intel/NVIDIA classique.
Ce qui me ramène à ma question d'origine, lorsque je démarre avec le mode Intel activé: comment puis-je récupérer mon dGPU sans redémarrer?
Une nouvelle analyse (echo 1 >/sys/bus/pci/rescan
) l'affiche dans les journaux:
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
Mais lspci reste silencieux. Je peux allumer/éteindre l'appareil à volonté via des appels ACPI, le noyau l'affiche lors de la nouvelle analyse, mais il n'est pas détecté par les pilotes qui ne se chargent pas par conséquent. Il doit y avoir quelque chose à faire, mais quoi?
Solution trouvée! Je ne faisais pas certaines choses en ordre. La procédure pour récupérer le dGPU est donc la suivante:
Définissez le profil sur nvidia
ou on-demand
(si pris en charge par votre pilote): prime-select {nvidia|on-demand}
Mettez le dGPU sous tension. Le BIOS l'allume généralement au démarrage, il ne devrait donc y avoir aucun problème ici. Si vous l'avez désactivé entre-temps, je suppose que vous savez comment le réactiver. Dans le cas où il reste éteint pour une autre raison, vous pouvez tenter votre chance avec apt install acpi-call-dkms
. Vous trouverez des exemples utiles dans /usr/share/doc/acpi-call-dkms/examples
. Manipulez-le avec précaution, car il peut mal planter votre système! Dans mon cas, l'appel ACPI suivant active mon dGPU: \_SB_.PCI0.PEG0.PEGP._ON
. Je donne le mien à titre d'exemple, le vôtre peut très bien ne pas être le même. N'oubliez pas d'échapper à la barre oblique inverse si vous en avez.
Relancez l'analyse de votre bus PCI: echo 1 >/sys/bus/pci/rescan
. Il peut cependant suffire de ne réanalyser qu'une partie du bus.
(peut être facultatif) Chargez le module nvidia: modprobe nvidia
AVERTISSEMENT: N'éteignez pas votre GPU avec un appel ACPI direct sauf si vous êtes certain qu'il n'est lié à aucun pilote (plus simplement, le nvidia (le module doit être déchargé), sinon le pilote plantera (exemple de crash donné dans la question).
Tant qu'il est chargé, c'est le conducteur qui pilote le GPU, et prendre le volant par surprise ne fera généralement pas grand-chose.
Cependant, le pilote Nvidia a une fonction de gestion de l'alimentation qui est désactivé par défaut, mais il peut être activé en passant le paramètre suivant au module nvidia
: NVreg_DynamicPowerManagement=0x01
. Malheureusement, cela ne fonctionne que pour Turing et les nouveaux GPU (c'est-à-dire pas mon Kepler) ... Tiré de /usr/src/nvidia-435.21/nvidia/nv-reg.h
:
/*
* Option: DynamicPowerManagement
*
* This option controls how aggressively the NVIDIA kernel module will manage
* GPU power through kernel interfaces.
*
* Possible Values:
*
* 0: Never allow the GPU to be powered down (default).
* 1: Power down the GPU when it is not initialized.
* 2: Power down the GPU after it has been inactive for some time.
*/
nvidia-prime
a encore changé entre Ubuntu 19.04 et 19.10.
Entre Ubuntu 16.04 et Ubuntu 18.04, Ubuntu a utilisé bbswitch
, un module de noyau construit par la communauté, pour désactiver le GPU Nvidia dans les ordinateurs portables Optimus. Cependant, le module a cessé d'être maintenu, et donc dans Ubuntu 18.10 (depuis rétroporté vers Ubuntu 18.04), la commutation entre les GPU a été gérée en chargeant les pilotes open source nouveau
. Cependant, cela n'a pas complètement désactivé le GPU (il utilisait toujours ~ 2W).
Simultanément, Nvidia travaillait enfin sur la coexistence avec d'autres pilotes GPU. GLVND (Graphics Library Vendor Neutral Display) est devenu une chose dans Xorg 1.20 et a permis de charger plusieurs pilotes GPU et d'alimenter un serveur d'affichage. Cela permet un contrôle granulaire - chaque application peut utiliser des pilotes distincts. En pratique, il s'agit presque toujours des processeurs graphiques Intel et Nvidia des ordinateurs portables Optimus. Il existe maintenant trois modes prime-select
vous permet de choisir parmi:
intel
le mode désactive physiquement le GPU Nvidia, économisant de l'énergie supplémentaire, mais nécessite un redémarrage pour l'allumer, et pas seulement une déconnexion. nvidia
est l'inverse.
Pour les personnes qui changent fréquemment de mode, le mode à la demande est recommandé - dans on-demand
, le GPU utilisé pour dessiner un programme est déterminé par des variables d'environnement. Il existe différentes variables d'environnement pour les applications OpenGL et Vulkan, et si elles ne sont pas définies, le GPU intégré (Intel) est utilisé. Voir README de Nvidia pour une explication complète sur les variables d'environnement impliquées (__NV_PRIME_RENDER_OFFLOAD
, __GLX_VENDOR_LIBRARY_NAME
et __VK_LAYER_NV_optimus
)
Selon la série de pilotes prenant en charge votre GPU, le profil à la demande peut ne pas fonctionner pour vous - le pilote le plus ancien pris en charge semble être la série 435.