Memory Anforderungen

Processing a raw image in Ansel requires a great deal of system memory. A simple calculation makes this clear: For a 20 megapixel image, Ansel requires a 4x32-bit floating point cell to store each pixel, meaning that each full image of this size will require approximately 300MB of memory just to store the image data. In order to actually process this image through a given module, Ansel needs at least two buffers (input and output) of this size, with more complex modules potentially requiring several additional buffers for intermediate data. Without further optimization, anything between 600MB and 3GB of memory might be required to store and process image data as the pixelpipe executes. On top of this is Ansel’s code segment, the code and data of any dynamically-linked system libraries, as well as further buffers that Ansel uses to store intermediate states (cache) for quick access during interactive work.

Zusammen erfordert Ansel mindestens 4GB physikalisches RAM plus 8GB zusätzlichen Speicher für die Auslagerung, aber es wird besser laufen, je mehr Speicher du hast.

Wie auch mit der Ausführung in der CPU, haben viele Module von Ansel Implementationen von OpenCL, um die Vorteile von parallelen Verarbeitungen deiner Grafikkarte (GPU) mitzunehmen. Ähnlcih auch ier, je mehr GPU Speicher du hast, umso besser wird Ansel laufen.

Kacheln

Wenn Ansel nicht genügend Speicher für die Bearbeitung eines ganzen Bildes in einem Durchgang hat, dann werden die Module eine “Kachel-Strategie” wählen, in der das Bild in kleinere Teile (Kacheln) aufgeteilt wird, welche dann unabhängig bearbeitet und am Ende wieder zusammengefügt werden. Während diese Art zwar die Bearbeitung von Bildern mit einem viel kleineren Speicher ermöglicht, gibt es auch Nachteile:

  • tiling is always slower – sometimes up to 10x slower, though for some modules the difference is negligible,
  • tiling is not technically possible for some modules because of the nature of the underlying algorithms

Für die meisten Systeme wird Kacheln vermutlich nur für den Export von Bildern voller Grösse nötig sein, mit effizienteren interaktiven Prozessen in der Dunkelkammer. Für die beste Performance (und um Kacheln zu verhindern), solltest du Ansel mit möglichst wenigen andern Applikationen parallel laufen lassen und Ansel dahingehend konfigurieren, so viel des GPU Memory zu nutzen wie möglich.

Abstimmung der Performance

There are a number of configuration parameters that can help you to fine-tune your system’s performance. Some of these parameters are available in Preferences > Processing > CPU, GPU, Memory and others need to be modified directly in Ansel’s configuration file (found in $HOME/.config/Ansel/Anselrc).

Dieser Abschnitt gibt dafür einige Leitlinien, wie man diese Einstellungen anpassen kann.

Wie Testen

Um herauszufinden, um wie viel deine Anpassungen die Leistung von Ansel erhöhen (oder nicht), brauchst du für das Testen eines oder mehrere Beispiel-Bilder und eine Methode zur Beurteilung der Geschwindigkeit der Pixelpipe,

For sample images, you are advised to use some of the more intensive modules, such as diffuse or sharpen or denoise (profiled). Exports are likely to have more consistent and comparable timings between pipe runs than interactive work (and will also push your hardware more).

Um Informationen über das Profilieren zu erhalten, musst du Ansel vom Terminal neu starten mit Ansel -d opencl -d perf. Falls du mehr Informationen über Kacheln solltest du Ansel -d opencl -d tiling -d perf nutzen.

Each time the pixelpipe is processed (when you change module parameters, zoom, pan, export etc.) you will see (in your terminal session) the total time spent in the pixelpipe and the time spent in each of the OpenCL kernels. The most reliable value is the total time spent the in pixelpipe and you should use this to assess your changes.


Beachte: Die Zeitmessungen für jedes einzelne Modul sind unzuverlässig, wenn die Pixelpipe der OpenCL asynchron laufen (siehe den asynchronen Modus unten).


Um eine effiziente Bearbeitung mit OpenCL zu gewährleisten, ist es essentiell, dass wir die GPU am Laufen gehalten wird. Jegliche Unterbrechung oder stockender Datenfluss verlängert die Verarbeitungszeit. Dies ist besonders wichtig für die kleinen Bildpuffer, die während dem interaktiven Arbeiten gebraucht werden, welche einer schnellen GPU verarbeitet werden können. Selbst ein kurzzeitiges Stocken der Pixelpipe kann leicht zu einem Flaschenhals werden.

Auf der anderen Seite wird die Performance von Ansel während des Dateiexports mehr oder weniger ausschliesslich von der Schnelligkeit der Algorithmen und den Pferdestärken deiner Grafikkarte bestimmt. Kurze Unterbrechungen werden keine merkliche Auswirkung auf die Dauer des Exports haben.

Andere Ressourcen von Ansel

The “Ansel resources” preference (in Preferences > Processing > CPU, GPU, Memory) allows you to choose between four different approaches to allocating your system’s resources to Ansel. Each of these options controls multiple individual parameters, which are defined independently in $HOME/.config/Ansel/Anselrc. You can amend any of these directly within your Anselrc file to tweak values for your selected resource level, though you cannot add your own custom resource level to the preferences drop-down.

Jede der vier “Ressourcen von Ansel”-Optionen werden wie folgt definiert:

1Ressource_Standard=512 8 128 700
2Ressource_gross=700 16 128 900
3Ressource_klein=128 4 64 400
4Ressource_unbeschränkt=16384 1024 128 900

Allgemeiner können dies auch vorgestellt werden als Ressource_level=a b c d worin a - d wie folgt definiert werden:

a. Systemspeicher für die Bearbeitung von Modulen
der maximale Teil des Systemspeichers wird für die Bearbeitung von Modulen bereitgestellt. Kleiner Werte bewirken, dass speicherhungrige Module vermehrt mit Kacheln bearbeiten. Diese Zahl ist ein Teil des Gesamtwertes des System-Speichers geteilt durch 1024. Zum Beispiel in einem System mit 16 GB Systemspeicher, ist der Teil der als Standard-Ressource (in GB) 16 * 512 / 1024, oder 8GB von System RAM.
b. Minimale Puffergrösse zum Kacheln
Die minimale Grösse eines Puffers zum Kacheln wird als Fraktion des gesamten Systemspeichers. Zum Beispiel wird bei einem System mit 16GB Systemspeichers ist die Höhe der zugewiesenen durch Standard Ressource (in GB) ist 16 * 8 / 1024, oder 0.125GB des System RAM. Beachte, dass diese Einstellung zur Hauptsache historisch und praktisch nicht mehr länger in Betrieb ist – es wird geraten, das beim Standard zu belassen.
c. Cache Memory für die Miniaturansichten
Die Grösse des Memory für das Cache der Miniaturansichten. Auch das wird ausgedrückt als Bruchteil des System-Memory, und auf einem 16GB System ist die zugeteilte Grösse durch Standard Ressource ist 16 * 128 / 1024, oder 2GB des System RAM.
d. speicher für OpenCL
Der maximale Anteil des GPU Memory, der für Bearbeitung mit Modulen zur Verfügung gestellt wird. Wie mit dem System Memory, bewirken niedrigere Werte, die Bearbeitung von speicher-hungrigen Modulen, vermehrt mit einer steigenden Zahl von Kacheln zu arbeiten. Deine GPU Memory wird wohl auch für andere Applikationen deines Systems genutzt werden. Jedoch kann deine GPU, im Gegensatz zum System Memory, nicht von einem Swap-Betrieb profitieren und es wird schwierig für Ansel zu wissen, wie viel Speicher genau zu diesem Zeitpunkt zur Verfügung steht. Wenn der Wert zu hoch angesetzt wird, kann es sein, dass Ansel auf eine CPU-Bearbeitung zurückfällt (die natürlich bedeutend langsamer ist). Deshalb beinhaltet der Anteil der GPU Memory einen Freiraum von 400MB Speicher, um eine zu hohe Zuteilung zu vermeiden. Zum Beispiel wird bei einer GPU von 6GB Memory Ansel ungefähr (6 - 0.4) * 700 / 1024, oder 3.8GB vom GPU RAM beim Niveau der Standard Ressource.

Zusätzlich zu den Anteilen der Ressourcen, die in der Benutzeroberfläche angezeigt werden, können noch die folgenden Optionen in der Befehlszeile gesetzt werden (z.B. Ansel --conf resourcelevel="notebook"). Diese Modi sind zur Fehlersuche bei Kacheln-Störungen da und bei der Test-Performance von gewöhnlichen Systemen auf grösseren Entwickler-Maschinen. Dabei gibt es die folgenden Optionen:

  • “mini” (1GB ram, 2MB single buffer, 128MB thumbnail cache, 200MB OpenCL memory)
  • “notebook” (4GB ram, 32MB single buffer, 512MB thumbnail cache, 1GB OpenCL memory)
  • “reference” (8GB ram, 32MB single buffer, 512MB thumbnail cache, 2GB OpenCL memory)

Abstimmung des Gebrauches des GPU Memory

Wenn du mit OpenCL das Beste aus deinem GPU Memory herausholen willst, hast du drei Optionen:

  • Choose the “large” resource level. For a 6GB card, this will use approximately 5GB of GPU memory, leaving 1GB for the rest of your system.
  • Alter Anselrc to increase the last number (the OpenCL memory fraction) for your selected resource level. For example, increasing the OpenCL memory fraction to 950 would increase the available memory on a 6GB GPU to approximately 5.3GB.
  • Set preferences > processing > cpu / gpu / memory > tune OpenCL performance to “memory size”, which will use all of your device’s memory, less a 400MB headroom. Please see the section below for other options related to this setting.

Gerätespezifische Konfiguration von OpenCL

Die Ansel Standardeinstellungen, sollten auf den meisten Systemen zu einer annehmbaren Grafikperformanz führen. Wenn du aber selber noch zusätzlich optimieren möchtest, zeigt dieser Abschnitt die Beschreibung der relevanten Konfigurationsparameter (welche alle in deiner Anselrc Datei gesetzt werden).

Seit darktable 4.0 werden die meisten Optionen im Zusammenhang mit OpenCL mit einer “pro Gerät”-Strategie gemanagt. Die Konfigurations-Parameter sehen für jedes Gerät so aus:

cldevice_v4_quadrortx4000=0 250 0 16 16 1024 0 0 0.017853

oder allgemeiner

cldevice_version_canonicalname=a b c d e f g h i

Ein Eintrag wird in Anselrc für jedes neu gefundene Gerät beim Start von Ansel beim ersten Mal mit der korrekten Canonical-Gerätenummer und Versions-Nummer versehen. Die Parameter a - i werden wie folgt definiert und können manuell angepasst werden.

a. avoid atomics
1 = avoid atomics; 0 = use atomics
Atomic operations in OpenCL are a special method of data synchronization and are only used in a few modules. Unfortunately, some old AMD/ATI devices are extremely slow in processing atomics and, on these cards, it is better to process the affected modules on the CPU rather than accepting an ultra-slow GPU codepath. Set this parameter to 1 if you experience slow processing within modules like local contrast or if you get intermittent system freezes. Please note that this should not affect any card manufactured since 2015.
b. micro nap
Standard 250
In einem Idealfall wirst du deine GPU 100 % am Laufen halten, wenn die Pixelpipe arbeitet. Wenn jedoch deine GPU auch für auch deinen Bildschirm updaten muss, und Ansel nutzt sie zu 100%, kann es sein, dass nicht genügend Zeit für diese Aufgabe übrig bleibt. Normalerweise wird das eine ruckartige Reaktion deines GUI sein beim Schwenken, beim Zoomen oder wenn Schieber bewegt werden. Um das zu lösen, kann Ansel kleine Unterbrechungen im Abarbeiten der Pixelpipe einschieben, damit die GPU etwas relaxen kann und GUI bezogenen Aktivitäten ausführen kann. Der Parameter “micro nap” kontrolliert die Dauer dieser Unterbrechungen in Mikrosekunden. Bei gegenwärtigen Systemen bist du mit dem Standard-Wert sehr gut dran, sogar bei integrierten Grafikkarten. Wenn du Vielfachgeräte nutzest oder du nutzest dein diskretes Gerät für zum Zeichnen auf deinem Bildschirm, kann der Wert für das nicht Desktop Gerät auf 0 gesetzt werden.
c. pinned memory
0 = use gui to select mode; 1 = enforce pinned transfer; 2 = disable pinned transfer
During tiling huge amounts of memory need to be transferred between host and device. On some devices direct memory transfers to and from an arbitrary host memory region may give a large performance penalty. This is especially noticeable when exporting large images on smaller graphics cards or while using newer modules like diffuse or sharpen or the guided laplacians mode in the highlight reconstruction module.

There is no safe method or general rule to predict whether or not this parameter will provide a performance benefit, so you will have to experiment for yourself. This mode can also be set globally by setting the “tune OpenCL performance” option to “memory transfer” (in Preferences > Processing > CPU, GPU, Memory), in which case this parameter should be set to 0. Otherwise, you can enable/disable it at a device level using this parameter.

d. clroundup wh / e. clroundup ht
Diese Parameter sollten auf diesem Standardwert belassen werden – Tests haben keinen Vorteil gezeigt, andere Werte zu verwenden.
f. Anzahl der Event-Handles
Event-Handles werden von Ansel verwendet, um den Erfolg/Fehler von Kernels zu überwachen und Profilinformationen bereitzustellen, selbst wenn die Pixelpipe asynchron ausgeführt wird. Die Anzahl der Event-Handles ist eine begrenzte Ressource Ihres OpenCL-Treibers – obwohl sie recycelt werden können, gibt es eine begrenzte Anzahl, die gleichzeitig verwendet werden kann. Leider gibt es keine Möglichkeit, die Ressourcengrenzen für ein bestimmtes Gerät herauszufinden, daher verwendet Ansel standardmäßig eine sehr konservative Schätzung von 128. Auf den meisten aktuellen Geräten und Treibern können Sie davon ausgehen, dass eine Zahl von bis zu 1024 sicher ist und zu einer etwas besseren OpenCL-Leistung führt. Wenn Ihrem Treiber die freien Handles ausgehen, treten fehlgeschlagene OpenCL-Kernel mit der Fehlermeldung „CL_OUT_OF_RESOURCES“ oder sogar Abstürze oder Systemeinfrierungen auf.

Ein Wert von 0 verhindert, dass Ansel Event-Handles verwendet. Dies verhindert, dass Ansel den Erfolg Ihrer OpenCL-Kernel ordnungsgemäß überwacht, spart jedoch etwas Treiber-Overhead, was zu einer besseren Leistung führt. Die Folge ist, dass alle Fehler wahrscheinlich zu einer verstümmelten Ausgabe führen, ohne dass Ansel es bemerkt. Dies wird nur empfohlen, wenn Sie sicher sind, dass Ihr System felsenfest läuft.

g. asynchroner Modus
1 = asynchronen Modus verwenden; 0 = nicht verwenden
Dieses Flag steuert, wie oft Ansel die OpenCL-Pixelpipe blockiert, um einen Status über Erfolg/Fehler der ausgeführten Kernel zu erhalten. Setzen Sie dies für eine optimale Latenz auf 1, damit Ansel die Pixelpipe asynchron ausführt und versucht, so wenig Interrupts/Events wie möglich zu verwenden. Wenn OpenCL-Fehler wie fehlerhafte Kernel auftreten, setzen Sie den Parameter auf 0 (Standardeinstellung) zurück. Dies führt dazu, dass Ansel nach jedem Modul unterbrochen wird, sodass Sie Probleme leichter eingrenzen können. Es wurden Probleme mit einigen älteren AMD/ATI-Karten (wie der HD57xx) gemeldet, die eine verstümmelte Ausgabe erzeugen können, wenn dieser Parameter auf 1 gesetzt ist. Belassen Sie im Zweifelsfall den Standardwert 0.
h. Gerät deaktivieren
0 = Gerät aktivieren; 1 = Gerät deaktivieren
Wenn Ansel ein fehlerhaftes Gerät erkennt, wird es automatisch als solches markiert, indem dieser Parameter auf 1 gesetzt wird. Wenn Sie ein Gerät haben, das viele Fehler meldet, können Sie es manuell deaktivieren, indem Sie dieses Feld auf 1 setzen
i. Benchmark
Wenn Ansel ein neues Gerät auf dem System erkennt, führt es einen kleinen Benchmark durch und speichert das Ergebnis hier. Sie können diesen Wert auf 0 zurücksetzen, um Ansel zu zwingen, den Benchmark erneut durchzuführen, aber in den meisten Fällen sollten Sie diese Einstellung nicht ändern.

Note: Wenn Ansel einen “fehlerhaften” Gerätekonfigurationsschlüssel entdeckt, wird er auf die Standardwerte zurückgeschrieben.


id-spezifische OpenCL-Konfiguration

A second device-specific configuration key is also provided, which takes into account both the device name and the device id (just in case you have two identical devices). In this case, the usual key name cldevice_version_canonicalname is followed by _idX with X being the device id. For example, if the above example device was referred to as device 0, the second configuration setting would (by default) be cldevice_v4_quadrortx4000_id0=400.

Für diesen Konfigurationsschlüssel ist derzeit nur ein einziger Parameter definiert:

forced headroom (default 400)
The amount of memory (in MB) that will not be used by Ansel during OpenCL processing. This setting is only valid if you set preferences > processing > tune OpenCL performance to “memory size”.

Wenn Sie diesen Parameter auf Null (0) setzen, wird Ansel beim ersten Durchlauf einer Pixelpipe versuchen, festzustellen, wie viel GPU-Speicher tatsächlich verfügbar ist, und verwenden diesen (mit einer Sicherheitsspanne von 100 MB) als die maximale Speichermenge, die Ansel für den Rest seiner Sitzung verwendet. Dies ist normalerweise sicher, es sei denn, Sie starten andere Anwendungen (die eine Menge an GPU-Speicher verwenden), während Ansel ausgeführt wird. Andernfalls könnte die Verwendung dieser Option Out-of-Memory Fehler verursachen, die dazu führen, dass Ansel auf die CPU zurückgreift und die Leistung erheblich verringert. Sie können diese Option aus- und wieder einschalten, um Ansel zu veranlassen, seine Speicherberechnung erneut durchzuführen (zu Beginn des nächsten Pipe-Runs). Beachten Sie, dass es bekannte Probleme mit der automatischen Speichererkennung bei neueren Nvidia-Treibern gibt, daher sollte die automatische Erkennung mit Vorsicht verwendet werden und ist daher standardmäßig deaktiviert.

Wenn Sie sicher sind, dass keine Apps (oder Ihr Betriebssystem) das spezifische Gerät verwenden, können Sie diesen Parameter für das ansonsten nicht verwendete Gerät auf 1 setzen, damit Ansel den gesamten Speicher dieses Geräts verwendet.

Der Standardwert von 400 MB sollte für die meisten Systeme ausreichend sein. Wenn Sie feststellen, dass Leistungsprobleme auftreten, weil Ansel auf CPU zurückfällt, versuchen Sie, es auf 600 zu ändern oder “auf Speichergröße abstimmen” zu deaktivieren.

andere Konfigurationsschlüssel

Die folgenden zusätzlichen Konfigurationsschlüssel sind auch in Anselrc verfügbar:

cldevice_version_canonicalname_building
Diese Option wird beim Kompilieren von OpenCL-Kernels verwendet und kann zur Leistungsoptimierung oder zur Umgehung von Fehlern bereitgestellt werden. Sie müssen alle vorhandenen Kernel entfernen, um sie mit den neuen Optionen neu zu kompilieren. Geben Sie eine leere Zeichenfolge an, um Kernel ohne Optionen neu zu kompilieren. Entfernen Sie die Einstellung vollständig, um Kernel mit den Standardoptionen neu zu kompilieren. Der aktuelle Standardwert ist -cl-fast-relaxed-math.
opencl_synch_cache
Wenn dieser Parameter auf „true“ gesetzt ist, zwingt er Ansel, Bildpuffer von Ihrer GPU nach jedem Modul abzurufen und sie in seinem Pixelpipe-Cache zu speichern. Dies ist ein ressourcenintensiver Vorgang, kann aber je nach GPU sinnvoll sein (auch wenn die GPU eher langsam ist). In diesem Fall kann Ansel tatsächlich etwas Zeit sparen, wenn sich Modulparameter geändert haben, da es zu einem zwischengespeicherten Zwischenzustand zurückkehren und nur einen Teil der Pixelpipe erneut verarbeiten kann. In vielen Fällen sollte dieser Parameter auf “active module” (Standardeinstellung) eingestellt werden, wodurch nur die Eingabe des aktuell fokussierten Moduls zwischengespeichert wird.