Color Modes

使用 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.dev.org.tw
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)

啟用 OpenMP 後,大多數 ImageMagick 演算法會在系統上的所有核心上平行執行。ImageMagick 通常會劃分工作,以便每個線程處理 64 行像素。隨著行的完成,OpenMP 會將更多像素行區塊分配給每個線程,直到演算法完成。例如,如果您有一個四核系統,並嘗試調整圖像大小,則調整大小將在 4 個核心上進行(如果啟用了超線程,則為 8 個)。

您可以通過使用 tcmalloc 記憶體分配庫減少鎖定爭用,進一步提高效能。要啟用,請在建置 ImageMagick 時將 --with-tcmalloc 添加到 configure 命令列。

平行執行的風險

在平行環境中可能難以預測行為。效能可能取決於許多因素,包括編譯器、OpenMP 庫的版本、處理器類型、核心數量、記憶體量、是否啟用了超線程、與 ImageMagick 同時執行的應用程序組合,或您使用的特定圖像處理演算法。確定最佳效能(就線程數而言)的唯一方法是進行基準測試。ImageMagick 在對命令進行基準測試時包含漸進式線程化,並返回一個或多個線程的運行時間和效率。這可以幫助您確定在您的環境中多少個線程最有效率。以下是線程 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 可能是最佳的。要禁用此功能,請將 --disable-openmp 添加到您的配置腳本命令列,然後重新建置並重新安裝 ImageMagick。