Multiples périphériques
Sur la plupart des systèmes, la planification des périphériques OpenCL peut être optimisée en utilisant le réglage du Profil de planification d’OpenCL. Cependant, si votre système est équipé de plus d’un GPU, 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 dispositifs OpenCL. Chaque séquence de traitement d’une image – pour convertir une entrée en sortie finale en utilisant un historique – est exécutée dans un pipeline graphique. Il existe cinq types différents de pipeline graphique dans darktable. Un pipeline graphique est responsable du traitement de la vue centrale de l’image (ou vue complète) en mode Chambre noire, un autre pipeline graphique traite l’image de prévisualisation (fenêtre Navigation, également nécessaire pour les histogrammes et d’autres éléments internes pertinents pour une sortie correcte de la vue complète). Un autre pipeline graphique de prévisualisation serait nécessaire pour afficher une deuxième fenêtre de Chambre noire. Il peut y avoir un pipeline graphique de chacun de ces trois en cours d’exécution à tout moment, les pipeline graphique de l’image complète et de l’image de prévisualisation fonctionnant en parallèle. En outre, il peut y avoir plusieurs pipelines graphiques parallèles effectuant des exportations de fichiers ainsi que plusieurs pipelines graphiques parallèles générant des miniatures. Si un périphérique OpenCL est disponible, darktable l’alloue dynamiquement à un pipeline graphique spécifique pour une exécution et le libère ensuite.
La demande en calcul dépend beaucoup du type de pipeline graphique. L’image de prévisualisation et les miniatures ont une basse résolution et peuvent être traitées rapidement. Par contre l’image du panneau central ou sur l’écran secondaire est plus gourmande. Le pipeline graphique réalisant l’exportation complète l’est encore plus.
Le paramètre de configuration opencl\device_priority contient une chaîne avec la structure suivante :
a,b,c.../d,e,f.../g,h,i.../j,k,l.../m,n,o...
Chaque lettre représente un dispositif OpenCL spécifique. Il y a cinq champs dans la chaîne de paramètres, séparés par une barre oblique, chacun représentant un type de pipeline graphique. a,b,c...
définit les périphériques autorisés à traiter le pipeline graphique de l’image centrale (complète). De même, les périphériques d,e,f...
peuvent traiter le pipeline graphique de prévisualisation, les périphériques g,h,i...
les pipelines graphiques d’exportation, les périphériques j,k,l...
les pipelines graphiques de vignettes et enfin les périphériques m,n,o...
le pipeline graphique de prévisualisation pour la seconde fenêtre. Un champ vide signifie qu’aucun dispositif OpenCL ne peut servir 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 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 automatiquement 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,*/*/*/ !0,*
.
Tout périphérique OpenCL détecté est autorisé à traiter l’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 de ce type 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 Nvidia Quadro RTX 4000 rapide et une GeForce GTX 1050 plus lente. darktable (lancé avec darktable -d opencl
) rapportera les périphériques suivants :
[opencl_init] successfully initialized.
[opencl_init] here are the internal numbers and names of
OpenCL devices available to darktable :
[opencl_init] 0 'NVIDIA GeForce GTX 1050'
[opencl_init] 1 'NVIDIA CUDA Quadro RTX 4000'
[opencl_init] FINALLY : opencl is AVAILABLE on this system.
avec les noms canoniques indiqués ci-dessus nvidiagforcegtx1050 et nvidiacudaquadrortx4000
Ici, la GeForce GTX 1050 est détectée comme premier périphérique et la Quadro RTX 4000 comme second. Cet ordre ne changera normalement pas à moins que la configuration du matériel ou du pilote ne soit modifiée, mais il est préférable d’utiliser des noms de périphériques plutôt que des nombres pour plus de sécurité.
La GTX 1050 étant plus lente que la RTX 4000, un opencl_device_priority optimisé pourrait ressembler à ceci :
!nvidiagforcegtx1050,*/ !nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/nvidiacudaquadrortx4000,*/ !nvidiacudaquadrortx4000
.
La GTX 1050 est clairement exclue du traitement du pipeline graphique de l’image centrale, qui est réservé à tous les autres appareils (c’est-à-dire la RTX 4000). Inversement, pour les pipelines graphiques de prévisualisation, la RTX 4000 est exclue, de sorte que seule la GTX 1050 est autorisée à faire le travail.
Pour l’exportation de fichiers et la génération de vignettes, nous voulons que tout le monde soit sur le pont. Cependant, darktable devrait d’abord vérifier si le périphérique RTX 4000 est libre, parce qu’il est plus rapide. S’il n’est pas libre, alors tous les autres périphériques – en fait seulement le GTX 1050 – sont vérifiés.