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

次のプロセスを詳述した記事「Installing ImageMagick from Source on Ubuntu 8.04 」に従って、これを解決することができました。

  • 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 が「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

そして、これらの結果は私が期待するものと一致しています。

于 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」コマンドを実行して、独自のバージョンの convert (/usr/local/bin/convert) で「bench」コマンドがうまく機能するかどうか (マルチコア) を確認してください。

  5. それでも機能しない場合は、IM とは関係なく、openMP ベースのプログラムがシステムで正しく動作していないことを意味します。その場合、次の質問を検討する必要があります。なぜ OpenMP プログラムは 1 つのスレッドでしか実行されないのか、IM よりも短いプログラムでビルドおよび実行して OpenMP サポートを確認してください。

于 2013-07-19T14:48:23.263 に答える