我正在运行一个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
。
按照here所述,使用-bench
选项(例如convert logo: -resize 500% -bench 10 logo.png
)运行基准
Performance: 10i 1.17647ips 14.390u 0.14166666666833332977:08.500
它不会像in the manual那样通过Performance[1]
返回http://pastebin.com/Q0gC3k09,这让我感到惊讶。
我有什么想法可以让imagemagick使用所有8个核心?
更新:以下是imagemagick调用的strace输出:{{3}}
答案 0 :(得分:11)
我能够在Ubuntu 10.04上重现这种行为。来自apt-get的ImageMagick似乎拥有 OpenMP功能,并配置了-fopenmp
标志,但似乎没有启用该功能。这可以通过运行以下行并将“ FEATURES ”列表(如果存在)与各种配置标志进行比较来验证。
identify -list Configure | less
我可以通过详细说明以下过程的文章“Installing ImageMagick from Source on Ubuntu 8.04”解决此问题。
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
这些结果符合我的预期。
答案 1 :(得分:1)
我做了一些测试,但我无法设置真实或虚拟化的多核机器来重现。所以我没有真正的解决方案,但更多的是采用策略进行调查,因为它似乎确实与系统有关。
但至少我可以这么说:
如果您从http://www.imagemagick.org/script/install-source.php#unix获得最后一个ImageMagick来源,您应该可以为您的系统重建IM。
如果你想确保你的编译器按预期处理代码,你可以在调用“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.
MAGICKCORE_OPENMP_SUPPORT是IM在内部用于启用/禁用OpenMp指令预处理的宏,因此,如果您看到该消息,则所有代码的#pragma omp都将处理为真实。
< / LI>如果一切顺利,直到现在尝试执行'make install'命令并检查你的'bench'命令是否更好(多核)与你自己的转换版本(/ usr / local / bin / convert)
如果它仍然无效,则表示它与IM无关,但基于openMP的程序无法在您的系统上正常运行。在这种情况下,您应该考虑以下问题Why OpenMP program runs only in one thread,并使用比IM更短的程序检查openMP支持以构建和运行!