skip to content
Textfach
Darktable mit aktiviertem OpenCL

OpenCL bei AMD Ryzen aktivieren (Anleitung für Darktable)

/ 5 min read

Inhalt

Bei der Bildbearbeitung mit dem wunderbaren Tool Darktable wunderte ich mich über die träge Performance. Eigentlich hatte ich mit einem Ryzen 7 7840U und der integrierten 780M iGPU eine verhältnismäßig ordentliche Hardware. Woran liegt’s? Tatsächlich ließ sich openCL in Darktable nicht aktivieren. Gleiches Spiel in anderen Anwendungen.

Es erfordert zwar etwas Frickelei, aber man kann die 780M, und auch andere AMD iGPUs, zum Laufen bekommen. Hat man die Schritte erst einmal raus, ist es recht einfach. Die dazu notwendige Recherchearbeit möchte ich Lesern gerne ersparen.

Zu den Problemen

Dass die 780M standardmäßig nicht aktivieren werden kann, hat mehrere Ursachen:

  • AMD unterstützt offiziell keine integrierten GPUs in mobilen APUs für OpenCL. 1
  • Darktable deaktiviert einige AMD Grafikkarten.2
  • Rusticl ist standardmäßig deaktiviert.
  • Mesa wirft eine Warnung, wenn Grafikkarten weniger als 512MB vRAM haben. Das ist bei unified memory aber regelmäßig der Fall, da dieser dynamisch über den RAM genutzt wird.3

OpenCL: AMD Rocm oder Rusticl

Wir benötigen zwingend eine funktionierende OpenCL-Implementierung. Bereitstehen AMD ROCm und die jüngere, open source Variante Rusticl von Mesa.

Option A: AMD ROCm

Auch wenn ROCm offiziell keine mobilen iGPUs unterstützt, funktioniert es bei vielen, wenn man etwas trickst. Das geht wie folgt.

Zunächst sollten einige Abhängigkeiten installiert werden:

Terminal window
sudo apt update
sudo apt install libatomic1 libquadmath0

Dann fügen wir den Nutzer zur richtigen Benutzergruppe hinzu.

Terminal window
sudo usermod -a -G render,video $LOGNAME

Jetzt laden und installieren wir das amdgpu-install-script.

Terminal window
sudo apt update
wget https://repo.radeon.com/amdgpu-install/31.40.1/ubuntu/resolute/amdgpu-install_31.40.1.314001-1_all.deb
sudo apt install ./amdgpu-install_31.40.1.314001-1_all.deb

Nun installieren wir AMD ROCm.

Terminal window
sudo amdgpu-install --usecase=rocm --gfxversion=auto --no-dkms

Jetzt den Computer neustarten.

ROCm prüfen

Um zu prüfen, ob jedenfalls rocm die iGPU erkennt, nutzen wir rocminfo:

Terminal window
rocminfo | grep "GPU"

Es sollte eine Antwort ala Device-Type: GPU erscheinen. Ist dem nicht so, bitte rocminfo ausführen und schauen, ob neben der CPU eine GPU (Agent 2) angezeigt wird. Ist dem nicht so, sollten die obigen Schritte geprüft werden.

Trickserei

Der verbreitete Trick besteht darin, eine kompatible Grafikkarte vorzugaukeln.5 Da diese sich eine RDNA-Architektur teilen6, sollte es dann funktionieren:

Terminal window
export HSA_OVERRIDE_GFX_VERSION=11.0.0

Wir können das mit der jeweiligen Anwendung testen. Hier also mit Darktable

Terminal window
env HSA_OVERRIDE_GFX_VERSION=11.0.0 ./Darktable.AppImage

Tja. Bei mir funktioniert es jedenfalls Darktable nicht (Hinweis: bei Darktable ggf. noch den Schritt unten, AMD-Sperre deaktivieren, testen). Mit anderen Anwendungen hingegen schon. Funktioniert diese Lösung, kann sie permanent gemacht werden (dazu unten). Funktioniert sie nicht, greifen wir auf Alternative 2, Rusticl, zurück.

Option B: Rusticl (Empfehlung)

Um Rusticl zu nutzen, installieren wir mesa-openCL-icd:

Terminal window
sudo apt update
sudo apt install mesa-opencl-icd

Standardmäßig ist Rusticl deaktiviert. Das wird über die RUSTICL_ENABLE=“radeonsi” Umgebungsvariable geändert. Zum ausprobieren mit Darktable:

Terminal window
RUSTICL_ENABLE="radeonsi" darktable
# bei AppImage:
env RUSTICL_ENABLE="radeonsi" "PfadZuDarkTable.AppImage"

Sollte es noch nicht funktionieren, müssen wir die anderen Probleme beheben.

Darktable: AMD-Sperre deaktivieren

Bei mir genügten die obigen Schritte immer noch nicht. Die Ursache ist sehr versteckt. Startet man das mitgelieferte cltest-Werkzeug: RUSTICL_ENABLE="radeonsi" darktable-cltest

…wird zwar eindeutig eine GPU erkannt, diese aber als ***marked as disable*** klassifiziert. Das Rätselraten, wer oder was die GPU deaktiviert hat, erspare ich dem Leser. Es war das Darktable-Team. Wie ein Foren-Faden verrät, hat man offenbar einige AMD-GPUs deaktiviert, weil diese irgendwie instabil seien. Warum das nicht transparent in cltest angezeigt wird, versteh ich nicht. Nun denn. Wir deaktivieren diese Sperre:

in ~/.config/darktable findet sich die Datei darktablerc, die die per-device-Konfiguration enthält.7

Das Problem findet sich in folgender Zeile:

Terminal window
cldevice_v6_rusticlamdradeon780mgraphics=250 0 1 0 1 0.000 0.250

An fünfter Stellte steht die 1 dafür, dass die 780M deaktiviert wird. Wir ändern die 1 zu einer 0:

Terminal window
cldevice_v6_rusticlamdradeon780mgraphics=250 0 1 0 0 0.000 0.250

Jetzt wieder testen:

Terminal window
RUSTICL_ENABLE="radeonsi" darktable-cltest
# für AppImage:
RUSTICL_ENABLE="radeonsi" ./Darktable-5.6.0-x86_64.AppImage darktable-cltest

Geht immer noch nicht? Keine Sorge, weiterlesen!

vRAM-Problem beheben

Bei mir reichte auch das noch nicht. Das Gerät blieb deaktiviert. Nach noch weitergehender Recherche kam heraus, dass das Problem die dynamische vRAM-Zuweisung der 780M beim HP Elitebook G10 ist. Das dürfte bei vielen anderen Notebooks ähnlich sein. Da diese als <=512MB erkannt wird, deaktiviert Darktable sie, wie man auf Github erfährt.8 Wieder ohne irgendetwas zusagen…Das Problem ist seit längerem bekannt, wurde aber erst vor einigen Monaten vorgelagert durch eine aktualisierte Version von Mesa behoben.9 Es müsste sich um Version 26.0.5 handeln.

Wir prüfen das kurz:

Terminal window
apt-cache policy mesa-opencl-icd

Ist die installierte Version niedriger als 26.0.5 und der Installationskandidat ebenfalls, liegt das daran, dass die sehr aktuelle Version noch nicht im Ubuntu Repo ist. Wir holen sie aus dem bekannten kisak-ppa.

Terminal window
sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update && sudo apt upgrade

Jetzt sollte der Fix enthalten sein. Ausprobieren:

Terminal window
RUSTICL_ENABLE="radeonsi" darktable-cltest
# für AppImage:
RUSTICL_ENABLE="radeonsi" ./Darktable-5.6.0-x86_64.AppImage darktable-cltest

Mit diesen Schritten funktioniert es nun bei meiner 780M unter Linux Mint mit Darktable 5.6.0. Sowohl darktable-cltest auch als Darktable erkennen über Rusticl die 780M als taugliche GPU für OpenCL. Hurra! Sollte es dennoch nicht funktionieren, würde ich einen Neustart probieren.

Rusticl dauerhaft aktivieren

Nun ist das Setzen der Umgebungsvariable etwas mühseelig. Um sie dauerhaft zu setzen, kann pro Anwendung oder global vorgegangen werden.

individuell, z. B. .desktop Eintrag

Wenn nur eine Anwendung, etwa Darktable, notwendig ist, würde ich einen .desktop Eintrag erzeugen.

Terminal window
nano ~/.local/share/applications/darktable

Inhalt:

[Desktop Entry]
Name=Darktable
Exec=env RUSTICL_ENABLE="radeonsi" "/<pfad_zum_appimage>Darktable-5.6.0-x86_64.AppImage"
Comment=
Icon=darktable
Type=Application
Name[de_DE]=Darktable
Nutzerweit

Wer das ganze für den Nutzer losgelöst von Anwendungen haben will, kann zwar einen export in ~/.bashrc erzugen:

Terminal window
echo 'export RUSTICL_ENABLE=radeonsi' >> ~/.bashrc
source ~/.bashrc

…sollte aber wissen, dass das nur für das Terminal gilt. Um das ganze auch für die Desktopumgebung zu erlangen, würde ich folgendes empfehlen:

Terminal window
mkdir -p ~/.config/environment.d && echo 'RUSTICL_ENABLE="radeonsi"' > ~/.config/environment.d/vars.conf
systemctl --user daemon-reload
# und prüfen
systemctl --user show-environment | grep "RUST"

Fazit

Nun haben wir es geschafft. Die teuer bezahlte 780M funktioniert. Wäre auch ärgerlich, wenn nicht. Warum AMD sie nicht offiziell unterstützt oder man es in Drittanwendungen derart schwer macht, sie zu nutzen, ist mir zwar schleierhaft, aber sei’s drum.

Fußnoten

  1. https://rocm.docs.amd.com/projects/radeon-ryzen/en/docs-6.1.3/docs/limitations.html, https://rocm.docs.amd.com/en/latest/compatibility/compatibility-matrix.html?fam=ryzen&w=compute&gpu=max-pro-395&gfx=gfx1151&os=ubuntu ↑

  2. https://discuss.pixls.us/t/opencl-gpu-acceleration-disabled-in-5-6-0/58805/12 ↑

  3. https://github.com/darktable-org/darktable/issues/19513 ↑

  4. Für Pop!_OS etwa https://github.com/pop-os/pop/issues/3235 ↑

  5. statt vieler https://community.frame.work/t/guide-running-stable-diffusion-on-amd-7840u/43216 ↑

  6. https://en.wikipedia.org/wiki/RDNA_%28microarchitecture%29#RDNA_3 ↑

  7. https://docs.darktable.org/usermanual/4.6/en/special-topics/mem-performance/#device-specific-opencl-configuration ↑

  8. siehe auch im mesa repo: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/14102 ↑

  9. https://docs.mesa3d.org/relnotes/26.0.5.html, https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30123 ↑