⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://imagemagick.org/openmp/).

Exécution parallèle (OpenMP)

De nombreux algorithmes internes d'ImageMagick sont multithreadés afin de tirer parti des accélérations offertes par les processeurs multicœurs et par OpenMP. OpenMP est une spécification d'API pour la programmation parallèle. Si votre compilateur prend en charge les directives OpenMP (par exemple gcc, Visual Studio 2005), ImageMagick inclut automatiquement cette prise en charge. Pour le vérifier, recherchez la fonctionnalité OpenMP d'ImageMagick avec cette commande :

$ magick identify -version
Version: ImageMagick 7.0.10-50 2021-01-04 Q16 https://imagemagick.org
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)

Lorsque OpenMP est activé, la plupart des algorithmes d'ImageMagick s'exécutent en parallèle sur tous les cœurs de votre système. ImageMagick divise généralement le travail de sorte que chaque thread traite 64 lignes de pixels. À mesure que les lignes sont terminées, OpenMP attribue à chaque thread d'autres blocs de lignes de pixels jusqu'à ce que l'algorithme soit achevé. Par exemple, si vous disposez d'un système quadricœur et que vous tentez de redimensionner une image, le redimensionnement s'effectue sur 4 cœurs (8 si l'hyperthreading est activé).

Vous pouvez encore améliorer les performances en réduisant la contention de verrous grâce à la bibliothèque d'allocation mémoire tcmalloc. Pour l'activer, ajoutez --with-tcmalloc à la ligne de commande de configure lorsque vous compilez ImageMagick.

Les pièges de l'exécution parallèle

Il peut être difficile de prédire le comportement dans un environnement parallèle. Les performances peuvent dépendre de nombreux facteurs, notamment le compilateur, la version de la bibliothèque OpenMP, le type de processeur, le nombre de cœurs, la quantité de mémoire, l'activation ou non de l'hyperthreading, l'ensemble des applications qui s'exécutent simultanément avec ImageMagick, ou encore l'algorithme de traitement d'image que vous utilisez. La seule manière d'être certain d'obtenir des performances optimales, en termes de nombre de threads, est de réaliser un test de performance (benchmark). ImageMagick intègre un threading progressif lors du benchmark d'une commande et renvoie le temps écoulé et l'efficacité pour un ou plusieurs threads. Cela peut vous aider à identifier le nombre de threads le plus efficace dans votre environnement. Voici un exemple de benchmark pour 1 à 8 threads :

$ magick -bench 40 model.png -sharpen 0x1 null:
Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070

De meilleures performances correspondent à des valeurs plus élevées d'IPS (itérations par seconde). Dans notre exemple, 8 cœurs sont optimaux. Cependant, dans certains cas, il peut être préférable de fixer le nombre de threads à 1 (par exemple -limit thread 1) ou de désactiver complètement OpenMP. Pour désactiver cette fonctionnalité, ajoutez --disable-openmp à la ligne de commande de votre script configure, puis recompilez et réinstallez ImageMagick.