meerdere apparaten
De planning van OpenCL-apparaten kan op de meeste systemen worden geoptimaliseerd met behulp van de instellingen van het “OpenCL-planningsprofiel”. Als jouw systeem echter uitgerust is met meer dan één GPU, wil je misschien de relatieve apparaatprioriteit handmatig instellen. Om dit te doen, moet je het planningsprofiel “standaard” selecteren en de instellingen wijzigen in de configuratieparameter “opencl_device_priority”.
Het is belangrijk om te begrijpen hoe darktable OpenCL-apparaten gebruikt. Elke verwerkingsreeks van een afbeelding - om een invoer om te zetten in de uiteindelijke uitvoer met behulp van een geschiedenis - wordt uitgevoerd in een pixelpijp. Er zijn vijf verschillende soorten pixelpijpen in darktable. Eén type is verantwoordelijk voor het verwerken van de centrale afbeelding (of volledige weergave) in de ontwikkelenmodus, een ander pixelpijp verwerkt de voorbeeldafbeelding (navigatievenster, ook vereist voor histogrammen en meer interne zaken die relevant zijn voor correcte uitvoer van de volledige weergave). Voor het weergeven van een tweede donkere kamervenster zou een andere preview-pixelpipe nodig zijn). Er kan op elk moment een van deze drie pixelpijpen actief zijn, waarbij de volledige en preview-pixelpijpen parallel lopen. Daarnaast kunnen er meerdere parallelle pixelpijpen zijn die bestandsexports uitvoeren, evenals meerdere parallelle pixelpijpen die miniaturen genereren. Als een OpenCL-apparaat beschikbaar is, wijst darktable dit dynamisch toe aan één specifieke pixelpijp voor één run en geeft het deze daarna vrij.
De rekentechnische vraag varieert aanzienlijk, afhankelijk van het type pixelpijp dat wordt uitgevoerd. De voorbeeldafbeelding en miniaturen hebben een lage resolutie en kunnen snel worden verwerkt, terwijl het verwerken van de centrale afbeelding of de tweede scherm veeleisender is. Een volledige export pixelpijp is nog veeleisender.
De configuratieparameter “opencl_device_priority” bevat een string met de volgende structuur:
a,b,c.../d,e,f.../g,h,i.../j,k,l...,m,n,o...
Elke letter vertegenwoordigt één specifiek OpenCL-apparaat. Er zijn vijf velden in de parameterreeks, gescheiden door een schuine streep, die elk één type pixelpijp vertegenwoordigen. a,b,c...
definieert de apparaten die de (volledige) pixelpijp van het middelste beeld mogen verwerken. Op dezelfde manier kunnen apparaten d,e,f...
de voorbeeldpixelpijp verwerken, apparaten g,h,i...
de exportpixelpijp, apparaten j,k,l...
de miniatuurpixelpijp en tenslotte apparaten m,n,o...
preview pixelpijp voor het tweede venster. Een leeg veld betekent dat geen enkel OpenCL-apparaat dit type pixelpijp mag bedienen.
Darktable heeft een intern nummeringssysteem, waarbij het eerst beschikbare OpenCL-apparaat het nummer 0 krijgt. Alle verdere apparaten worden doorlopend genummerd. Dit nummer wordt samen met de apparaatnaam weergegeven als je darktable start met darktable -d opencl
. Je kan een apparaat specificeren op nummer of op zijn canonieke naam (hoofdletters/kleine letters en witruimte doen er niet toe). Als je meer dan één apparaat met dezelfde naam hebt, moet je de apparaatnummers gebruiken om ze te onderscheiden.
Een apparaatspecificatie kan worden voorafgegaan door een uitroepteken !
, in welk geval het apparaat wordt uitgesloten van het verwerken van een bepaalde pixelpijp. Je kan ook een asterisk *
als jokerteken gebruiken, die alle apparaten vertegenwoordigt die niet eerder expliciet in die groep zijn genoemd.
Volgorde binnen een groep is van belang – darktable leest de lijst van links naar rechts en telkens wanneer het probeert een OpenCL-apparaat toe te wijzen aan een pixelpijp, scant het de apparaten in die volgorde, waarbij het eerste vrije apparaat wordt genomen dat het vindt.
Als een pixelpijp-proces wordt gestart en alle GPU’s in de bijbehorende groep zijn bezet, verwerkt darktable standaard automatisch het beeld op de CPU. Je kan GPU-verwerking afdwingen door de lijst met toegestane GPU’s vooraf te laten gaan door een plusteken +
. In dit geval zal darktable de CPU niet gebruiken, maar de verwerking onderbreken totdat het volgende toegestane OpenCL-apparaat beschikbaar is.
Darktable’s standaard instelling voor “opencl_device_priority” is */!0,*/*/*/!0,*
.
Elk gedetecteerd OpenCL-apparaat mag de afbeelding in het centrale afbeeldingweergave verwerken. Het eerste OpenCL-apparaat (0) mag niet beide preview-pixelpipes verwerken. Als er dus maar één GPU beschikbaar is op jouw systeem, wordt de voorweergave-pixelpipes altijd op de CPU verwerkt, waardoor jouw enkele GPU exclusief blijft voor de veeleisendere centrale afbeeldingweergave. Dit is een redelijke instelling voor de meeste systemen. Dergelijke beperkingen zijn niet van toepassing op export- en miniatuurpixelpijpen.
De standaardinstelling is een goede keuze als je slechts één apparaat hebt. Als je meerdere apparaten hebt, vormt dit een redelijk uitgangspunt. Aangezien jouw apparaten echter nogal verschillende verwerkingskracht kunnen hebben, is het zinvol om wat tijd te investeren in het optimaliseren van jouw prioriteitenlijst.
Hier is een voorbeeld. Laten we aannemen dat we een systeem hebben met twee apparaten, een snelle Nvidia Quadro RTX 4000 en een langzamere GeForce GTX 1050. darktable (begonnen met darktable -d opencl
) zal de volgende apparaten rapporteren:
[opencl_init] succesvol geïnitialiseerd.
[opencl_init] hier zijn de interne nummers en namen van
OpenCL-apparaten beschikbaar voor darktable:
[opencl_init] 0 'NVIDIA GeForce GTX 1050'
[opencl_init] 1 'NVIDIA CUDA Quadro RTX 4000'
[opencl_init] EINDELIJK: opencl is BESCHIKBAAR op dit systeem.
met de canonieke namen hierboven weergegeven als nvidiagforcegtx1050
en nvidiacudaquadrortx4000
Hier wordt de GeForce GTX 1050 als eerste toestel gedetecteerd en de Quadro RTX 4000 als tweede. Deze volgorde zal normaal gesproken niet veranderen tenzij de hardware- of driverconfiguratie wordt gewijzigd, maar het is voor de zekerheid beter om apparaatnamen te gebruiken in plaats van nummers.
Omdat de GTX 1050 langzamer is dan de RTX 4000, kan een geoptimaliseerde “opencl_device_priority” er als volgt uitzien:
!nvidiagforcegtx1050,*/!nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/!nvidiacudaquadrortx4000
.
De GTX 1050 is expliciet uitgesloten van het verwerken van de centrale afbeelding pixelpijp; dit is voorbehouden aan “alle” andere apparaten (d.w.z. de RTX 4000). Omgekeerd – voor de voorweergave-pixelpijp – de RTX 4000, zodat alleen de GTX 1050 het werk mag doen.
Voor bestandsexport en het genereren van miniaturen willen we alle hens aan dek. Darktable moet echter eerst controleren of het RTX 4000-apparaat beschikbaar is, omdat het sneller is. Als het niet beschikbaar is, dan worden alle andere apparaten – eigenlijk alleen de GTX 1050 – aangevinkt.