Optimus - Nvidia

Mise à jour : Debian 9.4

La technologie d'affichage Optimus est basée sur la combinaison d'utilisation d'une carte graphique intel et d'une carte graphique nvidia. L'objectif de cette combinaison est de réduire la consommation électrique et d'augmenter l'autonomie des PCs portables.

Plusieurs mises en œuvre sont possible sous Linux. Celle décrite repose sur le projet libre bumblebee et le pilote propriétaire nvidia :

1 - Installation

1.1 - Préalable

$ lspci |grep -i vga
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GF116M [GeForce GT 555M/635M] (rev a1)
$ lspci -k -s 00:02 
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
Subsystem: ASUSTeK Computer Inc. 2nd Generation Core Processor Family Integrated Graphics Controller
Kernel driver in use: i915
Kernel modules: i915
# aptitude purge ~nnouveau ~nnvidia
$ lspci -k -s 01:00
01:00.0 VGA compatible controller: NVIDIA Corporation GF116M [GeForce GT 555M/635M] (rev a1)
Subsystem: ASUSTeK Computer Inc. GeForce GT 635M
Kernel modules: nvidia

1.2 - Installation serveur X et carte graphique intel

# aptitude install xorg xserver-xorg xserver-xorg-input-all xserver-xorg-video-intel
$ xinit -g -0 glxgears

1.3 - Installation des en-têtes linux

L'installation des en-tête linux est nécessaire pour générer les modules dkms bbswitch et nvidia

$ aptitude search ~i~nlinux-image
i A linux-image-4.14.0-0.bpo.3-amd6 - Linux 4.14 for 64-bit PCs
i A linux-image-4.15.0-0.bpo.2-amd6 - Linux 4.15 for 64-bit PCs
# aptitude install linux-headers-4.14.0-0.bpo.3-amd64
# aptitude install linux-headers-4.15.0-0.bpo.2-amd64
$ apt-cache policy linux-image-4.15.0-0.bpo.2-amd64
linux-image-4.15.0-0.bpo.2-amd64:
Installé : 4.15.11-1~bpo9+1
Candidat : 4.15.11-1~bpo9+1
Table de version :
*** 4.15.11-1~bpo9+1 100
100 http://ftp.debian.org/debian stretch-backports/main amd64 Packages
100 /var/lib/dpkg/status
# aptitude install -t stretch-backports linux-image-amd64 linux-headers-amd64

1.4 - Installation de la carte graphique nvidia

1.4.1 Détermination de la version du driver nvidia

# aptitude install nvidia-detect
$ nvidia-detect
Detected NVIDIA GPUs:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GF116M [GeForce GT 555M/635M] [10de:1247] (rev ff)

Checking card: NVIDIA Corporation GF116M [GeForce GT 555M/635M] (rev ff)
Your card is supported by all driver versions.
It is recommended to install the
nvidia-driver
package.

Dans le cas présent, la carte est supportée par toutes les versions de driver.

# apt-cache policy nvidia-kernel-dkms
nvidia-kernel-dkms:
Installé : 390.48-2~bpo9+1
Candidat : 390.48-2~bpo9+1
Table de version :
*** 390.48-2~bpo9+1 100
100 http://ftp.debian.org/debian stretch-backports/non-free amd64 Packages
100 /var/lib/dpkg/status
384.130-1 500
500 http://deb.debian.org/debian stretch-proposed-updates/non-free amd64 Packages
375.82-1~deb9u1 500
500 http://deb.debian.org/debian stretch/non-free amd64 Packages

1.4.2 Installation

# aptitude install -t stretch-backports nvidia-kernel-dkms bumblebee-nvidia primus nvidia-detect nvidia-settings
# adduser $USER bumblebee

1.5 - Vérification installation

$ cat /etc/group |grep bumblebee
$ systemctl status bumblebeed.service 
● bumblebeed.service - Bumblebee C Daemon
Loaded: loaded (/lib/systemd/system/bumblebeed.service; enabled; vendor prese
Active: active (running) since Thu 2018-05-03 09:23:30 CEST; 1h 58min ago
# dkms status |grep $(uname -r)
bbswitch, 0.8, 4.15.0-0.bpo.2-amd64, x86_64: installed
nvidia-current, 390.48, 4.15.0-0.bpo.2-amd64, x86_64: installed

1.6 - Vérification fonctionnement

    $ optirun cat /proc/acpi/bbswitch
0000:01:00.0 ON
$ cat /proc/acpi/bbswitch 
0000:01:00.0 OFF
$ optirun lsmod |grep nvidia
nvidia_modeset 1110016 1
nvidia 14372864 78 nvidia_modeset
ipmi_msghandler 61440 2 nvidia,ipmi_devintf
$ glxheads
glxheads: exercise multiple GLX connections (any key = exit)
Usage:
glxheads xdisplayname ...
Example:
glxheads :0 mars:0 venus:1
Name: :0.0
Display: 0x55d86bc1d030
Window: 0x4400002
Context: 0x55d86bc2c4e0
GL_VERSION: 3.0 Mesa 13.0.6
GL_VENDOR: Intel Open Source Technology Center
GL_RENDERER: Mesa DRI Intel(R) Sandybridge Mobile
$ optirun glxheads
glxheads: exercise multiple GLX connections (any key = exit)
Usage:
glxheads xdisplayname ...
Example:
glxheads :0 mars:0 venus:1
Name: :0.0
Display: 0x5575038fd3b0
Window: 0x4a00002
Context: 0x557503bbe908
GL_VERSION: 4.6.0 NVIDIA 390.48
GL_VENDOR: NVIDIA Corporation
GL_RENDERER: GeForce GT 635M/PCIe/SSE2

Si les tests ne sont pas concluants, voir la partie debuggage ci-dessous

1.7 - Debuggage

Tester les modifications suivantes

1.7.1 Modifier bumblebee.conf

# nano /etc/bumblebee/bumblebee.conf
Driver=nvidia
Kerneldriver=nvidia-current

1.7.2 Modifier xorg.conf.nvidia

# nano /etc/bumblebee/xorg.conf.nvidia
# Suppression erreur .. Failed to load module "mouse"
Section "Screen"
Identifier "Default Screen
Device "DiscreteNvidia"
EndSection

1.7.3 Installer le paquet nvidia-driver

Veiller à ce utiliser le même dépôt main ou backport etc.... que nvidia-kernel-dkms

# aptitude install -t stretch-backports nvidia-driver

1.7.4 Vérifier / mettre à jour les liens glx et nvidia - A confirmer!!!

# update-glx --list nvidia
/usr/lib/nvidia/current

# update-glx --list glx
/usr/lib/mesa-diverted
/usr/lib/nvidia
/usr/lib/nvidia/bumblebee
# update-glx --display glx |head -4
glx - mode automatique
link best version is /usr/lib/nvidia/bumblebee
le lien pointe actuellement sur /usr/lib/nvidia/bumblebee
link glx is /usr/lib/glx

# update-glx --display nvidia |head -4
nvidia - mode automatique
link best version is /usr/lib/nvidia/current
le lien pointe actuellement sur /usr/lib/nvidia/current
link nvidia is /usr/lib/nvidia/nvidia

1.8 - Panneau de contrôle de la carte nvidia

$ optirun -b none nvidia-settings -c :8

2 - Utilisation

Optimus peut-être lancé (cf https://wiki.archlinux.org/index.php/Bumblebee) avec

$ optirun glxspheres64
$ optirun -c jpeg glxspheres64
$ optirun -b primus glxspheres64
$ primusrun glxspheres64

3 - Performances

Pour comparer les performances des différentes solutions, utiliser de préférence, soit directement l'application graphique visée, soit un logiciel de "benchmark", tel que GpuTest : voir Logiciels de test de processeur graphique . Résultats du test Furmark de GpuTest, obtenus avec un PC Asus N55SL et une fenêtre de 1024x640