GraphicsMagick 的 OpenCL 开发记录(二十)

这篇具有很好参考价值的文章主要介绍了GraphicsMagick 的 OpenCL 开发记录(二十)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<2022-04-11 Mon>

关于ImageMagick的*_utf8系列函数

ImageMagick中拷贝过来的open_utf8()fopen_utf8()stat_utf8()remove_utf8()函数直接用非_utf8的函数代替。ImageMagickwindows下使用的是宽字符,所以有那样的处理。且可能遇到linuxwindows的文件名合法性问题,utf8的处理是必不可少的,但目前不需要

关于lt_dlclose()函数

之前将lt_dlclose()函数改成了dlclose()函数,真是多此一举。因为在windowslt_dlclose()是一个宏,它最终调用FreeLibrary()

// ImageMagick/MagickCore/nt-base.h
#if !defined(lt_dlclose)
#  define lt_dlclose(handle)  NTCloseLibrary(handle)
#endif

// ImageMagick/MagickCore/nt-base.c
MagickPrivate int NTCloseLibrary(void *handle)
{
  return(!(FreeLibrary((HINSTANCE) handle)));
}

linux下使用lt_dlclose()需要添加-lltdl链接选项,发现在ImageMagick中只要使用了--enable-opencl后运行./configure就自动添加上了-lltdl,所以我想在GraphicsMagick中也要实现它。

<2022-04-12 Tue>

关于-lltdl链接选项(一)

我一直在尝试--enable-opencl时自动添加上-lltdl链接选项。我参考了ImageMagick中的configure.ac中的实现,修改后GraphicsMagickconfigure.ac的片断:

#
# Optionally check for libltdl if using it is still enabled
#
# Only use/depend on libtdl if we are building modules.  This is a
# change from previous releases (prior to 1.3.17) which supported
# loaded modules via libtdl if shared libraries were built.  of
# whether modules are built or not.
have_ltdl='no'
LIB_LTDL=''
if test "$build_modules" != 'no' || test "X$no_cl" != 'Xyes'
then
  AC_MSG_CHECKING([for libltdl ])
  AC_MSG_RESULT()
  failed=0
  passed=0
  AC_CHECK_HEADER([ltdl.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`])
  AC_CHECK_LIB([ltdl],[lt_dlinit],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],)
  AC_MSG_CHECKING([if libltdl package is complete])
  if test $passed -gt 0
  then
    if test $failed -gt 0
    then
      AC_MSG_RESULT([no -- some components failed test])
      have_ltdl='no (failed tests)'
    else
      LIB_LTDL='-lltdl'
      LIBS="$LIB_LTDL $LIBS"
      AC_DEFINE(HasLTDL,1,[Define if using libltdl to support dynamically loadable modules])
      AC_MSG_RESULT([yes])
      have_ltdl='yes'
    fi
  else
    AC_MSG_RESULT([no])
  fi
  if test "$have_ltdl" != 'yes'
  then
    AC_MSG_FAILURE([libltdl is required by modules and OpenCL builds],[1])
  fi
fi
AM_CONDITIONAL(WITH_LTDL, test "$have_ltdl" != 'no')

然后在设置MAGICK_DEP_LIBS值的ifelse分支中保证都含有$LIB_LTDL,同时注意no_cl的变量位置问题,否则上面代码段的no_cl值为空,导致上面代码段中的if分支始终能进入。

虽然经过这样的处理可以实现当使用--enable-opencl时自动加上-lltdl链接选项,但是引出了一个新的问题,当运行gm时:

[ysouyno@arch gm-ocl]$ gm display ~/temp/bg1a.jpg
gm display: No decode delegate for this image format (/home/ysouyno/temp/bg1a.jpg).
gm display: Unable to open file (Untitled) [No such file or directory].
[ysouyno@arch gm-ocl]$

经过调查发现,这是由于HasLTDL宏被启用的缘故。

关于-lltdl链接选项(二)

这里发现另外一个问题,在ImageMagick中也存在这个问题。

虚拟机环境中,有存在cl.h头文件,但没有libOpenCL.so的情况,这种情况下安装各种intel或者mesaruntime均不能配置成功可运行的opencl的环境(可以从clinfo的运行结果来看),这样的话,按“关于-lltdl链接选项(一)”的修改使用--enable-opencl选项编译GraphicsMagickImageMagick的话,均编译失败:

undefined reference to `lt_dlclose'

因为如果有cl.h头文件的话,那么HAVE_CL_CL_H宏将启用,则HAVE_OPENCL宏也被启用,这样的话lt_dlclose()就可见了,但是没有opencl的链接环境,导致no_cl变量为yes,则-lltdl被忽略,从而链接失败,出现上述问题。

#if defined(HAVE_CL_CL_H)
#  include <CL/cl.h>
#  define HAVE_OPENCL 1
#endif
#if defined(HAVE_OPENCL_CL_H)
#  include <OpenCL/cl.h>
#  define HAVE_OPENCL 1
#endif

阅读了一下GraphicsMagickconfigure.ac中关于build_modules的代码,了解到要在原生的GraphicsMagick中启用-lltdl,需要使用如下命令:

$ ./configure --enable-shared --with-modules

这样在lib/GraphicsMagick-1.3.35/module-Q8/coders目录中生成大量的.la文件。

我在想,我的要求只是简单的在--enable-opencl时添加一个链接选项,有必要大动干戈的修改原GraphicsMagicklibltdl的编译逻辑吗?我可以在configure.ac中额外处理no_cl,而不去启用HasLTDL宏?这样处理好不好?

<2022-04-13 Wed>

关于-lltdl链接选项(三)

赶紧结束吧,这个链接选项不能搞两天呀!既然ImageMagick也有同样的问题,那么就不考虑上面所说的,存在cl.h头文件,但没有libOpenCL.so的情况,造成链接失败。比如出现如下提示:

undefined reference to symbol 'dlsym@@GLIBC_2.2.5'

其它的测试看起来一切正常。

另因为lt_dlclose()也适用于windows平台,因此得尽快支持该平台,此平台还有好多开发,宏调整等等,得尽快完善起来。

commit:add ‘-lltdl’ if opencl enabled。文章来源地址https://www.toymoban.com/news/detail-820639.html

到了这里,关于GraphicsMagick 的 OpenCL 开发记录(二十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 『Linux升级路』基础开发工具——make/Makefile篇

    🔥 博客主页: 小王又困了 📚 系列专栏: Linux 🌟 人之为学,不日近则日退  ❤️ 感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识make/Makefile 📒1.1make/Makefile的优点 📒1.2make/Makefile的使用 二、依赖关系和依赖方法 📒2.1依赖关系 📒2.2依赖方法 三、make工作原理 🗒️ 前言:

    2024年02月05日
    浏览(37)
  • Linux 开发工具vim、gcc/g++、makefile

    目录 Linux编辑器-vim 1. 基本概念 2. 基本操作 3. 正常模式命令集 4. 末行模式命令集 5. 其他操作 6. 简单vim配置 Linux编译器-gcc/g++ 1、基本概念  2、程序翻译的过程 3. gcc如何完成程序翻译 4、动静态库  Linux项目自动化构建工具-make/Makefile 1、背景 2、创建makefile 3、原理 5、项目清

    2024年03月11日
    浏览(66)
  • 【Linux系统化学习】基础开发工具——make和makefile

    ========================================================================= 个人主页点击直达: 小白不是程序媛  Linux学习专栏: Linux系统化学习 ========================================================================= 目录 前言: 初始make和makefile makefile的好处 make和makefile的区别 make和make的使用 依赖关系和依

    2024年02月05日
    浏览(69)
  • Linux开发工具:yum、vim、gcc/g++、makefile

    在 Linux 下安装软件一共有三种方式: 源代码安装 有很多开源软件的源代码会被作者放在Github/Gitee 等网站上, 可以将这些源代码下载在本地. 通过直接在本地将这些源代码进行编译链接生成可执行程序 . 在嵌入式编程中, 经常用到交叉编译来处理不同平台的适配性. rpm包直接安装

    2024年01月19日
    浏览(46)
  • 【linux基础(七)】Linux中的开发工具(下)--make/makefile和git

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到开通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 如果你不知道什么是vim和gcc 请先阅读这两篇文章后再学习本节: 文章一: vim和yum 文章二: gcc/g++ 本章重点: 本篇文章会着重讲

    2024年02月08日
    浏览(36)
  • 基于linux下的高并发服务器开发(第一章)- Makefile(2)1.11

    ◼ 命令在执行之前,需要先检查规则中的依赖是否存在      如果存在,执行命令      如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如  果找到了,则执行该规则中的命令。 ◼ 检测更新,在执行规则中的命令时,会比较目标和依赖文

    2024年02月16日
    浏览(56)
  • Linux驱动开发笔记(一):helloworld驱动源码编写、makefile编写以及驱动编译基本流程

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130534343 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:没有了 下一篇:《Linu

    2024年02月08日
    浏览(77)
  • Linux中的开发工具(yum,vim,gcc/g++,gdb,Makefile,git)

    yum(Yellow dog Updater,Modified)是Linux下非常常用的一种 包管理器 。主要应用在Fedora,RedHat,Centos等发行版上。 和手机上的软件商店类似,我们可以使用 yum 来下载各种我们想要的软件包。使用 yum 时必须联网。 yum 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装

    2024年02月08日
    浏览(45)
  • 性能优化-OpenCL kernel 开发

    「发表于知乎专栏《移动端算法优化》」 本文主要介绍OpenCL的 Kernel,包括代码的实例以及使用注意的详解。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:高性能(HPC)开发基础教程 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致重复! 目录 一、概述

    2024年01月23日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包