Estou tentando usar o ImageMagick com o OpenCL para acelerar o redimensionamento de imagens em lote.
Para isso, iniciei uma instância da GPU (g2.2xlarge) na Amazon EC2 que, de acordo com a AWS, apresenta:
High-performance NVIDIA GPUs, each with 1,536 CUDA cores and 4GB of video memory
Eu usei uma AMI específica para instâncias de GPU , ou seja, Amazon Linux AMI com GPU NVIDIA GRID Driver fornecido pela NVIDIA.
Com o OpenMP
Antes de compilar o ImageMagick a partir do código-fonte, como base para comparação, eu tentei o ImageMagick integrado, que suporta apenas o 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
Redimensionamos uma imagem 50 Mpx JPEG para 25% do tamanho e cronometrou:
$ time convert -resize 1158x1737 01.jpg 01b.jpg
real 0m1.371s
user 0m5.388s
sys 0m0.204s
Eu o executei várias vezes para garantir que o tempo seja consistente (em especial porque o ImageMagick realiza uma referência do desempenho dos dispositivos no primeiro uso).
com OpenCL
Eu então fiz o download das fontes do ImageMagick e as compilei:
$ export C_INCLUDE_PATH=/opt/nvidia/cuda/include
$ ./configure --enable-opencl
$ make
Fui para os binários compilados e verifiquei se o OpenCL estava agora ativado:
$ ./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
Em seguida, executou o teste de referência:
$ time ./convert -resize 1158x1737 01.jpg 01b.jpg
real 0m2.655s
user 0m1.720s
sys 0m0.928s
Mais uma vez, corri várias vezes para garantir que o tempo fosse consistente.
Para minha surpresa, isso é metade da velocidade da versão com o OpenMP.
Tentando entender isso
Como sugerido em esta resposta do StackOverflow , verifiquei o arquivo de benchmark do dispositivo 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>
Nota: este arquivo é criado apenas quando eu executo a versão compilada do ImageMagick; por alguma razão, ele não é criado quando eu executo a versão que acompanha o Amazon Linux.
Por isso, há dois dispositivos que o ImageMagick pode usar:
- A GPU, reconhecida como uma NVIDIA GRID K520 , com um pontuação de 0,278
- Um dispositivo desconhecido (a CPU?), com uma pontuação de 1.414
Então, até onde eu entendi, a CPU supera a GPU aqui .
Ok, a CPU não é ruim (E5-2670 @ 2.60GHz), mas a GPU é uma grande fera em seu domínio.
Minhas perguntas
- Como a versão compilada do ImageMagick pode ser metade da velocidade da versão que acompanha o Amazon Linux?
- Como a CPU pode superar o GPU no benchmark ImageMagick?
Qualquer dica seria bem-vinda para recuperar o desempenho esperado da GPU.