PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PRIME: iGPU als primäre GPU, dGPU (NVidia) als output source


Abnaxos
2021-05-07, 10:25:36
Neuer Laptop, neue Leiden mit NVidia. :( Weil es inzwischen möglich sein sollte, auf Bumblebee zu verzichten, möchte ich gerne verzichten.

Also, das Ziel ist es, den NVidia-Chip so selten wie möglich zu benutzen. 99.99% der Arbeit macht die iGPU wunderbar, das soll also meine primäre GPU sein. Aber die externen Displays sind fest mit der NVidia-GPU verdrahtet. Diese möchte ich daher gerne mit Reverse PRIME ansteuern.

Zuerst ein paar Infos. Hier läuft das System allerdings umgekehrt, d.h. die NVidia-GPU ist die primäre GPU, das interne Display wird mit Reverse PRIME via iGPU verwendet.


$ lsb-release -d
Description: openSUSE Leap 15.2
$ uname -rvio
5.3.18-lp152.72-default #1 SMP Wed Apr 14 10:13:15 UTC 2021 (013936d) x86_64 GNU/Linux
$ inxi -G
Graphics: Device-1: Intel CometLake-H GT2 [UHD Graphics] driver: i915 v: kernel
Device-2: NVIDIA TU106GLM [Quadro RTX 3000 Mobile / Max-Q] driver: nvidia v: 460.73.01
Device-3: IMC Networks type: USB driver: uvcvideo
Display: x11 server: X.Org 1.20.3 driver: modesetting,nvidia
resolution: 1: 1920x1200~60Hz 2: 1920x1080~60Hz
OpenGL: renderer: Quadro RTX 3000/PCIe/SSE2 v: 4.6.0 NVIDIA 460.73.01
$ nvidia-smi
Fri May 7 09:24:24 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.73.01 Driver Version: 460.73.01 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Quadro RTX 3000 Off | 00000000:01:00.0 On | N/A |
| N/A 42C P8 6W / N/A | 519MiB / 5934MiB | 21% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 3935 G /usr/bin/X 248MiB |
| 0 N/A N/A 4905 G ksysguard 48MiB |
| 0 N/A N/A 4908 G kontact 22MiB |
| 0 N/A N/A 4966 G ...-211.7142.45/jbr/bin/java 2MiB |
| 0 N/A N/A 5202 G ...AAAAAAAAA= --shared-files 120MiB |
| 0 N/A N/A 5292 G ...oken=13555069662847211130 17MiB |
| 0 N/A N/A 6297 G ...AAAAAAAA== --shared-files 19MiB |
| 0 N/A N/A 6403 G ...akonadi_archivemail_agent 2MiB |
| 0 N/A N/A 6475 G ...bin/akonadi_imap_resource 2MiB |
| 0 N/A N/A 6505 G .../akonadi_mailfilter_agent 2MiB |
| 0 N/A N/A 6559 G ...n/akonadi_sendlater_agent 2MiB |
| 0 N/A N/A 6563 G ...nadi_unifiedmailbox_agent 2MiB |
+-----------------------------------------------------------------------------+
$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x29d; cap: 0x1 (Source Output); crtcs: 4; outputs: 5; associated providers: 1;
name: NVIDIA-0
output DP-0
output DP-1
output DP-2
output HDMI-0
output DP-3
Provider 1: id: 0x43; cap: 0xf (Source Output, Sink Output, Source Offload, Sink Offload);
crtcs: 3; outputs: 1; associated providers: 1; name: modesetting
output eDP-1-1


In xorg.conf.d/90-cards.conf habe ich Folgendes stehen:


Section "Device"
Identifier "intel"
Driver "modesetting"
BusID "PCI:0:2:0"
#Option "AccelMethod" "none"
Option "DRI" "3"
Option "ReprobeOutputs" "True"
#Option "TearFree" "True"
#Option "DRI" "2"
#Option "VirtualOutputs" "2"
#Option "TearFree" "true"
#Option "VideoRam" "1048576" # 1G
#Option "AccelMethod" "uxa"
EndSection

Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:1:0:0"
Option "DPI" "96 x 96"
#Option "AllowPRIMEDisplayOffloadSink" "True"
#Option "AllowEmptyInitialConfiguration"
#Option "PrimaryGPU"
EndSection

Section "Screen"
Identifier "intel"
Device "intel"
EndSection

Section "Screen"
Identifier "nvidia"
Device "nvidia"
#Option "AllowEmptyInitialConfiguration" "True"
EndSection

Section "ServerLayout"
Identifier "layout"
Screen 0 "nvidia"
Inactive "intel"
Option "AllowNVIDIAGPUScreens" "True"
EndSection


Die vielen Kommentare zeigen auch die vielen Experimente, die ich bereits gemacht habe. Praktisch jede Option war mal ein- oder auskommentiert. :)

Die Idee wäre, im ServerLayout "nvidia" und "intel" zu vertauschen. Wenn ich das tue, bringt mir xrandr das:


$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x24e; cap: 0xf (Source Output, Sink Output, Source Offload, Sink Offload);
crtcs: 3; outputs: 1; associated providers: 0; name: modesetting
output eDP-1
Provider 1: id: 0x218; cap: 0x0 (); crtcs: 4; outputs: 5; associated providers: 0; name: NVIDIA-G0
output 0x21d
output 0x227
output 0x228
output 0x229
output 0x22a


Wenig überraschend kriege ich dann einen Fehler, wenn ich "xrandr --setprovideroutputsource NVIDIA-G0 modesetting" ausführen will, denn das "cap: 0x0" sagt ja aus, dass nicht möglich sei (gar kein Offloading, weder Render noch Output). Das Internet meint, dass das heutzutage funktionieren müsste.

Momentan habe ich ausserdem sichergestellt, dass der NVidia-Treiber zuerst geladen wird (noch von der initrd, also sehr früh im Boot-Prozess) und i915 blacklisted. Ich habe irgendwo gelesen, es sei wichtig, dass NVidia zuerst geladen werde. Leider hilft das auch nicht, ich werde es wohl wieder entfernen.

Irgendwelche Ideen?

Wo ich schon dabei bin: picom mag NVidia nicht gerne, momentan muss ich auf Compositing verzichten. Wie kann ich im aktuellen Setup, wo NVidia die primäre GPU ist, einzelne Applikationen (z.B. eben picom) auf die iGPU offloaden? Google nach "prime offload" gibt mir nur Ergebnisse, wie ich auf die dGPU offloaden könnte, wenn ich das gewünschte Setup hinkriegen würde. Nicht aber umgekehrt.

aufkrawall
2021-05-08, 13:38:44
Ich hatte das (Display an NV-Karte) auch schon mal vor ein paar Jahren probiert und es ging einfach nicht. In einer Antwort auf dem Bugtracker (find den Report nicht mehr) von einem Intel-Dev hieß es dann, dass Intel einfach kein Reverse Prime in der Form unterstützt (nur in die andere Richtung). :(

Abnaxos
2021-05-09, 12:11:55
Ja, mit dem Intel-Treiber geht es nicht, deshalb verwende ich den Modesetting-Treiber für die iGPU. Im Internet findet man einige Erfolgs-Berichte. Schade, dass ich mich da bisher nicht anschliessen kann. :(

Das auskommentierte "TearFree" und "VirtualOutputs" sind noch Relikte von der Bumblebee-Konfiguration, wo ich den Intel-Treiber verwenden muss (intel-virtual-output funktioniert nur damit).

Immerhin ist es inzwischen möglich, mit NVidia, Intel und zwei Bildschirmen das Tearing zu eliminieren, ohne auf Bumblebee ausweichen zu müssen. Fortschritt! :) Das picom-Problem scheint sich mit einem simplen "xrender-sync-fence = true" gelöst zu haben. Ich habe NVreg_DynamicPowerManagement=0x02 (http://download.nvidia.com/XFree86/Linux-x86_64/460.73.01/README/dynamicpowermanagement.html) gesetzt, laut "nvidia-smi -q -d POWER" zieht die GPU zwischen 10 und 20 W mit Spitzen bis 30 W bei normaler Benutzung, ~8 W wenn ich nichts tue, ~4 W wenn DMPS off greift. Wie es mit der Batterie-Laufzeit genau aussieht, kann ich momentan nicht sagen. Die ist im Grunde auch sekundär, schliesslich ist das ein mobiler Desktop. :) Auf die Temperatur und damit den Lärm hat es keinen merklichen Einfluss, das ist gut.

Es gibt noch Raum für Optimierungen (man könnte das auf 0 W im Normalfall reduzieren), aber die Situation ist grundsätzlich befriedigend. Das konnte ich vor vier Jahren mit dem alten Laptop noch nicht sagen, damals war Bumblebee zwingend erforderlich, um einen brauchbaren Laptop zu kriegen.

aufkrawall
2021-05-09, 12:15:10
Ja, mit dem Intel-Treiber geht es nicht, deshalb verwende ich den Modesetting-Treiber für die iGPU. Im Internet findet man einige Erfolgs-Berichte. Schade, dass ich mich da bisher nicht anschliessen kann. :(

Afair bezieht sich das auf den i915 Kernel-Treiber, der auch mitspielen muss. :(

Abnaxos
2021-05-10, 12:04:18
(NVidia-README) Offloading Graphics Display with RandR 1.4 (http://download.nvidia.com/XFree86/Linux-x86_64/460.73.01/README/randr14.html) meint, dass das, was ich tun will, geht.

Use the
$ xrandr --listproviders
command to query the capabilities of the graphics devices. If the system requirements are met and the X server is configured correctly, there should be a provider named NVIDIA-0 or NVIDIA-G0 with the Source Output or Sink Output capability, respectively, and one named modesetting with the Sink Output and/or Source Output capabilities. If either provider is missing or doesn't have the expected capability, check your system configuration.

"Source Output" auf NVIDIA-0 (NVidia als primäre GPU) ist vorhanden, "Sink Output" auf NVIDIA-G0 (Intel als primäre GPU) aber nicht → "check your system configuration". Leider finde ich keinerlei Hinweise, was falsch sein könnte. Momentan verwende ich 460.73.01 (latest stable), ich werde mal die 465.27 (latest beta) probieren.

Abnaxos
2021-05-10, 16:57:32
Kleines Update an dieser Stelle: exakt dasselbe Problem mit 465.27. :(