darktable page lede image
darktable page lede image

OpenCL Performanceoptimierung

10.2.7. OpenCL Performanceoptimierung

Es gibt einige Konfigurationsparameter in $HOME/.config/darktable/darktablerc, die helfen, die OpenCL-Performance Ihres Systems zu optimieren. Performance bedeutet in diesem Zusammenhang meist die Latenzzeit von darktable während der interaktiven Arbeit, d.h. wie lange es dauert, Ihre Pixelpipe wieder aufzubereiten. Für einen komfortablen Workflow ist es unerlässlich, die Latenzzeit gering zu halten.

Um ausführliche Informationen zu erhalten, starten Sie darktable von einem Terminal aus mit

darktable -d opencl -d perf

Nach jeder Wiederaufbereitung von Pixelpipe – verursacht durch Änderung der Modulparameter, Zoomen, Schwenken, etc. – erhalten Sie die Gesamtzeit und die Zeit, die Sie in jedem unserer OpenCL-Kernel verbracht haben. Der zuverlässigste Wert ist die Gesamtzeit, die in Pixelpipe verbracht wird. Bitte beachten Sie, dass die für jedes einzelne Modul angegebenen Timings beim asynchronen Betrieb der OpenCL Pixelpipe unzuverlässig sind (siehe opencl_async_pixelpipe weiter unten).

Um eine schnelle Pixelpipe-Verarbeitung mit OpenCL zu ermöglichen, ist es unerlässlich, dass wir den Grafikprozessor auf Trab halten. Interrupts oder ein blockierter Datenfluss erhöhen die Gesamtverarbeitungszeit. Dies ist besonders wichtig für die kleinen Bildpuffer, die wir während der interaktiven Arbeit handhaben müssen. Sie können mit einer schnellen GPU schnell verarbeitet werden. Aber auch kurzfristige Stalls der Pixelpipe werden schnell zum Flaschenhals.

Andererseits hängt die Leistung von darktable beim Dateiexport mehr oder weniger nur von der Geschwindigkeit unserer Algorithmen und der PS-Leistung Ihrer GPU ab. Kurzfristige Stände haben keinen spürbaren Einfluss auf die Gesamtzeit eines Exports.

darktable kommt mit Standardeinstellungen, die auf den meisten Systemen eine ordentliche GPU-Leistung liefern sollten. Wenn Sie jedoch selbst ein wenig herumfummeln und versuchen wollen, die Dinge weiter zu optimieren, finden Sie hier eine Beschreibung der relevanten Konfigurationsparameter.

opencl_async_pixelpipe

Dieses boolesche Flag steuert, wie oft wir die OpenCL Pixelpipe blockieren und einen Status bei Erfolg oder Misserfolg aller ausgeführten Kernel erhalten. Um eine optimale Latenzzeit zu erreichen, setzen Sie diese auf TRUE, sodass darktable die Pixelpipe asynchron abläuft und versucht, so wenig Interrupts wie möglich zu verwenden. Wenn OpenCL-Fehler auftreten, wie z. B. fehlerhafte Kernel, setzen Sie den Parameter auf FALSE. darktable unterbricht dann nach jedem Modul, sodass Sie das Problem leichter isolieren können. Es wurden Probleme mit einigen älteren ATI/AMD-Karten, wie z. B. HD57xx, gemeldet, die eine verstümmelte Ausgabe erzeugen können, wenn dieser Parameter auf TRUE gesetzt ist. Im Zweifelsfall belassen Sie es bei der Standardeinstellung FALSE.

opencl_number_event_handles

Ereignishandler werden verwendet, um den Erfolg oder Misserfolg von Kernel und Profiling Info zu überwachen, auch wenn die Pixelpipe asynchron ausgeführt wird. Die Anzahl der Event-Handles ist eine begrenzte Ressource Ihres OpenCL-Treibers. Sicherlich können wir sie recyceln, aber es gibt eine begrenzte Anzahl, die wir gleichzeitig nutzen können. Leider gibt es keine Möglichkeit herauszufinden, wie hoch die Ressourcenbegrenzungen sind; wir müssen also raten. Unser Standardwert von 25 ist recht konservativ. Sie sollten versuchen, ob höhere Werte wie 100 eine bessere OpenCL-Performance liefern. Wenn Ihrem Treiber keine freien Handles mehr zur Verfügung stehen, werden Sie feststellen, dass der OpenCL-Kernel mit dem Fehlercode -5 (CL_OUT_OF_RESOURCES) fehlschlägt oder sogar abstürzt oder das System einfriert. Ein Wert von 0 blockiert darktable von der Verwendung beliebiger Ereignis-Handles. Dies wird darktable daran hindern, den Erfolg Ihrer OpenCL-Kernel korrekt zu überwachen, erspart aber einige Treiber-Overheads. Die Konsequenz daraus ist, dass Ausfälle wahrscheinlich zu einer verstümmelten Ausgabe führen, ohne dass die darktable Notiz nimmt; nur empfehlenswert, wenn Sie sicher wissen, dass Ihr System absolut stabil läuft. Sie können diesen Parameter auch auf -1 setzen, was bedeutet, dass darktable keine Beschränkung in der Anzahl der Event-Handles annimmt; dies ist nicht empfehlenswert.

opencl_synch_cache

Dieser Parameter, wenn er auf TRUE gesetzt ist, zwingt darktable dazu, nach jedem Modul Bildpuffer von Ihrer GPU zu holen und diese im Pixelpipe-Cache zu speichern. Dies ist ein sehr ressourcenintensives Verfahren, ergibt aber je nach Grafikkarte Sinn (auch wenn die Grafikkarte eher langsam ist). In diesem Fall könnte darktable tatsächlich etwas Zeit sparen, wenn sich die Modulparameter geändert haben, da es zu einem Zwischenzustand im Cache zurückkehren und nur einen Teil der Pixelpipe erneut verarbeiten kann. In den meisten Fällen sollte dieser Parameter auf "aktives Module" (Standard) gesetzt werden.

opencl_micro_nap

Im Idealfall halten Sie Ihre GPU bei der Wiederaufbereitung der Pixelpipe zu 100% ausgelastet. Das ist gut. Andererseits ist Ihr Grafikprozessor auch für regelmäßige GUI-Updates erforderlich. Es kann vorkommen, dass für diese Aufgabe nicht mehr genügend Zeit zur Verfügung steht. Die Folge wäre eine ruckartige Reaktion Ihrer GUI auf das Schwenken, Zoomen oder Verschieben von Schiebereglern. darktable kann kleine Nickerchen in seine Pixelpipe-Verarbeitung einfügen, damit der Grafikprozessor Luft holen und GUI-bezogene Dinge erledigen kann. Der Parameter opencl_micro_nap steuert die Dauer dieser Nickerchen in Mikrosekunden. Sie müssen experimentieren, um einen optimalen Wert für Ihr System zu finden. Werte von 0, 100, 500 und 1000 sind gute Ansatzpunkte zum Ausprobieren. Standardwert ist 1000.

opencl_use_pinned_memory

Während des Kachelns müssen große Mengen an Speicher zwischen Host und Gerät übertragen werden. Auf manchen Geräten (namentlich AMD) können direkte Speichertransfers von und zu einem beliebigen Host-Speicherbereich zu einer enormen Leistungseinbuße führen. Dies macht sich besonders beim Export großer Bilder bemerkbar. Wenn dieser Konfigurationsparameter auf TRUE gesetzt wird, wird darktable aufgefordert, eine spezielle Art von Zwischenpuffer für den Datentransfer zwischen Host-Geräten zu verwenden. Auf manchen Geräten kann dies den Export großer Dateien um den Faktor 2 bis 3 beschleunigen. NVIDIA-Geräte und -Treiber scheinen über eine effizientere Speicherübertragungstechnik zu verfügen, selbst für beliebige Speicherbereiche. Da sie keinen Performancesteigerung aufweisen und sogar verstümmelte Ausgaben erzeugen können, sollte opencl_use_pinned_memory bei diesen Geräten auf der Standardeinstellung FALSE belassen werden.