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.dokyumento.jp 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(1秒あたりの反復)値が高くなります。この例では、8つのコアが最適です。ただし、場合によってはスレッド数を1に設定(例:-limit thread 1)するか、OpenMPを完全に無効にすることが最適な場合があります。この機能を無効にするには、構成スクリプトのコマンドラインに--disable-openmpを追加してからImageMagickを再構築して再インストールします。