Я пытался использовать ImageMagick с OpenCL, чтобы ускорить изменение размера изображений в пакетном режиме.
Для этого я начал Экземпляр GPU (g2.2xlarge) на Amazon EC2, который, согласно AWS, включает:
Высокопроизводительные графические процессоры NVIDIA, каждый с 1536 ядрами CUDA и 4 ГБ видеопамяти
Я использовал конкретный AMI для экземпляров GPU, а именно AMI Amazon Linux с драйвером графического процессора NVIDIA GRID предоставлено NVIDIA.
Перед компиляцией ImageMagick из исходников в качестве основы для сравнения я попробовал встроенный ImageMagick, который поддерживает только 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
Я изменил размер Изображение 50 Mpx JPEG до 25% от его размера, и рассчитал его:
$ time convert -resize 1158x1737 01.jpg 01b.jpg
real 0m1.371s
user 0m5.388s
sys 0m0.204s
Я запускал его несколько раз, чтобы убедиться, что синхронизация согласована (в частности, потому что ImageMagick выполняет тест производительности устройств при первом использовании).
Затем я загрузил Источники ImageMagick, и скомпилировал их:
$ export C_INCLUDE_PATH=/opt/nvidia/cuda/include
$ ./configure --enable-opencl
$ make
Я направился к скомпилированным двоичным файлам и проверил, включен ли OpenCL:
$ ./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
Затем запустили тест:
$ time ./convert -resize 1158x1737 01.jpg 01b.jpg
real 0m2.655s
user 0m1.720s
sys 0m0.928s
Опять же, я запускал его несколько раз, чтобы убедиться, что время было согласованным.
К моему удивлению, это вдвое меньше, чем у версии с OpenMP.
Как предложено в этот ответ StackOverflow, Я проверил тестовый файл устройства 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>
Примечание: этот файл создается только при запуске скомпилированной версии ImageMagick; по какой-то причине он не создается, когда я запускаю версию, поставляемую с Amazon Linux.
Итак, я читал, что ImageMagick может использовать два устройства:
Насколько я понимаю, здесь процессор превосходит графический процессор.
Хорошо, CPU неплохой (E5-2670 @ 2.60GHz), но GPU - настоящий зверь в своей области.
Любой намек будет приветствоваться для восстановления ожидаемой производительности графического процессора.
При использовании OpenCL это не другая инициализация, это дополнительная инициализация; это всегда займет больше времени. У нас, конечно, есть предварительно скомпилированные ядра, но просто загрузка библиотек, создание командных очередей, загрузка ядер ... все это требует времени. К сожалению, «режим OpenCL» не очень подходит для такого типа однократного использования командной строки. Приложение или постоянный сервер, который может инициализировать библиотеку ImageMagick один раз и выполнять несколько вызовов библиотеки, будет очень хорошо работать.
Вы неправильно читаете информацию. Более низкий балл означает, что устройство работает быстрее. Графический процессор почти в 6 раз быстрее. Термин «оценка» может сбивать с толку в этой ситуации, поэтому мы, возможно, захотим переименовать его в будущих версиях ImageMagick.