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.