OpenCL
ImageMagick dispose d'une prise en charge intégrée de certaines opérations accélérées par OpenCL. Toutefois, son fonctionnement est soumis à certaines conditions. Ces prérequis sont listés ci-dessous.
- OS et pilotes :
- macOS : prise en charge intégrée d'OpenCL. Aucune autre action requise.
- Linux/Windows : sur les plateformes prises en charge, installez les pilotes requis pour activer OpenCL.
- Mobile : la prise en charge d'OpenCL par ImageMagick n'est pas disponible sur les OS mobiles (iOS/Android).
- Indicateur à la compilation : OpenCL doit être activé explicitement lors de la compilation d'ImageMagick. Cela se fait en exécutant configure avec l'indicateur --enable-opencl positionné.
- Vérifier la prise en charge à l'exécution : pour vérifier si la prise en charge d'OpenCL est activée, exécutez magick --version. La sortie de la commande devrait afficher Features: ... OpenCL ...
- Indicateur d'exécution : OpenCL est désactivé par défaut à l'exécution. Pour l'activer, utilisez la variable d'environnement MAGICK_OCL_DEVICE=true, par exemple MAGICK_OCL_DEVICE=true magick
. Et pour n'activer qu'un périphérique spécifique, utilisez MAGICK_OCL_DEVICE=GPU ou MAGICK_OCL_DEVICE=CPU. - Utilitaire en ligne de commande : pour une prise en charge correcte d'OpenCL, il est recommandé d'utiliser l'utilitaire magick plutôt que convert, mogrify et autres.
- Type d'image : l'accélération OpenCL ne fonctionne que sur les images sans palette de couleurs. Utilisez plutôt des images en couleurs vraies.
- Opérateurs : voici une liste des opérateurs d'image qui ont été accélérés par OpenCL.
blur contrast charcoal function grayscale motion-blur resize
Les opérateurs suivants sont également accélérés par OpenCL, mais ils nécessitent que le canal alpha soit activé, par exemple magick sample.jpg -alpha on -despeckle null:.
despeckle
equalize
modulate
Notes sur le fonctionnement d'OpenCL
Lorsque certains des opérateurs accélérés par OpenCL sont invoqués pour la première fois et que toutes les conditions ci-dessus sont réunies, ImageMagick effectue une série de tests pour configurer l'environnement OpenCL en fonction du matériel du système ; il est donc normal de constater une latence plus élevée la première fois que vous utilisez une option accélérée. Les noyaux OpenCL sont intégrés dans ImageMagick sous forme de code source. Lors de la configuration initiale, ImageMagick détecte tous les périphériques OpenCL disponibles et compile les noyaux pour chacune de ces cibles. ImageMagick exécute également plusieurs tests de performance en interne afin de déterminer le périphérique à utiliser de préférence. Le code des noyaux compilés et les résultats des tests de performance sont stockés dans le répertoire de cache afin que les données puissent être réutilisées lors des invocations ultérieures du chemin OpenCL. Par défaut, les données mises en cache par OpenCL sont stockées dans $HOME/.cache/ImageMagick sous Linux et macOS, ou dans %LOCALAPPDATA%\ImageMagick sous Windows. Pour exécuter ces tests pour la première fois, utilisez la commande ci-dessous :
MAGICK_OCL_DEVICE=true magick sample.jpg -blur 0x5 null:
Sous Windows, la partie MAGICK_OCL_DEVICE=true doit être supprimée et la commande set MAGICK_OCL_DEVICE=true doit être exécutée avant la commande ci-dessus afin d'activer les opérations OpenCL.
Pour changer le répertoire de cache, définissez la variable d'environnement MAGICK_OPENCL_CACHE_DIR. ImageMagick est capable de détecter les changements de matériel, les mises à jour de pilotes et les nouvelles sources de noyaux, puis de relancer la configuration et le test de calibrage. Vous pouvez aussi forcer ImageMagick à relancer le processus en supprimant le contenu du répertoire de cache.
Outre les variables d'environnement mentionnées ci-dessus, ImageMagick fournit un ensemble d'API qui permettent aux développeurs d'obtenir un contrôle plus fin de l'accélération OpenCL. Par exemple, utilisez la fonction InitializeOpenCL() pour initialiser l'environnement OpenCL :
clEnv=GetCurrentOpenCLEnv();
if (InitializeOpenCL(clEnv,exception) == MagickFalse)
{
/* looks like OpenCL is not supported */
}