Imagemagick只使用一个核心

10

我正在运行一个有8个核心的Ubuntu服务器。然而,ImageMagick总是只使用1个单独的核心。
运行identify -version返回:

Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: OpenMP

所以多线程需要的OpenMP已经启用。

根据这里的描述,使用-bench选项运行基准测试(例如convert logo: -resize 500% -bench 10 logo.png),返回结果。

Performance: 10i 1.17647ips 14.390u 0.14166666666833332977:08.500

根据手册中描述的,它不会返回Performance[1]Performance[8],这让我感到困惑。

有什么办法可以让imagemagick使用所有8个核心吗?

更新:这是从imagemagick调用中的strace输出:http://pastebin.com/Q0gC3k09


你是怎么安装IM和OpenMP的?我猜你需要从源代码安装最新的OpenMP和IM。 - emcconville
1
我通过 apt-get install 安装了 IM,据我所知我无法安装 OpenMP - 这更像是编译器的一个特性:http://askubuntu.com/questions/144352/how-can-i-install-openmp-in-ubuntu - Horen
+1. OpenMP 可以通过 gcc 的 -fopenmp 选项进行定义。 - emcconville
@emcconville,我已经安装了gcc。现在我需要如何启用openmp呢? - Horen
请设置以下环境变量(OMP_NUM_THREADS=8),然后重新启动IM。 - alexbuisson
显示剩余5条评论
2个回答

13

我能在Ubuntu 10.04上复现这个问题。用apt-get安装的ImageMagick似乎具有OpenMP功能,并使用-fopenmp标志进行配置,但该功能似乎未启用。可以通过运行以下行并将“FEATURES”列表(如果存在)与各种配置标志进行比较来验证这一点。

identify -list Configure | less

我能够通过遵循文章"在Ubuntu 8.04上从源代码安装ImageMagick"来解决这个问题,该文章详细介绍了以下过程。

  • 删除ImageMagick
  • 通过apt-get安装所有所需的图像/图形依赖库
  • 下载
    • wget http://www.imagemagick.org/download/ImageMagick-6.8.6-6.tar.gz
  • 按照基本的./configuremakesudo make install步骤进行
  • 将库路径导出到/usr/local/lib

这似乎有效,因为OpenMP现在存在于“FEATURES”列表中,当我执行convert logo: -resize 500% -bench 10 logo.png时,我看到如下内容:

Performance[1]: 10i 0.750ips 1.000e 18.750u 0:13.330
Performance[2]: 10i 0.751ips 0.500e 18.660u 0:13.320
Performance[3]: 10i 0.738ips 0.496e 18.840u 0:13.550
Performance[4]: 10i 0.469ips 0.385e 19.560u 0:21.320

这些结果符合我的预期。


感谢@emcconville,这很直接有效。由于您链接中的某些软件包已被弃用(最终使用了此链接:http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=20814),因此必须手动安装一些依赖项,但现在它可以工作了。渲染速度也加快了 - 所以我非常高兴! - Horen

1
一些测试我在自己的电脑上进行了,但是我无法设置真实或虚拟的多核机器来重现。因此,我没有提供真正的解决方案,而是提供了一种调查策略,因为问题似乎与系统有关。
但至少我可以说:
  1. 如果您从http://www.imagemagick.org/script/install-source.php#unix获取了最新的ImageMagick源代码,您应该能够为您的系统重新构建IM。

  2. 如果您想确保编译器按预期处理代码,在调用“make”之前,可以进行以下操作。编辑magick/studio.h文件,找到第143行,您应该看到以下内容。

    #if defined(_OPENMP) && ((_OPENMP >= 200203) || defined(__OPENCC__))
    #  include <omp.h>
    #  define MAGICKCORE_OPENMP_SUPPORT  1
    #endif
    

    修改这些行以添加编译器诊断消息:

    #if defined(_OPENMP) && ((_OPENMP >= 200203) || defined(__OPENCC__))
    #  include <omp.h>
    #  define MAGICKCORE_OPENMP_SUPPORT  1
    #  pragma message "MAGICKCORE_OPENMP_SUPPORT 1"
    #endif
    

    现在运行'./configure',然后运行'make'命令,每次使用studio.h时都会看到您添加的消息,BTW MAGICKCORE_OPEN_SUPPORT宏设置为1。

  3. MAGICKCORE_OPENMP_SUPPORT是IM内部使用的宏,用于启用/禁用OpenMp指令的预处理,因此如果您看到该消息,则代码中的所有#pragma omp都将被实际处理。

  4. 如果到目前为止一切正常,请尝试执行“make install”命令,并检查您自己的convert(/usr/local/bin/convert)版本是否能更好地工作(多核)。

  5. 如果仍然无法正常工作,则意味着它与IM无关,而是基于openMP的程序在您的系统上无法正确运行。在这种情况下,您应该考虑以下问题Why OpenMP program runs only in one thread,并使用比IM更短的程序构建和运行来检查openMP支持!


我在Mac OSX Sierra上遇到了类似的问题。解决方法是从源代码安装,并使用支持OpenMP的编译器,如clang-9。 - fmw42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接