ImageMagick の openMP利用に不正確な部分があって、高負荷らしい
参考資料
- OpenMP 無効の ImageMagick の RPM を作成する - akishin999の日記
- OpenMP版ImageMagickの高負荷問題の最も簡単な対処法:ImageMagick:Technical tips:Media hub
- ImageMagickのOpenMPは並列実行で悪影響するのは本当だった - 文系プログラマによるTIPSブログ
OMP_NUM_THREADS=1
さっそく ビルド見てみよう
takuya@rena:/usr/local/Cellar/imagemagick/6.8.9-1$ convert --version Version: ImageMagick 6.8.9-1 Q32 x86_64 2014-08-02 http://www.imagemagick.org Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC Features: DPC Modules Delegates: bzlib cairo fftw fontconfig freetype jng jp2 jpeg lcms lqr ltdl lzma openexr png rsvg tiff webp x xml zlib
takuya@rena:/usr/local/Cellar/imagemagick/6.8.9-1$ cat INSTALL_RECEIPT.json | jq . { "used_options": [ "--with-fontconfig", "--with-ghostscript", "--with-jp2", "--with-liblqr", "--with-librsvg", "--with-libtiff", "--with-libwmf", "--with-little-cms", "--with-little-cms2", "--with-openexr", "--with-perl", "--with-quantum-depth-16", "--with-quantum-depth-32", "--with-quantum-depth-8", "--with-x11", "--with-webp" ], "unused_options": [ "--without-magick-plus-plus", "--without-jpeg", "--without-libpng", "--without-freetype" ], "built_as_bottle": false, "poured_from_bottle": false, "tapped_from": "Homebrew/homebrew", "time": 1406912136, "HEAD": "db71783ad26f0277fa1d565bed14302051b5f011", "stdlib": "libcxx", "compiler": "clang" }
なんだ、HomeBrew経由のImageMagickは openMP使ってない。そりゃOSXだし当たり前か。
Debianの convert はというと
takuya@atom:~$ convert --version Version: ImageMagick 6.7.7-10 2013-09-01 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC Features: OpenMP
DebianのデフォルトパッケージはOpenMPが有効でビルドされてました。
そのままで実行
実験したマシンはこちらも Corei7 (Lynnfield) TOPで見てたらCPUの負荷率は400% くらい
takuya@atom:~$ time for i in {1..10}; do convert image2.jpg -deskew 40% out.jpg ;done real 0m25.751s user 2m0.700s sys 0m1.204s
TOPで見てたらCPUの負荷率は100% くらい
takuya@atom:~$ export OMP_NUM_THREADS=1 takuya@atom:~$ time for i in {1..10}; do convert image2.jpg -deskew 40% out.jpg ;done real 1m16.499s user 1m15.329s sys 0m0.928s
目に見えて変わるものでもないので気にしないことにする。
高負荷は、たしかにそうなんだけど、 real の秒数が何度やっても OpenMP使ったほうが圧倒的なんだけどな。。。高負荷はたしかに問題あるとは思うけど。常に処理してるマシンでもない限り気にしなくていいってことだな。