如何使用OpenCL构建ImageMagick?

kaz*_*rey 0 c++ ubuntu makefile imagemagick opencl

我有最新的Ubuntu LTS和Intel OpenCL驱动程序.我需要构建ImageMagick库,因此它将启用OpenCL但我无法弄清楚如何执行此操作.我想从源代码构建它,以便我自己可以修补它.

我从GitHub的官方镜像中获得了ImageMagick 7.0 .图书馆的网站上列出了对OpenCL的支持,但遗憾的是文档非常分散且错综复杂.

我用./configure(没有args)和make make install.当然,根据提示,不提供对OpenCL的支持convert -version.为了实验,我写了一个调用的C++程序image.blur(6, 1.5).在库的构建之前,我BlurImage()MagickCore\effect.c中添加了一个小片段,它创建了一个文件并向其中提示了一些字符串.

我得到了模糊的图像和发出的文件,所以图书馆似乎工作.现在我需要使用OpenCL构建它.

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

据我了解ImageMagick的源代码,OpenCL内核保存在MagickCore\accelerate-private.h和编译运行时.调用加速函数的C中的实际代码存储在MagickCore\accelerate.c中.我做了同样的动作,并将该文件创建片段放入AccelerateBlurImage()功能中.我得到了模糊的图像,但没有创建文件,因此即使声明了OpenCL功能,也从未调用此函数.

我注意到的奇怪的事情是效果函数的加速对应物中没有一个实际上被称为其他任何地方.所以我无法意识到如何使用OpenCL支持功能.

我注意到的另一个奇怪的事情就是结果diff Makefile_without_OpenCL Makefile_with_OpenCL.Makefile_without_OpenCLMakefile./configure命令创建的,Makefile_with_OpenCL是由Makefile创建的./configure --enable-OpenCL LIBS=-ldl.结果显示后一个文件还包括-pthreadflag和-ldllib,但没有使用与OpenCL实际相关的内容.

我是否出错并且OpenCL已经在使用中,即使AccelerateBlurImage()没有调用函数?如果不是这样,那么使用OpenCL构建ImageMagick的正确流程是什么?

dle*_*tra 5

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

<device>
  <type>
    <name>Your card/CPU</name>
    <driver>1.0</driver>
    <score>3.9468</score>
  </type>
</device>
Run Code Online (Sandbox Code Playgroud)

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

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

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