我一直在尝试使用 ImageMagick 和 OpenCL 来加快批量调整图像大小的速度。
为此,我开始了GPU 实例(g2.2xlarge)在 Amazon EC2 上,根据 AWS 的说法,它的特点是:
高性能 NVIDIA GPU,每个具有 1,536 个 CUDA 核心和 4GB 视频内存
我用了一个特定的适用于 GPU 实例的 AMI,即带有 NVIDIA GRID GPU 驱动程序的 Amazon Linux AMI由 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 可以使用两种设备:
- GPU 被认为是NVIDIA GRID K520,得分为 0.278
- 未知设备(CPU?),得分为 1.414
据我了解,CPU 的表现优于 GPU。
好吧,CPU 还不错(E5-2670 @ 2.60GHz),但 GPU 在其领域中相当强大。
我的问题
- 编译后的 ImageMagick 版本的速度怎么会比 Amazon Linux 附带的版本快一半呢?
- 在 ImageMagick 基准测试中,CPU 的表现如何胜过 GPU?
任何有关恢复预期 GPU 性能的提示都将受到欢迎。
答案1
- 编译后的 ImageMagick 版本的速度怎么会比 Amazon Linux 附带的版本快一半呢?
使用 OpenCL 时,初始化并不是不同的,而是额外的初始化;它总是会花费更长的时间。当然,我们已经预编译了内核,但只是加载库、创建命令队列、加载内核……这一切都需要时间。不幸的是,“OpenCL 模式”并不适合这种一次性命令行使用。可以初始化 ImageMagick 库一次并多次调用该库的应用程序或持久服务器将做得很好。
- 在 ImageMagick 基准测试中,CPU 的表现如何胜过 GPU?
您读错了信息。分数越低意味着设备速度越快。GPU 速度几乎快 6 倍。在这种情况下,“分数”一词可能会造成混淆,因此我们可能希望在 ImageMagick 的未来版本中重新命名它。