Mehrere Einheiten
Die Disposition von OpenCL-Einheiten kann auf den meisten Systemen mit den Einstellungen von “OpenCL scheduling profile” optimiert werden. Wenn aber dein System mit mehr als einer GPU ausgestattet ist, solltest du die entsprechenden Prioritäten der Einheiten manuell setzen. Um das zu tun, musst du das “Standard” Disposition-Profil setzen und die Einstellungen in den Konfigurations-Parametern der “opencl_device_priority” ändern.
Es ist wichtig zu verstehen, wie darktable die OpenCL-Geräte nutzt. Jede Bearbeitungsfolge für ein Bild – eine Eingabe zum schlussendlichen Ausgabe mit einem Verlaufsstapel – wird in einer Pixelpipe durchgeführt. Es gibt fünf verschiedenen Arten von Pixelpipes in darktable. Ein Typ ist verantwortlich für die Erzeugung der zentralen Großansicht des Bildes, ein weiterer erzeugt das Vorschaubild (in der Navigation, auch Benötigt für Histogramme und zusätzliche interne Angelegenheiten für die korrekte Ausgabe). Eine andere Voransicht Pixelpipe Ewürde benötigt, um ein zweites Fenster in der Ansicht Dunkelkammer. Eine dieser drei Pixelpipes kann jederzeit laufen, und die Pixelpipes für die Großansicht und das Vorschaubild gleichzeitig. Zusätzlich können gleichzeitig mehrere Pixelpipes Dateiexporte oder Vorschaubilder erzeugen. Falls ein OpenCL-Gerät vorhanden ist, wird darktable dieses dynamisch einer spezifische Pixelpipe für eine Berechnung zuweisen und nachher wieder freigeben.
Der Anspruch an Rechnerleistung variiert signifikant, abhängig vom Typ der Pixelpipe, die ausgeführt wird. Das kleine Bild und die Vorschaubilder haben kleine Auflösungen und können schnell bearbeitet werden, das Hauptbild oder in der zweiten Ansicht braucht schon mehr, und eine volle Export-Pixelpipe braucht noch einmal mehr.
Die Konfigurations-Parameter “opencl_device_priority” hält einen String mit der folgenden Struktur:
a,b,c.../d,e,f.../g,h,i.../j,k,l...,m,n,o...
Jeder Buchstabe repräsentiert eine spezifische OpenCL-Einheit. Es gibt fünf Felder im Parameter-String, jeweils getrennt mit Slash, jeder repräsentiert einen Typen von Pixelpipe. a,b,c...
definiert Einheiten, denen es erlaubt ist, die Pixelpipe des Hauptbildes zu verarbeiten. Gleichermaßen können Einheiten d,e,f...
das kleine Bild, Einheiten g,h,i...
die Export Pixelpipe . Geräte j,k,l...
die Miniaturaansichten m,n,o...
Voransicht Pixelpipe für das zweite Fenster. Ein leeres Feld will heissen, dass keine OpenCL-Einheit diesen Typ von Pixelpipe bedienen kann.
darktable hat ein internes Nummerierungs-System, wobei die erste vorhandene OpenCL-Einheit die Nummer 0 erhält. Alle nächsten Einheiten werden fortlaufend nummeriert. Diese Nummer zusammen mit dem Namen der Einheit wird angezeigt, wenn du darktable mit darktable -d opencl
startest. Du kannst eine Einheit spezifizieren, entweder mit der Nummer oder mit seinem kanonischen Namen (Gross-, Kleinbuchstaben oder weite Abstände spielen keine Rolle). Falls du mehr als eine Einheit mit dem gleichen Namen hast, musst die Nummer anwenden, um sie zu unterscheiden.
Ein Einheiten-Spezifizerer kann mit einem Ausrufe-Zeichen !
, das vorangestellt wird; in diesem Fall wird die Einheit von der Verarbeitung einer gegebenen Pixelpipe ausgeschlossen. Du kannst auch ein Sternchen *
als Stellvertreter-Zeichen nutzen, das alle Einheiten repräsentiert, die vorher in dieser Gruppe nicht explizit erwähnt wurden.
Die Reihenfolge innerhalb einer Gruppe ist wichtig – darktable liest eine Liste von links nach rechts und wann immer es versucht eine OpenCL Einheit einer Pixelpipe zuzuordnen, wird es die Einheiten in dieser Reihenfolge scannen, und die ersten freien Einheit nehmen, die es finden kann.
Wenn eine Pixelpipe-Verabeitung gestartet wird und alle GPUs in der entsprechenden Gruppe ausgelastet sind, wird darktable das Bild standardmäßig in der CPU verarbeiten. Du kannst aber eine GPU-Verarbeitung erzwingen, indem du der Liste der erlaubten GPUs ein +
voranstellst. In diesem Fall wird darktable die CPU nicht verwenden, sondern den Prozess pausieren bis die nächste zugelassene OpenCL-Einheit verfügbar ist.
darktables Standardeinstellung für “opencl_device_priority” ist */!0,*
.
Jeder aufgefundenen OpenCL-Einheit ist es erlaubt, das Hauptbild zu verarbeiten. Die erste OpenCL-Einheit (0) darf nicht beide Voransichten der Pixelpipe des kleinen Bildes verarbeiten. Als Konsequenz, wenn es auf deinem System nur eine GPU gibt, dann wird die Pixelpipe des kleinen Bildes immer in der CPU verarbeitet, und behält so deine einzige GPU exklusiv für das anspruchsvollere Grossbild. Das ist eine vernünftige Einstellung für die meisten Systeme. Für die Pixelpipe der Vorschaubilder gibt es keine solchen Einschränkungen.
Der Standard ist eine gute Wahl, wenn du nur eine Einheit hast. Wenn du mehrere Einheiten hast, gibt er einen guten Anfangspunkt ab. Wenn jedoch deine Einheiten ganz unterschiedliche Niveaus von Rechnerleistung haben, wird es Sinn ergeben, etwas Zeit für eine Optimierung der Prioritätenliste zu investieren.
Hier ist ein Beispiel. Nehmen wir mal an, wir haben ein System mit zwei Einheiten, eine schnelle Nvidia Quadro RTX 4000 und eine ältere langsamere GeForce GTX 1050. darktable (aufgestartet mit darktable -d opencl
) wird die folgenden Einheiten melden:
[opencl_init] successfully initialized.
[opencl_init] here are the internal numbers and names of
OpenCL devices available to darktable:
[opencl_init] 0 'NVIDIA GeForce GTX 1050'
[opencl_init] 1 'NVIDIA CUDA Quadro RTX 4000'
[opencl_init] FINALLY: opencl is AVAILABLE on this system.
Mit den Canonical Namen, die oben als nvidiagforcegtx1050
und nvidiacudaquadrortx4000
angezeigt werden
Hier wird die GeForce GTX 1050 als erste Einheit entdeckt und die Quadro RTX 4000 als die zweite. Diese Reihenfolge wird normalerweise nicht wechseln, ohne dass die Hardware oder die Treiber-Konfiguration geändert wird. Es ist aber besser, die Gerätenamen zu verwenden anstelle der Nummern, um auf der sicheren Seite zu sein.
Da die GTX 1050 langsamer ist als die RTX 4000, könnte eine optimierte “opencl_device_priority” könnte aussehen wie:
!nvidiagforcegtx1050,*/!nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/!nvidiacudaquadrortx4000
.
Die GTX 1050 wird ausdrücklich davon ausgeschlossen die Pixelpipe des Hauptbildes zu verarbeiten; das ist reserviert für “alle” anderen Einheiten (z.B. die RTX 4000). Umgekehrt – für die Pixepipes – die RTX 4000, sodass es nur der GTX 1050 erlaubt ist, zu arbeiten.
Für den Export von Dateien und die Generierung der Vorschaubilder möchten wir alle Möglichkeiten haben. darktable soll aber trotzdem zuerst überprüfen, ob die RTX 4000 Einheit frei ist, da diese schneller ist, und dann alle anderen Einheiten – hier nur die GTX 1050 – werden geprüft.