9

我正在运行一个 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

4

2 回答 2

12

我能够在 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
  • 遵循基本./configure的 , make, &sudo make install步骤
  • 导出库路径到/usr/local/lib

这似乎有效,因为 OpenMP 现在出现在“功能”列表下,并且当我执行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

这些结果符合我的预期。

于 2013-07-19T21:20:35.870 回答
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”命令并检查“bench”命令是否与您自己的转换版本(/usr/local/bin/convert)一起工作得更好(多核)

  5. 如果它仍然不起作用,则意味着它与 IM 无关,但基于 openMP 的程序无法在您的系统上正确运行。在这种情况下,您应该考虑以下问题为什么 OpenMP 程序仅在一个线程中运行,并使用比 IM 更短的程序构建和运行来检查 openMP 支持!

于 2013-07-19T14:48:23.263 回答