PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Reverse PRIME Offloading mit Intel und NVidia


Abnaxos
2017-01-19, 12:07:52
Wie im Thread "Was müsste getan werden, damit Linux mehr Marktanteile auf Consumer-PCs erlangt?" beschrieben, habe ich so meine Krämpfe mit dem DualMonitor-Setup mit Intel und NVidia auf meinem Laptop.

Ich bin wieder in Bastellaune. KDE habe ich momentan ganz abgeschossen und versuche mich jetzt mit i3. Einen Compositor brauche ich dennoch, das ist jetzt Compton (bei i3 sieht man recht schlecht, welches Fenster aktiv ist → inaktive Fenster abdunkeln → Compton).

Die Lösung, nur NVidia zu verwenden, finde ich aus folgenden Gründen suboptimal:

Der proprietäre NVidia-Treiber gehört boykottiert
Unerträgliches Tearing bei jeglichen Videos
Hitzeentwicklung und Stromverbrauch
Kernel tainted
(zwei Monitore mit nouveau funktioniert schlicht nicht)


Das Problem ist, dass die iGPU nur den Laptop-Bildschirm verwenden kann, für HDMI/DP brauche ich die NVidia-dGPU.

Ich versuche nochmal, die Sache mit PRIME-Offloading hinzukriegen, siehe Arch-Wiki (https://wiki.archlinux.org/index.php/PRIME#Reverse_PRIME). Leider komme ich nirgends hin.

Wenn ich für Intel den modesetting-Treiber verwende, krallt er sich beide GPUs, der Output von "xrandr --listproviders":
Providers: number : 2
Provider 0: id: 0x7a cap: 0x3, Source Output, Sink Output crtcs: 3 outputs: 1 associated providers: 1 name:modesetting
Provider 1: id: 0x46 cap: 0x3, Source Output, Sink Output crtcs: 4 outputs: 3 associated providers: 1 name:modesetting

Ein "xrandr --setprovideroutputsource 1 0" führt zu nichts. In diesem Setup kann ich grundsätzlich mit den zweiten Monitor arbeiten, aber es ist fürchterlich langsam und führt teilweise zu einem Flackern des Mauszeigers (das kann man auf ein erträgliches Mass reduzieren, indem man Compton mit dem Xrender-Backend betreibt). Ein glxspheres auf dem zweiten Monitor (nouveau) kommt auf knapp 1 (eins) FPS, auf dem Laptop-Monitor (Intel) läuft es normal.

Wenn ich den intel-Treiber einstelle, geht es erstmal in die richtige Richtung. Dann beschliesst X.org jedoch, dass im aktuellen Setup die NVidia-GPU gar nicht benutzt wird. Im Log steht dann: UnloadModule "nouveau". Das Ergebnis ist, dass ich nur noch den Intel-Provider habe und damit kein Offloading hinkriege.

Hier mal meine /etc/X11/xorg.conf.d/20-prime.conf (die auskommentierten Sachen habe ich extra stehen lassen, damit man sieht, was ich schon alles für Experimente gemacht habe:
Section "Device"
Identifier "intel"
Driver "modesetting" # bzw. "intel"
BusID "PCI:0:2:0"
Option "SWcursor" "off"
# Option "DRI" "2"
# Option "AccelMethod" "uxa"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nouveau" # bzw. "nvidia"
BusID "PCI:1:0:0"
EndSection
#Section "Screen"
# Identifier "intel"
# Device "intel"
#EndSection
#Section "Screen"
# Identifier "nvidia"
# Device "nvidia"
#EndSection
#Section "ServerLayout"
# Identifier "layout"
# Screen 0 "intel"
# Inactive "nvidia"
#EndSection

Die Distro ist OpenSUSE 42.2.

Das Ziel ist es, alles Rendering mit der iGPU zu machen und die dGPU nur zu verwenden, um die HDMI/DP-Outputs verwenden zu können (Rerverse PRIME Offloading). Ideen?

iuno
2017-01-19, 14:47:17
Erfahrungen habe ich bei genau so einem Setup nicht, aber ich versuche es einfach mal.

Wenn ich für Intel den modesetting-Treiber verwende, krallt er sich beide GPUs
Das finde ich seltsam, da du sogar die BusID angegeben hast. Der Vorschlag ist vielleicht etwas naiv, aber vielleicht hilft es, wenn du den Device-Block fuer Nouveau vor den Modesetting Block nimmst? :redface:
Ansonsten: was spricht konkret gegen die Verwendung des modesetting Treibers auch bei Nouveau?

der Output von "xrandr --listproviders":
Providers: number : 2
Provider 0: id: 0x7a cap: 0x3, Source Output, Sink Output crtcs: 3 outputs: 1 associated providers: 1 name:modesetting
Provider 1: id: 0x46 cap: 0x3, Source Output, Sink Output crtcs: 4 outputs: 3 associated providers: 1 name:modesetting

Ein "xrandr --setprovideroutputsource 1 0" führt zu nichts.


--setprovideroutputsource provider source
Set source as the source of display output images for provider. This is only possible if source and
provider have the Source Output and Sink Output capabilities, respectively. If source is 0x0, then
provider is disconnected from its current output source.

(Insbesondere der letzte Satz). Es gehen offenbar nur die IDs (Hex) oder Namen?! Hast du es schon mit xrandr --setprovideroutputsource 0x46 0x7a versucht?

Bzw. wenn ich so weiterschaue, glaube ich, dass setprovideroffloadsink eher das ist, was du willst:

--setprovideroffloadsink provider sink
Set provider as a render offload device for sink. This is only possible if provider and sink have the
Source Offload and Sink Offload capabilities, respectively. If sink is 0x0, then provider is disconnected
from its current render offload sink.
Allerdings steht hier, dass man Source Offload und Sink Offload benoetigt. Das fehlt bei dir wohl, bei mir sieht das so aus:xrandr --listproviders
Providers: number : 1
Provider 0: id: 0x49 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 6 outputs: 4 associated providers: 0 name:modesetting
Kannst du noch sagen, auf welcher Version du beim X Server und Kernel bist? Die Hardware waere vielleicht auch interessant.
X: 1.19.1
Kernel: 4.8.13
GPU ist eine Radeon (Hawaii), ich kann nachher mal mit der IGP booten und schauen, ob es mir die Offloading Funktionen anzeigt.

Edit: laeuft bei mir, und zwar alles :freak: Mit dem modesetting Treiber kann ich mit setprovideroutputsource jeweils die Outputs der Radeon und der Intel an die andere haengen, in beide Richtungen. "Source Offload" und "Sink Offload" war durch modesetting bei beiden providern verfuegbar, damit habe ich aber nichts mehr ausprobiert.
Also mein Vorgehen war wie folgt:
- Im bios die IGP reaktiviert und primaer eingestellt (faellt bei dir weg)
- xrandr --setprovideroutputsource radeon intel (hex ids genommen)
- xrandr ausgefuehrt, geschaut welche outputs jetzt da sind (die Neuen heissen z.B. HDMI-1-1)
- xrandr --output HDMI-1-1 --mode 1920x1080 --right-of DP-1
Mit der Radeon als primaere Karte, also in die andere Richtung funktioniert es analog.

Abnaxos
2017-01-19, 20:42:41
Ooops, die Hardware-Infos vergessen. Das also zuerst:

Intel: P530 (Xeon E3-1535MV5)
NVidia: Quadro M2000M
Lenovo P50

X.org: 1.18.3
Kernel: 4.9.4

Erfahrungen habe ich bei genau so einem Setup nicht, aber ich versuche es einfach mal.
Das finde ich seltsam, da du sogar die BusID angegeben hast. Der Vorschlag ist vielleicht etwas naiv, aber vielleicht hilft es, wenn du den Device-Block fuer Nouveau vor den Modesetting Block nimmst? :redface:
Die BusID habe ich mal hinein getan, damit es wirklich klar ist. Nouveau vorzuziehen hat nichts gebracht. Überhaupt muss ich sagen, da habe ich wohl vorher etwas mit den Logs verwechselt. Ich habe nämlich folgende Zeile im Log gefunden, das dürfte die Ausschlaggebende Zeile sein, die dazu führt, dass ich meinen Plan schlichtweg vergessen kann:

[ 44314.763] (II) [drm] nouveau interface version: 1.3.1
[ 44314.763] (EE) Unknown chipset: NV117

So geht das natürlich nicht. Woher ich die andere Message hatte, dass das Nouveau-Modul entfernt wurde, weil es nicht verwendet wird, weiss ich gerade nicht mehr. Das erklärt jedenfalls auch, warum der Modesetting-Treiber Nouveau übernimmt.

Mit dem Intel-Treiber kriege ich jedenfalls das:
$ xrandr --listproviders
Providers: number : 1
Provider 0: id: 0x45 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 4 outputs: 2 associated providers: 0 name:Intel
$
Mit nur einem Provider habe ich Möglichkeit, irgend etwas zu offloaden. Interessant finde ich, dass es da 4 CRTs und 2 Outputs haben soll, xrandr listet aber nur eDP1 und die VIRTUAL Outputs (wenn sie denn eingeschaltet sind).

Ansonsten: was spricht konkret gegen die Verwendung des modesetting Treibers auch bei Nouveau?
Dass es furchtbar langsam ist und der Mauszeiger flackert.

Allerdings steht hier, dass man Source Offload und Sink Offload benoetigt. Das fehlt bei dir wohl, bei mir sieht das so aus:
[...]

Yep, das habe ich übersehen. Das bietet Modesetting nicht an, das geht nur mit Intel und Nouveau. Und für Nouveau ist meine dGPU zu neu. Damit hänge ich wohl definitiv beim NVidia-Treiber fest. Und der unterstützt definitiv kein PRIME-Offloading, bzw. er unterstützt es nur von NVidia auf eine andere GPU, was mir absolut nichts nützt.

Ich bin jetzt zurück auf dem Bumblebee-Setup, das hat auch den Vorteil, dass man die dGPU gleich ganz ausschalten kann. Das macht gleich 5°C weniger bei weniger Lüfter-Aktivität (ausser, natürlich, ich habe einen externen Monitor dran). Ich habe die begründete Hoffnung, dass die vorigen Probleme mit dem Bumblebee-Setup bei KWin lagen, eigentlich sind meine Erfahrungen damit sonst hervorragend.

Trotzdem bin ich immer dankbar, falls irgend jemand noch Ideen hat. Vorerst bleibt mit wohl nichts übrig, ausser auf ein neues Nouveau zu warten und es dann nochmal zu versuchen.

iuno
2017-01-20, 10:38:41
Okay, dann bist du ja beim Kernel sogar weiter als ich.
xorg hat jedoch in Version 1.19 einige Commits bzgl. modesetting zu dem Thema, siehe z.B.
https://cgit.freedesktop.org/xorg/xserver/commit/?h=server-1.19-branch&id=299cbb92670fdb83c24c3ef6327eb9d66b8be92a
https://cgit.freedesktop.org/xorg/xserver/commit/?h=server-1.19-branch&id=7b634067c13045671685a9f00bfbac626ed68f94

Ich denke, das waere noch einen Versuch wert. Ansonsten kann ich dir leider nicht helfen. IGP ist bei mir auch die HD530