並行處理比順序處理慢?

並行處理比順序處理慢?

編輯:對於將來偶然發現這一點的任何人:Imagemagick 使用 MP 庫。如果有可用的核心,那麼使用它們會更快,但如果您有並行作業,那就沒有幫助了。

執行下列操作之一:

  • 序列完成您的工作(使用 Imagemagick 並行模式)
  • 設定 MAGICK_THREAD_LIMIT=1 來呼叫有問題的 imagemagick 二進位。

透過讓Imagemagick 僅使用一個線程,它在我的測試案例中減慢了20-30%,但這意味著我可以在每個核心上運行一項作業而不會出現問題,從而顯著提高性能的淨值。

原問題:

在使用 ImageMagick 轉換一些圖像時,我注意到有些奇怪的效果。使用 xargs 比標準 for 迴圈慢得多。由於 xargs 僅限於單一進程,因此其行為應類似於 for 循環,因此我對此進行了測試,發現它大致相同。

於是,我們就有了這個示範。

  • 四核心(AMD 速龍 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

誰能想到為什麼運行該程式的兩個實例需要兩倍以上的實時時間以及十倍以上的處理器時間來完成相同的任務?在最初的打擊之後,更多的進程似乎沒有那麼顯著的效果。

我認為這可能與磁碟查找有關,所以我完全在內存中進行了該測試。它是否與 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 快取相比,您希望轉換的檔案有多大?你的二級緩存?

如果沒有更好地了解內部情況,我懷疑快取爭用會導致 CPU 在等待資料重新快取時空閒,因為其他進程不斷將重要的內容從快速記憶體中踢出。

也可以看看這是我在 Stack Overflow 上給的答案

相關內容