4 votes

Pourquoi ImageMagick avec OpenCL est-il plus lent qu'avec OpenMP ?

J'ai essayé d'utiliser ImageMagick avec OpenCL pour accélérer le redimensionnement des images par lots.

Pour cela, j'ai lancé un instance de GPU (g2.2xlarge) sur Amazon EC2, qui, selon AWS, présente les caractéristiques suivantes :

GPU NVIDIA de haute performance, chacun avec 1 536 cœurs CUDA et 4 Go de mémoire vidéo.

J'ai utilisé une méthode spécifique AMI pour les instances GPU à savoir AMI Amazon Linux avec le pilote GPU NVIDIA GRID fourni par NVIDIA.


Avec OpenMP

Avant de compiler ImageMagick à partir des sources, comme base de comparaison, j'ai essayé ImageMagick intégré, qui ne supporte qu'OpenMP :

$ convert --version
Version: ImageMagick 6.7.8-9 2015-10-08 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

J'ai redimensionné un Image JPEG 50 Mpx à 25% de sa taille, et le chronométrer :

$ time convert -resize 1158x1737 01.jpg 01b.jpg

real    0m1.371s
user    0m5.388s
sys     0m0.204s

Je l'ai exécuté plusieurs fois pour m'assurer que le timing est cohérent (en particulier parce qu'ImageMagick effectue un benchmark des performances du dispositif lors de la première utilisation).


Avec OpenCL

J'ai ensuite téléchargé le Sources d'ImageMagick et les a compilés :

$ export C_INCLUDE_PATH=/opt/nvidia/cuda/include
$ ./configure --enable-opencl
$ make

Je me suis dirigé vers les binaires compilés, et j'ai vérifié qu'OpenCL était maintenant activé :

$ ./convert --version
Version: ImageMagick 6.9.2-5 Q16 x86_64 2015-11-08 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC OpenCL OpenMP

Puis j'ai lancé le benchmark :

$ time ./convert -resize 1158x1737 01.jpg 01b.jpg

real    0m2.655s
user    0m1.720s
sys     0m0.928s

Encore une fois, je l'ai fait tourner plusieurs fois pour m'assurer que le timing était cohérent.

À ma grande surprise, la vitesse est moitié moindre que celle de la version avec OpenMP uniquement.


Essayer de donner un sens à tout cela

Comme suggéré dans cette réponse de StackOverflow J'ai vérifié le fichier de référence du périphérique ImageMagick :

$ cat ~/.cache/ImageMagick/ImagemagickOpenCLDeviceProfile
<version>ImageMagick Device Selection v0.9</version>
<device><type></type><name>GRID K520</name><driver>340.32</driver><max cu>8</max cu><max clock>797</max clock><score>0.2780</score></device>
<device><type></type><score>1.4140</score></device>

Remarque : ce fichier n'est créé que lorsque j'exécute la version compilée d'ImageMagick ; pour une raison quelconque, il n'est pas créé lorsque j'exécute la version fournie avec Amazon Linux.

D'après ce que je lis, il y a deux dispositifs que ImageMagick peut utiliser :

  • Le GPU, reconnu comme un NVIDIA GRID K520 , avec un score de 0,278
  • Un dispositif inconnu (l'unité centrale ?), avec un score de 1,414

Donc, d'après ce que je comprends, le CPU surpasse le GPU ici .

D'accord, le CPU n'est pas mauvais (E5-2670 @ 2.60GHz), mais le GPU est une véritable bête dans son domaine.


Mes questions

  • Comment la version compilée d'ImageMagick peut-elle être moitié moins rapide que la version livrée avec Amazon Linux ?
  • Comment le CPU peut-il surpasser le GPU dans le benchmark ImageMagick ?

Tout indice serait le bienvenu pour retrouver les performances attendues du GPU.

5voto

mchid Points 111
  • Comment la version compilée d'ImageMagick peut-elle être moitié moins rapide que la version livrée avec Amazon Linux ?

Lorsqu'on utilise OpenCL, il ne s'agit pas d'une initialisation différente, mais d'une initialisation supplémentaire ; cela prendra toujours plus de temps. Nous avons bien sûr les noyaux précompilés, mais le chargement des bibliothèques, la création des files d'attente de commandes, le chargement des noyaux... tout cela prend du temps. C'est malheureux, mais le "mode OpenCL" n'est pas bien adapté à ce type d'utilisation unique en ligne de commande. Une application ou un serveur persistant qui peut initialiser la bibliothèque ImageMagick une fois et faire plusieurs appels à la bibliothèque s'en sortira très bien.

  • Comment le CPU peut-il surpasser le GPU dans le benchmark ImageMagick ?

Vous lisez mal les informations. Un score plus bas signifie que l'appareil est plus rapide. Le GPU est presque 6 fois plus rapide. Le terme score peut prêter à confusion dans cette situation, nous pourrions donc le renommer dans une prochaine version d'ImageMagick.

0 votes

Merci beaucoup pour cette réponse ! J'ai effectivement lu les informations de la mauvaise façon. Donc si je vous comprends bien, la ligne de commande convert ne sera jamais en mesure d'utiliser correctement OpenCL ? Je veux précisément utiliser ImageMagick dans le cadre d'un service de traitement d'images en temps réel côté serveur. Dois-je abandonner l'idée d'appeler la ligne de commande à partir du service web ?

1 votes

Vous avez raison, au lieu de la ligne de commande, vous voulez probablement utiliser l'une des API ( imagemagick.org/script/api.php )

0 votes

Merci, je viens de compiler le fichier Imagick contre mon OpenCL ImageMagick ci-dessus. J'ai essayé de réutiliser le même Imagick plusieurs fois, en appelant des boucles de readImage() , resizeImage() y writeImage() sur le même objet, mais je ne vois aucune amélioration de la vitesse. Est-ce que quelque chose m'échappe ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X