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 Einheiten nutzt. Jede Prozess-Sequenz eines Bildes – um eine Eingabe mit einem Verlaufsstapel in die endgültige Ausgabe zu konvertieren – wird in einer Pixelpipe durchgeführt. Es gibt vier verschiedenen Pixelpipes in darktable. Ein Typ ist verantwortlich für die Verarbeitung der zentralen Großansicht des Bildes, eine nächste verarbeitet das kleine Bild (im Navigationsfeld). Es kann sein, dass eine dieser Pixelpipes jederzeit laufen kann, mit der Großansicht und im kleinen Bild parallel. Zusätzlich können mehrere Pixelpipes laufen für die Datei-Ausgabe sowie mehrere Pixelpipes, die Vorschau-Bilder generieren. Falls eine OpenCL Einheit vorhanden ist, wird darktable diese dynamisch an eine spezifische Pixelpipe zuweisen und sie nachher wieder auslagern.

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 Haupbild braucht schon mehr, und eine volle Export-Pixelpipe braucht noch einmal mehr.

Der Konfigurations-Parameter “opencl_device_priority” hat einen String mit der folgenden Struktur: a,b,c.../k,l,m.../o,p,q.../x,y,z.... Jeder Buchstabe repräsentiert eine spezifische OpenCL-Einheit. ES gibt vier 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 k,l,m... das kleine Bild, Einheiten o,p,q... die Export Pixelpipe und zuletzt Einheiten k,l,mx,y,z... die Pixelpipe der Vorschaubilder. Ein leeres Feld will heißen, 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 dem Namen (Groß-, 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 ein Pixelpipe-Prozess gestartet wird und alle GPUs in der entsprechenden Gruppe beschäftigt sind, wird darktable das Bild standardmäßig automatisch in der CPU bearbeiten. Du kannst aber eine GPU-Verarbeitung forcieren, 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.

darktable’s Standard-Einstellung für “opencl_device_priority” ist */!0,*/*/*.

Jeder aufgefundenen OpenCL-Einheit ist es erlaubt das Hauptbild zu verarbeiten. Die erste OpenCL-Einheit (0) darf die Pixelpipe des kleinen Bildes nicht 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 Großbild. 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 Radeon HD7950 und eine ältere langsamere GeForce GTS450. 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 'GeForce GTS 450'
[opencl_init] 1 'Tahiti'
[opencl_init] FINALLY: opencl is AVAILABLE on this system.

Hier wird die GeForce GTS 450 als erste Einheit entdeckt und die Radeon HD7950 (‘Tahiti’) 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 GTS450 langsamer ist als die HD7950, könnte eine optimierte “opencl_device_priority” könnte aussehen wie: !GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*.

Die GTS450 wird ausdrücklich davon ausgeschlossen die Pixelpipe des Hauptbildes zu verarbeiten; das ist reserviert für “alle” anderen Einheiten (i.e. the HD7950/Tahiti). Umgekehrt für die Pixepipe des kleinen Bildes wird die Tahiti ausgeschlossen, dass nur die GTS450 die Arbeit verrichten kann.

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 Tahiti-Einheit frei ist, da diese schneller ist, und dann alle anderen Einheiten – hier nur die GTS450 – werden geprüft.

Translations