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平台,因此得尽快支持该平台,此平台还有好多开发,宏调整等等,得尽快完善起来。

commitadd ‘-lltdl’ if opencl enabled

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值