c++ - 如何使用 OpenCL 构建 ImageMagick?

标签 c++ ubuntu makefile imagemagick 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++ 程序。在图书馆 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命令创建的MakefileMakefile_with_OpenCLMakefile./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/

相关文章:

C++ 运算符 <<(char) 但输出但为 hexa/int

java - 如何在 Digital Ocean Nginx VPS 上运行 Java 代码?

regex - 如何在具有相似txt文件的前5位数字的不同行中查找前5位数字并在ubuntu上打印整行

c - C语言生成文件

c++ - 使用 linux g++ 编译器在 makefile 中创建静态库

c++ - 如何直接在Makefile中导出?

c++ - "class template has already been declared as a non-class template"

c++ - 如何删除文件夹中的所有文件,但不使用 NIX 标准库删除文件夹?

c++ - 初始化uint16_t的基本字符串

ruby-on-rails - rails : rbenv rehash not working (rbenv-shim exists)