Назад | Перейти на главную страницу

Почему ImageMagick с OpenCL медленнее, чем OpenMP?

Я пытался использовать ImageMagick с OpenCL, чтобы ускорить изменение размера изображений в пакетном режиме.

Для этого я начал Экземпляр GPU (g2.2xlarge) на Amazon EC2, который, согласно AWS, включает:

Высокопроизводительные графические процессоры NVIDIA, каждый с 1536 ядрами CUDA и 4 ГБ видеопамяти

Я использовал конкретный AMI для экземпляров GPU, а именно AMI Amazon Linux с драйвером графического процессора NVIDIA GRID предоставлено NVIDIA.


С OpenMP

Перед компиляцией 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 выполняет тест производительности устройств при первом использовании).


С OpenCL

Затем я загрузил Источники 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 - настоящий зверь в своей области.


Мои вопросы

Любой намек будет приветствоваться для восстановления ожидаемой производительности графического процессора.

  • Как скомпилированная версия ImageMagick может быть вдвое медленнее, чем версия, поставляемая с Amazon Linux?

При использовании OpenCL это не другая инициализация, это дополнительная инициализация; это всегда займет больше времени. У нас, конечно, есть предварительно скомпилированные ядра, но просто загрузка библиотек, создание командных очередей, загрузка ядер ... все это требует времени. К сожалению, «режим OpenCL» не очень подходит для такого типа однократного использования командной строки. Приложение или постоянный сервер, который может инициализировать библиотеку ImageMagick один раз и выполнять несколько вызовов библиотеки, будет очень хорошо работать.

  • Как CPU может превзойти GPU в тесте ImageMagick?

Вы неправильно читаете информацию. Более низкий балл означает, что устройство работает быстрее. Графический процессор почти в 6 раз быстрее. Термин «оценка» может сбивать с толку в этой ситуации, поэтому мы, возможно, захотим переименовать его в будущих версиях ImageMagick.