prestatie optimalisatie

Er zijn een aantal configuratieparameters in $HOME/.config/darktable/darktablerc die kunnen helpen om de OpenCL-prestaties van jouw systeem te verfijnen. Prestaties in deze context betekenen meestal de vertraging van darktable tijdens interactief werk (d.w.z. hoe lang het duurt om de pixelpijp opnieuw te verwerken). Voor een comfortabele werkvolgorde is het essentieel om de vertraging laag te houden.

Om profileringsinformatie te verkrijgen, moet je darktable starten vanaf een terminal met darktable -d opencl -d perf.

Na elke herverwerking van de pixelpijp – veroorzaakt door moduleparameterwijzigingen, zoomen, pannen, enz. – zie je de totale tijd die in de pixelpijp is doorgebracht en de tijd die in elk van de OpenCL-kernels is doorgebracht. De meest betrouwbare waarde is de totale tijd doorgebracht in de pixelpijp. Houd er rekening mee dat de timing voor elke afzonderlijke module onbetrouwbaar is wanneer de OpenCL pixelpijp asynchroon wordt uitgevoerd (zie opencl_async_pixelpipe hieronder).

Om snelle pixelpijp-verwerking met OpenCL mogelijk te maken, is het essentieel dat we de GPU bezig houden. Eventuele onderbrekingen of een vastgelopen gegevensstroom zullen bijdragen aan de totale verwerkingstijd. Dit is vooral belangrijk voor de kleine beeldbuffers die we nodig hebben tijdens interactief werken. Deze kunnen snel worden verwerkt door een snelle GPU. Echter, zelfs korte termijn haperingen van de pixelpijp kunnen gemakkelijk een bottleneck worden.

Aan de andere kant worden de prestaties van darktable tijdens het exporteren van bestanden min of meer alleen bepaald door de snelheid van onze algoritmen en de paardenkracht van jouw GPU. Kortdurende haperingen zullen geen merkbaar effect hebben op de totale duur van een export.

darktable wordt geleverd met standaardinstellingen die op de meeste systemen behoorlijke GPU-prestaties moeten leveren. Als je echter zelf een beetje wilt rommelen en de zaken verder wilt optimaliseren, volgt hier een beschrijving van de relevante configuratieparameters.

opencl_async_pixelpipe
Deze vlag bepaalt hoe vaak darktable de OpenCL pixelpijp blokkeert om een status te krijgen op succes/mislukking van de kernels die zijn uitgevoerd. Voor een optimale vertraging zet je dit op TRUE, zodat darktable de pixelpijp asynchroon laat lopen en zo min mogelijk interrupts probeert te gebruiken. Als je OpenCL-fouten ervaart, zoals falende kernels, stel je de parameter in op FALSE. darktable onderbreekt dan na elke module, zodat je het probleem gemakkelijker kunt isoleren. Er zijn problemen gemeld met sommige oudere AMD/ATI-kaarten, zoals de HD57xx, die vervormde uitvoer kunnen produceren als deze parameter is ingesteld op TRUE. Als je twijfelt, laat het dan op de standaardwaarde FALSE staan.
opencl_number_event_handles
Event-handles worden gebruikt zodat darktable het succes/falen van kernels en profileringsinformatie kan volgen, zelfs als de pixelpijp asynchroon wordt uitgevoerd. Het aantal gebeurtenishandles is een beperkte hulpbron van jouw OpenCL-stuurprogramma. Ze kunnen zeker worden gerecycleerd, maar er is een beperkt aantal dat tegelijkertijd kan worden gebruikt. Helaas is er geen manier om erachter te komen wat de resourcelimieten zijn, dus darktable moet raden. De standaardwaarde van 25 is vrij conservatief. Misschien wil je zien of hogere waarden zoals 100 betere OpenCL-prestaties geven. Als jouw stuurprogramma geen vrije handvatten meer heeft, zul je te maken krijgen met falende OpenCL-kernels met foutcode -5 (CL_OUT_OF_RESOURCES) of zelfs crashes of het systeem loopt vast. Verlaag het aantal opnieuw als dat gebeurt. Een waarde van 0 blokkeert darktable van het gebruik van eventhandles. Dit zal voorkomen dat darktable het succes van jouw OpenCL-kernels goed controleert, maar het bespaart enige overhead voor het stuurprogramma. Het gevolg is dat eventuele storingen waarschijnlijk zullen leiden tot verminkte output zonder dat darktable het merkt. Dit is alleen aan te raden als je zeker weet dat je systeem ijzersterk draait. Je kunt deze parameter ook instellen op -1, wat betekent dat darktable geen beperking aanneemt in het aantal event-handles. Dit wordt niet aanbevolen.

Deze parameter, indien ingesteld op “true”, zal darktable dwingen om na elke module beeldbuffers van jouw GPU op te halen en op te slaan in de pixelpijp-cache. Dit is een arbeidsintensieve bewerking, maar kan zinvol zijn, afhankelijk van jouw GPU (ook als de GPU nogal traag is). In dit geval kan darktable in feite wat tijd besparen wanneer moduleparameters zijn gewijzigd, omdat het terug kan gaan naar een tussenliggende status in de cache en slechts een deel van de pixelpijp opnieuw kan verwerken. In veel gevallen moet deze parameter worden ingesteld op “actieve module” (de standaardinstelling), die alleen de invoer van de momenteel gefocuste module in de cache zal opslaan.

opencl_micro_nap
In het ideale geval houd je jouw GPU op 100% bezig bij het opnieuw verwerken van de pixelpijp. Dat is goed. Aan de andere kant kan jouw GPU ook nodig zijn om regelmatige GUI-updates uit te voeren. Het kan voorkomen dat er niet voldoende tijd over is voor deze taak. Het gevolg zou een schokkerige reactie van jouw GUI zijn bij pannen, zoomen of bij het verplaatsen van schuifregelaars. Om dit probleem op te lossen, kan darktable kleine dutjes toevoegen aan de pixelpijp-verwerking om de GPU op adem te laten komen en GUI-gerelateerde activiteiten uit te voeren. De parameter opencl_micro_nap bepaalt de duur van deze dutjes in microseconden. Je zal moeten experimenteren om een optimale waarde voor jouw systeem te vinden. Waarden van 0, 100, 500 en 1000 zijn goede uitgangspunten om te proberen. De standaardwaarde is 1000.
opencl_use_pinned_memory
Tijdens het tiling moeten enorme hoeveelheden geheugen worden overgedragen tussen host en apparaat. Op sommige apparaten (namelijk AMD) kunnen directe geheugenoverdrachten van en naar een willekeurige hostgeheugenregio een enorme prestatievermindering opleveren. Dit is vooral merkbaar bij het exporteren van grote afbeeldingen. Door deze configuratieparameter op TRUE in te stellen, moet darktable een speciaal soort tussenbuffer gebruiken voor gegevensoverdracht tussen host en apparaat. Op sommige apparaten kan dit het exporteren van grote bestanden met een factor 2 tot 3 versnellen. NVIDIA-apparaten en -stuurprogramma’s lijken een efficiëntere geheugenoverdrachtstechniek te hebben, zelfs voor willekeurige geheugenregio’s. Omdat ze mogelijk geen prestatiewinst vertonen en zelfs onleesbare uitvoer produceren, moet opencl_use_pinned_memory op de standaard FALSE voor die apparaten worden gelaten.
opencl_building_gpuXXX
Voeg deze instelling handmatig toe aan darktablerc om extra OpenCL-compilatie-opties voor uw GPU(’s) toe te voegen, waarbij XXX de GPU-naam is. Deze opties worden gebruikt bij het compileren van OpenCL-kernels en kunnen worden geleverd voor het afstemmen van de prestaties of om bugs te omzeilen. Je moet alle bestaande kernels verwijderen om ze opnieuw te compileren met de nieuwe opties. Geef een lege tekenreeks op om zonder opties opnieuw te compileren. Verwijder de instelling volledig om opnieuw te compileren met standaardopties.

Je kan naar jouw GPU verwijzen met zijn ID (bijvoorbeeld opencl_building_gpu0) of met zijn canonieke naam (bijvoorbeeld opencl_building_gpugeforce10606gb). Start darktable met darktable -d opencl om jouw canonieke GPU-naam en standaard compilatie-opties te vinden.

De volgende regels zouden bijvoorbeeld extra compilatie-opties toevoegen voor de GPU met ID 0 en voor de GPU met de naam “geforce10606gb”:

opencl_building_gpu0=-cl-mad-enable -cl-no-signed-nullen -cl-unsafe-math-optimizations -cl-finite-math-only -cl-fast-relaxed-math
opencl_building_gpugeforce10606gb=-cl-mad-enable -cl-no-signed-nullen

translations