
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:
sudo apt updatesudo apt install libatomic1 libquadmath0Dann fügen wir den Nutzer zur richtigen Benutzergruppe hinzu.
sudo usermod -a -G render,video $LOGNAMEJetzt laden und installieren wir das amdgpu-install-script.
sudo apt updatewget https://repo.radeon.com/amdgpu-install/31.40.1/ubuntu/resolute/amdgpu-install_31.40.1.314001-1_all.debsudo apt install ./amdgpu-install_31.40.1.314001-1_all.debNun installieren wir AMD ROCm.
sudo amdgpu-install --usecase=rocm --gfxversion=auto --no-dkmsJetzt den Computer neustarten.
ROCm prüfen
Um zu prüfen, ob jedenfalls rocm die iGPU erkennt, nutzen wir rocminfo:
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:
export HSA_OVERRIDE_GFX_VERSION=11.0.0Wir können das mit der jeweiligen Anwendung testen. Hier also mit Darktable
env HSA_OVERRIDE_GFX_VERSION=11.0.0 ./Darktable.AppImageTja. 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:
sudo apt updatesudo apt install mesa-opencl-icdStandardmäßig ist Rusticl deaktiviert. Das wird über die RUSTICL_ENABLE=“radeonsi” Umgebungsvariable geändert. Zum ausprobieren mit Darktable:
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:
cldevice_v6_rusticlamdradeon780mgraphics=250 0 1 0 1 0.000 0.250An fünfter Stellte steht die 1 dafür, dass die 780M deaktiviert wird. Wir ändern die 1 zu einer 0:
cldevice_v6_rusticlamdradeon780mgraphics=250 0 1 0 0 0.000 0.250Jetzt wieder testen:
RUSTICL_ENABLE="radeonsi" darktable-cltest
# für AppImage:RUSTICL_ENABLE="radeonsi" ./Darktable-5.6.0-x86_64.AppImage darktable-cltestGeht 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:
apt-cache policy mesa-opencl-icdIst 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.
sudo add-apt-repository ppa:kisak/kisak-mesasudo apt update && sudo apt upgradeJetzt sollte der Fix enthalten sein. Ausprobieren:
RUSTICL_ENABLE="radeonsi" darktable-cltest
# für AppImage:RUSTICL_ENABLE="radeonsi" ./Darktable-5.6.0-x86_64.AppImage darktable-cltestMit 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.
nano ~/.local/share/applications/darktableInhalt:
[Desktop Entry]Name=DarktableExec=env RUSTICL_ENABLE="radeonsi" "/<pfad_zum_appimage>Darktable-5.6.0-x86_64.AppImage"Comment=Icon=darktableType=ApplicationName[de_DE]=DarktableNutzerweit
Wer das ganze für den Nutzer losgelöst von Anwendungen haben will, kann zwar einen export in ~/.bashrc erzugen:
echo 'export RUSTICL_ENABLE=radeonsi' >> ~/.bashrcsource ~/.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:
mkdir -p ~/.config/environment.d && echo 'RUSTICL_ENABLE="radeonsi"' > ~/.config/environment.d/vars.confsystemctl --user daemon-reload# und prüfensystemctl --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
-
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 ↑
-
https://discuss.pixls.us/t/opencl-gpu-acceleration-disabled-in-5-6-0/58805/12 ↑
-
Für Pop!_OS etwa https://github.com/pop-os/pop/issues/3235 ↑
-
statt vieler https://community.frame.work/t/guide-running-stable-diffusion-on-amd-7840u/43216 ↑
-
https://en.wikipedia.org/wiki/RDNA_%28microarchitecture%29#RDNA_3 ↑
-
https://docs.darktable.org/usermanual/4.6/en/special-topics/mem-performance/#device-specific-opencl-configuration ↑
-
siehe auch im mesa repo: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/14102 ↑
-
https://docs.mesa3d.org/relnotes/26.0.5.html, https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30123 ↑