我一直在尝试使用OpenM ImageMagick加速批量调整图像大小。
为此,我在Amazon EC2上启动了一个GPU实例 (g2.2xlarge),根据AWS,它具有以下特性:
高性能NVIDIA GPU,每个GPU都有1536个CUDA内核和4GB显存
我已经为GPU实例使用了特定的AMI ,即由NVIDIA提供的NVIDIA GRID GPU驱动程序的Amazon Linux AMI 。
在从源代码编译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在首次使用时执行了设备性能的基准testing)。
然后我下载了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答案build议,我检查了ImageMagick设备的基准testing文件:
$ 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的编译版本时创build; 出于某种原因,当我运行Amazon Linux附带的版本时,它不会被创build。
所以当我读它时,ImageMagick可以使用两个设备:
所以就我所知, CPU在这里胜过GPU 。
好吧,CPU不错(E5-2670 @ 2.60GHz),但是GPU在它的领域是相当的野兽。
任何暗示都将受到欢迎,重新获得预期的GPU性能。
当使用OpenCL时,它不是不同的初始化,它是额外的初始化; 它总是需要更长的时间。 当然,我们已经预编译了内核,只是加载了这些库,使得命令队列,加载内核……这一切都需要时间。 这是不幸的,但是“OpenCL模式”并不适合这种types的一次性命令行使用。 一个可以初始化ImageMagick库并在库中进行多次调用的应用程序或持久服务器将会非常好。
您正在阅读错误的信息。 分数越低意味着设备速度越快。 GPU速度将近6倍。 术语评分在这种情况下可能会令人困惑,所以我们可能想在未来版本的ImageMagick中重新命名。