GPU Wraper-Scripts in Linux

Linux GPU Cube

Auf meinem Laptop auf dem Manjaro Linux gut läuft habe ich folgendes Problem: Gewisse Programme sind für die GPU optimiert und deswegen möchte ich diese auch gerne über meine interne verbaute Grafikkarte ausführen. Doch Linux hat leider die doofe Eigenschaft, dass der GPU Standards gemäß nicht angesprochen werden und dies explizit getan werden muss. Dies geschieht je nach Treiber unterschiedlich, in meinen Fall ist es der Prime Treiber für die Nvidia Grafikkarte. Das was ich hier Zeige sollte analog auch für andere Treiber und Konfigurationen gehen, schaue dabei in die Dokumentation deiner Linux Distribution nach.

Dieser Beitrag ist für Konsolen/Terminal/Shell AnfängerInnen geschrieben und einige Abschnitte sind für fortgeschrittene BenutzerInnen sicherlich gut zu überspringen. Zum Verständnis noch, mpv ist ein Media-Player ähnlich wie VLC, den die meisten von euch kennen werden.

Grafikkarte Ansprechen

Eigentlich spreche ich die Grafikkarte nur durch das Terminal durch den Befehlprime-run an, doch an diesen zu denken und einzugeben habe ich keine Lust und die Programme, die GPU unterstützen sollten auch aus den Scripten dies von alleine ausführen. Das sieht z.B. in der Praxis auf der Konsole folgendermaßen aus:

prime-run mpv --fs ~/Videos/mein-film-vom-urlaub.mkv

Das sollte eleganter gehen und auch ohne dem vielen Tippen, dazu könnte Mensch doch einige Systemeinstellungen je nach Applikation verändern um diese optimal auszuführen.

POSIX zeigt wohin

In einem POSIX kompatiblem System wie Linux ist die Variable $PATH gegeben und in dieser wird angegeben, wo das System nach auszuführenden Dateien suchen soll wenn kein vollständiger Pfad angegeben ist. Wenn wir nun das obige Beispiel ansehen, dann führen wir genau genommen zwei Befehle aus und am letzten Befehl geben wir zwei Argumente mit. Doch wie findet Linux diese Befehle, denn ich gebe keinen expliziten Pfad an wo diese zu finden sind. Gib dafür einfach mal in deiner Shell folgendes ein:

echo $PATH

Du wirst nun eine Reihe von Pfaden sehen, die durch einen : getrennt sind.Dir wird auch auffallen, dass die Pfade in das von deinem System genutzten Verzeichnisse verweist. In der Reihenfolge der aufgelisteten Pfade werde die aufgerufenen Programme gesucht. Wenn z.B. mpv im ersten Pfad nicht gefunden wird, dann wird im nächsten nach dem Doppelpunkt gesucht u.s.w. So lange bis es gefunden wird und wenn nicht wird ein Fehler ausgegeben. Geben wir mal folgendes in das Terminal ein:

type mpv

Uns wird der absolute Pfad von mpv dann so angezeigt mpv is /usr/bin/mpvund wir sehen, dass der Pfad /usr/bin/ auch in $PATH vorkommt. Deswegen wird mpv so wie alle systemweit genutzten Applikationen auch gefunden und ausgeführt. Genau dies können wir nun für uns nutzen.

$PATH erweitern

Als erstes erweitern wir das Suchfeld für die von uns genutzten Programme und dies machen wir, indem wir $PATH erweitern. Dies können wir entweder Systemweit oder pro Nutzer tun. Ich werde es hier der Einfachheit halber pro Nutzertun aber in einem Betrieb mit mehreren MitarbeiterInnen ist dies sicherlich von Vorteil, wenn dies Systemweit geschieht.

Füge in deiner .bashrc und/oder .zshrc folgende Zeile am Anfang vom File ein. Es ist sehr wahrscheinlich, das dies sogar schon vorhanden ist und du diese nur noch anpassen musst.

export PATH=$HOME/.local/bin:$PATH

Wir fügen zur Variablen $PATH den Wert $HOME/.local/bin: hinzu und was dies genau macht werde ich nun erklären. export macht eine Variable in der Shell systemweit nutzbar (gilt für Bash & Z-Shell). Mit PATH= definieren wir eine Variable mit dem Namen PATH. Dann rufen wir die Variable $HOME auf und die verweist auf unser User-Verzeichnis. Das $ vor der Variablen heißt, dass die Variable aufgerufen und ausgelesen wird. In unserm Benutzerverzeichnis möchten wir aber auf unseren versteckten Unterordner .local/bin verweisen und das vor all unseren Systempfaden. Dann hängen wir die vom System schon definierten Systempfaden getrennt von einen : noch an, durch das aufrufen von $PATH.Vielleicht fragst du dich nun wieso das alte so wie neu $PATH sich nicht in die Quere kommen? Diese Zeile wird von Rechts nach Links durchgearbeitet und so kann das neue $PATH auf das alte aufbauen, sprich ersetzten.

Wraper-Scripts

Kommen wir nun zu den Wraper-Scripts, die nichts anderes als Shell-Scripts sind,die dann Schlussendlich das gewünschte Programm aufrufen aber vor- und nachher noch “was machen”, in unseren Fall die Grafikkarte ansprechen. Legen wir los und richten dies nun für uns ein indem wir das folgende Script unter~/.local/bin/mpv speichern.

#!/bin/sh

xset s off -dpms                      # Bildschirmschoner deaktivieren
xset s noblank

/usr/bin/prime-run /usr/bin/mpv "$@"  # mpv mit GPU unterstützung starten

xset s on +dpms                       # Bildschirmschoner aktivieren
xset s 300

Ich werde dieses Script nun ganz kurz erklären: In der ersten Zeile setzen wir ein Shebang oder Hash-Bang um dem System mitzuteilen was für ein Script dies nun ist und mit was es ausgeführt wird, es ist ein Shell-Script. Dann schalten wir den Bildschirmschoner vom X-Window System aus, denn wir möchten beim Filme gucken mittels mpv nicht durch ihn unterbrochen werden. Dann rufen wirmpv mittels dem Präfix prime-run inkl. ihren absoluten Pfaden auf und durch"$@" übergeben wir alle Optionen, die wir erst dem Shell-Script übergeben haben, weiter an mpv.

Da wir dem Script den selben Namen wie mpv gegeben haben und wir wie weiter oben beschrieben erst in unserem lokalem Verzeichnis vom Benutzer suchen, rufen wir das reale mpv nicht auf, sonder über den Umweg von unserem Script. Das können wir nun für alle möglichen Applikationen einrichten, z.B. Blender mit der Datei ~/.local/bin/blender:

#!/bin/sh
/usr/bin/prime-run /usr/bin/blender "$@"

Dir fällt auf, dass dieses Script deutlich kürzer ist und das Ausschalten vom Bildschirmschoner fehlt. Warum sollten wir für Blender den Bildschirmschoner ausschalten, das macht in diesem Zusammenhang keinen Sinn. Du siehst, die Scripte sollten ihren Zweck entsprechend Dinge erfüllen und nicht nur weil man es kann. Wichtig ist noch zu erwähnen, das die Scripts ausführbar sein müssen und das machst du natürlich mittels chmod:

chmod -R 700 ~/.local/bin/

.desktop Files

So weit so gut aber nun habe wir die Ganze Zeit auf der Konsole hantiert doch die meisten von euch werden einen Grafischen Desktop verwenden und auch dort sollten wir es einrichten. Auch hier richten wir als Beispiel nur den lokalen Nutzer ein, in einer Firma mit mehreren MitarbeiterInnen sieht dies dann wieder ein wenig anders aus. Wenn wir wieder das Beispiel vom mpv Media-Player nehmen, dann schreiben wir die Datei mpv.desktop in das Verzeichnis ~/.local/share/applications/ und das sieht so aus:

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Icon=/usr/share/icons/hicolor/scalable/apps/mpv.svg
Exec=/usr/bin/prime-run /usr/bin/mpv %u
Name=mpv
Comment=Schlanker Media-Player
Categorie=Application;Multimedia;

Dies sind einen ganzen Haufen an Informationen doch wir möchten uns nur auf die Zeile Exec=... fokussieren. Ich bin der Meinung das so gut wie jede Zeile für sich selbst erklärend ist. Wichtig ist, dass in der erwähnte Zeile eben wie im Wraper-Script der /usr/bin/prime-run vor /usr/bin/mpv gesetzt wird und wieder beide mit absoluten Pfad, damit wir auch wirklich das ausführen was wir möchten. Am ende der Zeile steht noch ein %u und das sind die User-Inputs oder eben Optionen die man anhängen kann. Was wir hier allerdings nicht haben,ist das Ausschalten vom Bildschirmschoner.

Das selbe können wir nun auch für Blender und allen anderen erwünschten Programmen durchziehen. Die unten stehende Konfiguration speicherst du unter~/.local/share/applications/blender.desktop.

[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Icon=/usr/share/icons/hicolor/scalable/apps/blender.svg
Exec=/usr/bin/prime-run /usr/bin/blender %u
Name=Blender 3D
Comment=Open-Source 3D Creation Suite
Categorie=Application;Graphics;

Es kann nun gut sein, dass du evtl. auf deinem Desktop und Startmenü einige Icons doppelt sind. Entweder änderst du die bestehende Einträge wie du sie benötigst oder löscht die Icons & Einträge auf deinem Desktop die du nun nichtmehr benötigst.

Andere Lösungen?

Ich habe keinen andere Weg gefunden und auch auf Anfrage in der Community keine anderen Antworten erhalten. Habt ihr andere Lösungen oder Linux Distros, die das von Haus aus schon lösen oder ist das der einzige gangbare Weg? Wenn nein und du einen anderen Weg weißt dann schreibe es mir doch wie die Kommentare im Fediverse mir auf Mastodon.

Quellen