並列処理は順次処理よりも遅いですか?

並列処理は順次処理よりも遅いですか?

編集: 今後これに遭遇する人のために: Imagemagick は MP ライブラリを使用します。使用可能なコアがある場合はそれを使用する方が高速ですが、並列ジョブがある場合は役に立ちません。

次のいずれかを実行します。

  • ジョブをシリアルで実行する(Imagemagick を並列モードで使用)
  • 問題の imagemagick バイナリを呼び出す場合は、MAGICK_THREAD_LIMIT=1 を設定します。

Imagemagick が 1 つのスレッドのみを使用するようにすると、テスト ケースでは速度が 20 ~ 30% 低下しますが、問題なくコアごとに 1 つのジョブを実行できるため、パフォーマンスが大幅に向上します。

元の質問:

ImageMagick を使用していくつかの画像を変換しているときに、奇妙な効果に気づきました。xargs を使用すると、標準の for ループよりも大幅に遅くなります。単一のプロセスに制限された xargs は for ループのように動作するはずなので、それをテストしたところ、ほぼ同じであることがわかりました。

したがって、このデモンストレーションが行われます。

  • クアッドコア(AMD Athalon X4、2.6GHz)
  • 完全に tempfs で動作しています (合計 16g の RAM、スワップなし)
  • その他の大きな負荷はありません

結果:

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real        0m3.784s
user        0m2.240s
sys         0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real        0m9.097s
user        0m28.020s
sys         0m0.910s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real        0m9.844s
user        0m33.200s
sys         0m1.270s

このプログラムのインスタンスを 2 つ実行すると、同じタスクを完了するのに、実時間では 2 倍以上、プロセッサ時間では 10 倍以上かかる理由を誰か考えられますか? 最初のヒットの後、プロセスを増やしてもそれほど大きな影響はないようです。

ディスク シークと関係があるかもしれないと思ったので、そのテストをすべて RAM で実行しました。Convert の動作と関係があるのでしょうか。一度に複数のコピーがあると、プロセッサ キャッシュを効率的に使用できないなどということでしょうか。

編集: 1000x 769KB ファイルで実行すると、パフォーマンスは期待どおりです。興味深いですね。

/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.679s
user    5m6.980s
sys 0m6.340s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level

real    3m37.152s
user    5m6.140s
sys 0m6.530s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 2 convert -auto-level

real    2m7.578s
user    5m35.410s
sys     0m6.050s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 4 convert -auto-level

real    1m36.959s
user    5m48.900s
sys     0m6.350s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 10 convert -auto-level

real    1m36.392s
user    5m54.840s
sys     0m5.650s

答え1

変換したいファイルは、L1 キャッシュや L2 キャッシュと比較してどれくらいの大きさですか?

内部を詳しく調べなければ、他のプロセスが高速メモリから重要なものを蹴り出し続けているため、キャッシュ競合により、データが再キャッシュされるのを待つ間、CPU がアイドル状態になっているのではないかと疑われます。

参照Stack Overflowで私が出したこの回答

関連情報