⚠️ これは 非公式の翻訳サイトです。ImageMagick Studio LLC とは無関係です。正確な情報は 原文(https://imagemagick.org/openmp/) を参照してください。

並列実行(OpenMP)

ImageMagick の内部アルゴリズムの多くは、マルチコアプロセッサと OpenMP が提供する高速化を活用するためにスレッド化されています。OpenMP は並列プログラミングのための API 仕様です。お使いのコンパイラが OpenMP(gcc、Visual Studio 2005 など)ディレクティブをサポートしていれば、ImageMagick は自動的にサポートを含めます。確認するには、次のコマンドで ImageMagick の OpenMP 機能を探します:

$ magick identify -version
Version: ImageMagick 7.0.10-50 2021-01-04 Q16 https://imagemagick.org
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)

OpenMP が有効だと、ほとんどの ImageMagick アルゴリズムがシステムのすべてのコアで並列実行されます。ImageMagick は通常、各スレッドが 64 行のピクセルを処理するよう作業を分割します。行が完了すると、OpenMP はアルゴリズムが完了するまで各スレッドにさらにピクセル行のチャンクを割り当てます。たとえば、クアッドコアシステムで画像をリサイズしようとすると、リサイズは 4 コア(ハイパースレッディングが有効なら 8)で行われます。

tcmalloc メモリ確保ライブラリでロック競合を減らすことで、さらに性能を上げられます。有効にするには、ImageMagick のビルド時に configure コマンドラインへ --with-tcmalloc を加えます。

並列実行の落とし穴

並列環境での挙動を予測するのは難しいことがあります。性能は、コンパイラ、OpenMP ライブラリのバージョン、プロセッサの種類、コア数、メモリ量、ハイパースレッディングの有無、ImageMagick と同時に実行されるアプリケーションの組み合わせ、利用する特定の画像処理アルゴリズムなど、多くの要因に依存します。スレッド数の観点で最適な性能を確実に知る唯一の方法はベンチマークです。ImageMagick はコマンドのベンチマーク時に漸進的スレッディングを含み、1 つ以上のスレッドについて経過時間と効率を返します。これにより、お使いの環境でどれだけのスレッドが最も効率的かを特定できます。次はスレッド 1〜8 のベンチマーク例です:

$ magick -bench 40 model.png -sharpen 0x1 null:
Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070

性能が良いほど IPS(毎秒反復回数)の値が高くなります。この例では 8 コアが最適です。ただし、場合によってはスレッド数を 1 に設定する(例: -limit thread 1)か、OpenMP を完全に無効にするのが最適なこともあります。この機能を無効にするには、configure スクリプトのコマンドラインへ --disable-openmp を加え、ImageMagick を再ビルド・再インストールします。