darktable page lede image
darktable page lede image

Dispositivi OpenCL multipli - impostazioni manuali

10.2.9. Dispositivi OpenCL multipli - impostazioni manuali

La schedulazione dei dispositivi OpenCL sulla maggior parte dei sistemi può essere ottimizzata usando le impostazioni del «profilo schedulazioni OpenCL». Tuttavia, se il vostro sistema è dotato di diverse GPU, potrebbe essere utile selezionare manualmente le priorità di ogni singolo dispositivo. Per fare questo occorre selezionare innanzitutto il profilo «predefinito» e impostare le priorità con il parametro di configurazione «opencl_device_priority».

E' importante sapere come darktable utilizza le schede con OpenCL. Ogni sequenza di manipolazione di un immagine - ovvero la conversione di una coda di sviluppo nell'immagine finale - viene eseguita all'interno di un cosiddetto flusso di sviluppo. I flussi di sviluppo in darktable possono essere di quattro diverse tipologie. Uno è responsabile dell'elaborazione dell'immagine centrale che visualizzate in modalità camera oscura mentre un secondo si occupa dell'immagine di riferimento (finestra di navigazione) in alto a sinistra. Ognuno di questi due dovrà essere eseguito in parallelo con l'altro. In più potrebbero esserci flussi di sviluppo multipli che lavorano per l'esportazione di files e potrebbero essercene altri ancora per la generazione delle anteprime. Se darktable ne ha la possibilità allocherà dinamicamente ad un dispositivo OpenCL disponibile uno specifico flusso di sviluppo e lo libererà al termine.

L'utilizzo di risorse dipende soprattutto dalla tipologia del flusso di sviluppo. L'immagine di anteprima e le immagini dei rullini hanno una bassa risoluzione e possono pertanto essere processate molto velocemente; la vista dell'immagine centrale è molto più esigente, e ancora di più lo è quella che viene elaborata al momento dell'esportazione di un file.

Il parametro di configurazione «opencl_device_priority» presenta una stringa con la seguente struttura:

a,b,c.../k,l,m.../o,p,q.../x,y,z...

Ogni lettera rappresenta uno specifico dispositivo OpenCL. Ci sono quattro campi distinti nella stringa ognuno separato da una barra e ogni campo rappresenta un flusso di sviluppo. «a,b,c...» definisce i dispositivi che sono autorizzati ad elaborare l'immagine centrale. Similmente «k,l,m...» può processare l'anteprima, «o,p,q...» si occuperà dei flussi di sviluppo per l'esportazione dei files e «x,y,z...» calcolerà le anteprime. Un campo vuoto significa che quel particolare tipo di flusso di sviluppo non potrà appoggiarsi a nessun dispositivo OpenCL.

darktable ha un sistema interno di numerazione che assegna il valore «0» al primo dispositivo OpenCL disponibile, «1» al secondo e così via. Questo numero insieme al nome del dispositivo viene visualizzato lanciando darktable dal terminale in questo modo: «darktable -d opencl». E' possibile specificare un dispositivo sia attraverso il suo numero oppure per nome (maiuscole, minuscole e spazi non importa). Se avete più id un dispositivo - tutti con lo stesso nome - dovrete differenziali utilizzando il loro numero.

L'identificatore di un dispositivo può essere preceduto da un punto esclamativo «!», in questo caso quel particolare dispositivo viene escluso dal poter processare un flusso di sviluppo. Potete anche usare un asterisco «*» quale simbolo jolly per rappresentare tutti i dispositivi non esplicitamente richiamati nel gruppo.

La sequenza all'interno del gruppo viene tenuta in considerazione. darktable leggerà la stringa da sinistra a destra e tenterà di allocare un dispositivo OpenCL ad un flusso di sviluppo cercandolo in questo preciso ordine e prendendo il primo libero.

Se è necessario avviare l'elaborazione di un flusso di sviluppo ma tutte le GPU sono impegnate, darktable automaticamente processerà l'immagine utilizzando la CPU. E' possibile forzare l'utilizzo della GPU anteponendo alla lista delle GPUs disponibili un segno più «+». darktable non utilizzerà la CPU ma terrà il processo in sospeso in attesa che il successivo dispositivo OpenCL diventi disponibile.

L'impostazione predefinita che darktable utilizza per il parametro «opencl_device_priority» è:

*/!0,*/*/*

Qualsiasi dispositivo OpenCL individuato è abilitato a processare l'immagine centrale. Il primo dispositivo OpenCL (0) non è però autorizzato ad elaborare il flusso di sviluppo per l'anteprima. Da ciò si deduce che se il vostro sistema ha una sola GPU allora i flussi di sviluppo per le immagini di anteprima verranno elaborate dalla CPU conservando, in questo modo, la potenza della GPU solo per l'immagine centrale che richiede maggiori risorse. Questo comportamento è un'impostazione ragionevole per la maggior parte dei sistemi. Nessuna restrizione viene applicata ai flussi di sviluppo per l'esportazione e per la generazione delle anteprime.

Il comportamento predefinito è una buona scelta se avete solo un dispositivo. Se, invece, avete dispositivi multipli allora questo è un buon punto di partenza. Tuttavia, dato che i vostri dispositivi possono avere dei diversi livelli di potenza di calcolo, vale la pena di fare qualche prova e di ottimizzare la vostra lista prioritaria.

Facciamo un esempio: abbiamo un sistema con due schede, una veloce Radeon HD7950 e una vecchia e lenta GeForce GTS450. darktable (avviato con «darktable -d opencl») riporterà i seguenti dispositivi:

[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.

Quindi la GeFoce GTS450 viene identificata come primo dispositivo e la Radeon HD7950 ('Thaiti') come secondo. Questo ordine non viene modificato a meno che la configurazione hardware o dei drivers venga modificata a sua volta ma è consigliabile usare i nomi dei dispositivi anziché i loro numeri identificativi per tenerci al riparo da eventuali problemi.

Dal momento che la GTS450 è più lenta della HD7950 un parametro ottimizzato per opencl_device_priority potrebbe essere il seguente:

!GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*

La GTS 450 viene esplicitamente esclusa dal flusso di sviluppo che si occupa dell'immagine centrale che viene invece riservata a «tutti» gli altri dispositivi (ovvero alla HD7950/Thaiti). L'esatto opposto per il flusso di lavoro delle anteprime: la Thaiti è esclusa cosicché sia solo la GTS450 a svolgere questo compito.

Per l'esportazione dei files e la generazione delle anteprime le vogliamo invece entrambe all'opera. Tuttavia darktable dovrebbe valutare prima se la Thaiti è libera perché è più veloce. Se non la trova allora tutte le altre - nel nostro caso solo la GTS450 - verranno valutate.