使用 OpenMP

使用 OpenMP

我一直在尝试使用 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 的未来版本中重新命名它。

相关内容