Sur la plupart des systèmes typiques, la planification des périphériques OpenCL peut être optimisée en utilisant le réglage « profil de planification OpenCL ». Cependant, si votre système est équipé d'une variété de GPUs, vous pourriez souhaiter fixer manuellement la priorité relative des périphériques. Pour ce faire, vous devez sélectionner le profil de planification « défaut » et définir vos paramètres dans le paramètre de configuration « opencl_device_priority ».
Il est important de comprendre comment darktable utilise les périphériques OpenCL. Chaque séquence de traitement d’une image – pour convertir une entrée en une sortie finale en utilisant un certain historique – tourne dans ce qu'on appelle un pipeline graphique. Il y a quatre types de pipelines graphiques dans darktable. Un type est responsable du traitement de l’image de la vue centrale (ou vue complète) dans le mode chambre noire, un autre pipeline graphique traite l’image de prévisualisation (fenêtre de navigation) en haut et à gauche dans le mode chambre noire. Il peut y avoir une instance de chacun de ces deux pipelines graphiques qui tourne à un instant donné – avec le pipeline graphique de prévisualisation et celui de l’image complète tournant en parallèle. De plus, il peut y avoir plusieurs pipelines graphiques tournant en parallèle pour effectuer l’exportation et il peut y avoir plusieurs pipelines graphiques qui génèrent les miniatures. Si un dispositif OpenCL est disponible, darktable va l’allouer dynamiquement pour une session à un pipeline graphique spécifique et le libérer ensuite.
La demande en calcul dépend beaucoup du type de pipeline. Image de prévisualisation et miniature ont une basse résolution et peuvent être traitées rapidement ; l'image du panneau central est plus gourmande et le pipeline réalisant l'exportation l'est encore plus.
Le paramètre de configuration « opencl_device_priority » contient une chaîne de caractères ayant la structure suivante :
a,b,c.../k,l,m.../o,p,q.../x,y,z...
Chaque lettre représente un périphérique OpenCL spécifique. Il y a quatre champs dans la chaîne des paramètres séparés par une barre oblique, chacun représente un type de pipeline graphique. « a,b,c... » définit les périphériques qui seront autorisés à effectuer le traitement (complet) du pipeline graphique de l’image centrale. De la même manière, des périphériques comme « k,l,m... » peuvent traiter le pipeline graphique de prévisualisation, les périphériques « o,p,q... » le pipeline graphique d’exportation, et finalement les périphériques « x,y,z... » le pipeline graphique de traitement des miniatures. Un champ vide signifie qu'aucun périphérique OpenCL ne peut traiter ce type de pipeline graphique.
darktable possède un système de numérotation interne, où le premier périphérique OpenCL disponible recevra le numéro « 0 ». Les périphériques suivants seront numérotés consécutivement. Ce numéro, utilisé conjointement avec le nom du périphérique, est affiché lorsque vous démarrez darktable avec « darktable -d opencl ». Vous pouvez indiquer un dispositif soit par son numéro, soit par son nom (la casse et les espaces ne sont pas pris en compte). Si vous avez plus d’un dispositif – tous ayant le même nom – vous devrez utiliser les numéros de périphérique afin de les différencier.
Un indicateur de périphérique peut être précédé d’un point d’exclamation « ! », dans ce cas, le périphérique ne pourra pas exécuter ce pipeline graphique. Vous pouvez aussi utiliser un astérisque « * » comme joker, qui représentera tous les périphériques non encore mentionnés explicitement dans ce groupe.
L’ordre dans un groupe a une importance, darktable va lire la liste de la gauche vers la droite et lorsqu’il cherche à allouer un périphérique OpenCL à un pipeline graphique, il va balayer les périphériques dans cet ordre et prendra le premier périphérique libre qu'il trouvera.
Si un pipeline est sur le point d'être lancé et si tous les GPUs du groupe correspondant sont occupés, darktable, par défaut, traite l'image sur le CPU. Vous pouvez forcer le traitement sur GPU en préfixant la liste des GPUs autorisés par un signe plus « + ». darktable n'utilisera pas le CPU mais suspendra le traitement jusqu'à ce que le premier périphérique OpenCL soit disponible.
Le paramétrage par défaut de darktable pour « opencl_device_priority » est :
*/!0,*/*/*
Tout périphérique OpenCL détecté est autorisé à traiter notre image du panneau central. Le premier périphérique OpenCL (0) n'est pas autorisé à traiter le pipeline graphique de prévisualisation. En conséquence, s’il n'y a qu'un seul GPU sur votre système, le pipeline graphique de prévisualisation sera toujours traité par le CPU, réservant exclusivement votre unique GPU au panneau central contenant l’image qui demande davantage de ressources. Ceci est un paramétrage raisonnable pour la plupart des systèmes. Aucune restriction ne s’applique au pipeline de l’exportation et au pipeline des miniatures.
La valeur par défaut est un bon choix si vous n’avez qu'une carte. Si vous en avez plusieurs, cela reste un bon point de départ. Cependant, comme vos cartes peuvent avoir un niveau de puissance de calcul assez différent, cela vaut le coup de passer un peu de temps à optimiser votre liste de priorités.
Voici un exemple. Supposons que nous ayons un système avec deux périphériques, une Radeon HD7950 rapide et une GeForce GTS450 plus ancienne et plus lente. darktable (démarré avec « darktable -d opencl ») signalera les appareils suivants :
[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.
Donc la GeForce GTS 450 est détectée en tant que premier périphérique ; la Radeon HD7950 ('Tahiti') comme le second. Cet ordre ne devrait normalement pas changer à moins que la configuration matérielle ou le pilote ne soit modifié. Mais il est préférable d’utiliser les noms de périphérique plutôt que les numéros afin de ne pas prendre de risque.
Comme la GTS450 est plus lente que la HD7950, un opencl_device_priority optimisé devrait ressembler à :
!GeForce GTS450,*/!Tahiti,*/Tahiti,*/Tahiti,*
La GTS450 est explicitement exclue de l'exécution du pipeline graphique de traitement de l'image centrale, ceci est réservé à « tous » les autres périphériques (c'est à dire la HD7950/Tahiti). Tout le contraire pour notre pipeline graphique de prévisualisation. Ici la Tahiti est exclue, donc seule la GTS450 sera autorisée à effectuer le travail.
Nous souhaitons que l’exportation des fichiers et la génération des miniatures se fassent sans toucher à rien. Cependant, darktable va d’abord vérifier que le dispositif Tahiti est libre parce qu'il est le plus rapide. Si cela n'est pas le cas, il va vérifier tous les autres périphériques – en fait, uniquement la GTS450.