如何使用 OpenCL 构建 ImageMagick?

How do I build ImageMagick with OpenCL?

我有最新的 Ubuntu LTS 和英特尔 OpenCL 驱动程序。我需要构建 ImageMagick 库,以便它启用 OpenCL,但我不知道该怎么做。我想从源代码构建它,这样我就可以自己修改它。

我从 the official mirror at GitHub 获得了 ImageMagick 7.0。图书馆的网站上说明了对 OpenCL 的支持,但不幸的是文档非常分散和复杂。

我用 ./configure(无参数)和 make make install 构建了库。 convert -version 所提示的肯定没有提供对 OpenCL 的支持。为了进行实验,我编写了一个调用 image.blur(6, 1.5) 的 C++ 程序。在图书馆建设之前,我在 MagickCore\effect.c 中的 BlurImage() 函数中放入了一个小片段,它创建了一个文件并在其中提示了一些字符串。

我得到了模糊的图像和一个文件,所以这个库似乎可以工作。现在我需要用 OpenCL 构建它。

我执行了./configure --enable-opencl LIBS=-ldl。当我从这次执行构建库时,convert -version 提示了 OpenCL 支持。

据我了解 ImageMagick 的源代码,OpenCL 内核保存在 MagickCore\accelerate-private.h and compiled runtime. Actual code in C that calls accelerated functions is stored in MagickCore\accelerate.c 中。我做了同样的动作,并将该文件创建片段放入 AccelerateBlurImage() 函数中。我得到了模糊的图像,但没有创建文件,因此即使声明了 OpenCL 功能,也从未调用过此函数。

我注意到的奇怪的事情是 none 的 none 效果函数的加速对应物实际上在其他地方被调用。所以我无法真正了解如何使用支持 OpenCL 的函数。

我注意到的另一个奇怪的事情是 diff Makefile_without_OpenCL Makefile_with_OpenCL 的结果。 Makefile_without_OpenCL是由./configure命令创建的MakefileMakefile_with_OpenCL是由./configure --enable-OpenCL LIBS=-ldl创建的Makefile。结果显示,后一个文件额外包含-pthread flag和-ldl lib,但没有使用任何与OpenCL实际相关的内容。

即使未调用 AccelerateBlurImage() 函数,我是否弄错了并且 OpenCL 已在使用中?如果情况并非如此,那么使用 OpenCL 构建 ImageMagick 的正确流程是什么?

当您在 ImageMagick 中启用 OpenCL 时,这并不意味着它将被使用。第一次使用 加速方法 时,将对您的系统进行性能测试。其结果将写入 $HOME/.config/ImageMagick/%LOCALAPPDATA%\.config\ImageMagick\ 中的文件 ImagemagickOpenCLDeviceProfile。该文件包含多个 device 个节点:

<device>
  <type>
    <name>Your card/CPU</name>
    <driver>1.0</driver>
    <score>3.9468</score>
  </type>
</device>

得分最高(最低)的设备获胜,将被使用。如果您的 CPU 被选为最佳设备,则不会使用 OpenCL。因此,当调用 加速方法 时,它们会在方法开始时快速 return 。这些方法是从 非加速方法 中调用的。当调用 加速方法 时,会检查 OpenCL 设备是否可用。如果设备可用,该方法将使用 OpenCL 执行操作,并将 return true 作为该方法的结果。如果 false 被 returned 非加速方法 的执行将继续并执行与代码未与 OpenCL 链接时相同的操作。

下次您使用 ImageMagick 时,将从磁盘加载此文件,并使用缓存的分数来选择最佳设备。如果您安装新的视频卡/cpu 或更新驱动程序,将会进行新的性能测量。

使用 OpenCL 的选项之一是 -despeckle,因此您可以通过执行以下命令强制执行性能测量:convert logo: -despeckle null: