Por que o ImageMagick com OpenCL é mais lento que o OpenMP?

2

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.

    
por Benjamin 09.11.2015 / 01:40

1 resposta

3
  • Como a versão compilada do ImageMagick pode ser metade da velocidade da versão que acompanha o Amazon Linux?

Ao usar o OpenCL não é uma inicialização diferente, é uma inicialização adicional; sempre levará mais tempo. Nós temos os kernels pré-compilados, é claro, mas apenas obtendo as bibliotecas carregadas, fazendo as filas de comando, carregando os kernels ... tudo leva tempo. É lamentável, mas "modo OpenCL" não é adequado para esse tipo de uso de linha de comando de um tiro. Um aplicativo ou servidor persistente que pode inicializar a biblioteca do ImageMagick uma vez e fazer várias chamadas na biblioteca se sairá muito bem.

  • Como a CPU pode superar o GPU no benchmark ImageMagick?

Você está lendo as informações erradas. Uma pontuação mais baixa significa que o dispositivo é mais rápido. A GPU é quase 6x mais rápida. A pontuação do termo pode ser confusa nessa situação, portanto, podemos querer renomear isso em uma versão futura do ImageMagick.

    
por 10.11.2015 / 12:27