我有最新的 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++ 程序。在图书馆 build 之前,我在MagickCore\effect.c 中放入了BlurImage()
函数。一个创建文件并在其中提示一些字符串的小片段。
我得到了模糊的图像和一个文件,所以这个库似乎可以工作。现在我需要使用 OpenCL 构建它。
我执行了 ./configure --enable-opencl LIBS=-ldl
。当我从这次执行构建库时,convert -version
提示了 OpenCL 支持。
据我了解 ImageMagick 的来源,OpenCL 内核保存在 MagickCore\accelerate-private.h 中和编译运行时。 C 中调用加速函数的实际代码存储在 MagickCore\accelerate.c 中.我做了同样的 Action ,并将该文件创建片段放入 AccelerateBlurImage()
函数中。我得到了模糊的图像,但没有创建文件,因此即使声明了 OpenCL 功能,也从未调用过此函数。
我注意到的奇怪的事情是,效果函数的加速对应项实际上在其他任何地方都没有被调用。所以我无法真正了解如何使用支持 OpenCL 的函数。
我注意到的另一个奇怪的事情是 diff Makefile_without_OpenCL Makefile_with_OpenCL
的结果。 Makefile_without_OpenCL
是./configure
命令创建的Makefile
,Makefile_with_OpenCL
是Makefile
由 ./configure --enable-OpenCL LIBS=-ldl
创建。结果表明,后一个文件额外包含-pthread
标志和-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。因此,当调用加速方法 时,它们会在方法开始时快速返回。这些方法是从非加速方法 中调用的。当调用加速方法 时,会检查 OpenCL 设备是否可用。如果设备可用,该方法将使用 OpenCL 执行操作并返回 true
作为该方法的结果。如果返回 false
,非加速方法 的执行将继续并执行与代码未链接到 OpenCL 时相同的操作。
下次您使用 ImageMagick 时,将从磁盘加载此文件,并使用缓存的分数来选择最佳设备。如果您安装新的视频卡/cpu 或更新驱动程序,将进行新的性能测量。
使用 OpenCL 的选项之一是 -desspeckle
,因此您可以通过执行以下命令强制执行性能测量:convert logo: -desspeckle null:
关于c++ - 如何使用 OpenCL 构建 ImageMagick?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31582141/