Imagemagick

為什麼帶有 OpenCL 的 ImageMagick 比 OpenMP 慢?

  • November 10, 2015

我一直在嘗試將 ImageMagick 與 OpenCL 一起使用來加快批量調整圖像的大小。

為此,我在 Amazon EC2 上啟動了一個GPU 實例(g2.2xlarge),根據 AWS,它的特點是:

高性能 NVIDIA GPU,每個都具有 1,536 個 CUDA 核心和 4GB 顯存

為 GPU 實例使用了特定的 AMI,即NVIDIA 提供的帶有 NVIDIA GRID GPU 驅動程序的 Amazon Linux AMI


使用 OpenMP

在從原始碼編譯 ImageMagick 之前,作為比較的基礎,我嘗試了僅支持 OpenMP 的內置 ImageMagick:

$ convert --version
Version: ImageMagick 6.7.8-9 2015-10-08 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2012 ImageMagick Studio LLC
Features: OpenMP

我將50 Mpx JPEG 圖像的大小調整為其大小的 25%,並對其進行計時:

$ time convert -resize 1158x1737 01.jpg 01b.jpg

real    0m1.371s
user    0m5.388s
sys     0m0.204s

我已經執行了幾次以確保時間一致(特別是因為 ImageMagick 在首次使用時對設備性能進行了基準測試)。


使用 OpenCL

然後我下載了ImageMagick 原始碼,並編譯了它們:

$ export C_INCLUDE_PATH=/opt/nvidia/cuda/include
$ ./configure --enable-opencl
$ make

我前往已編譯的二進製文件,並檢查 OpenCL 現在是否已啟用:

$ ./convert --version
Version: ImageMagick 6.9.2-5 Q16 x86_64 2015-11-08 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC OpenCL OpenMP

然後執行基準測試:

$ time ./convert -resize 1158x1737 01.jpg 01b.jpg

real    0m2.655s
user    0m1.720s
sys     0m0.928s

再次,我執行了幾次以確保時間是一致的。

令我驚訝的是,這是僅使用 OpenMP 的版本的一半速度。


試圖理解它

正如這個 StackOverflow 答案中所建議的,我檢查了 ImageMagick 設備基准文件:

$ cat ~/.cache/ImageMagick/ImagemagickOpenCLDeviceProfile
<version>ImageMagick Device Selection v0.9</version>
<device><type></type><name>GRID K520</name><driver>340.32</driver><max cu>8</max cu><max clock>797</max clock><score>0.2780</score></device>
<device><type></type><score>1.4140</score></device>

注意:此文件僅在我執行 ImageMagick 的編譯版本時創建;出於某種原因,它不是在我執行 Amazon Linux 附帶的版本時創建的。

所以當我讀到它時,ImageMagick 可以使用兩種設備:

  • GPU,辨識為NVIDIA GRID K520得分為 0.278
  • 未知設備(CPU?),得分為 1.414

據我了解,這裡的 CPU 勝過 GPU

好的,CPU 還不錯(E5-2670 @ 2.60GHz),但 GPU 在它的領域裡是相當的野獸。


我的問題

  • 編譯後的 ImageMagick 版本怎麼能比 Amazon Linux 附帶的版本快一半?
  • CPU 如何在 ImageMagick 基準測試中勝過 GPU?

歡迎任何提示以恢復預期的 GPU 性能。

  • 編譯後的 ImageMagick 版本怎麼能比 Amazon Linux 附帶的版本快一半?

使用 OpenCL 時,它不是不同的初始化,而是額外的初始化;它總是需要更長的時間。我們當然已經預編譯了核心,但只是載入庫、創建命令隊列、載入核心……這一切都需要時間。不幸的是,“OpenCL 模式”不太適合這種一次性命令行使用。可以一次初始化 ImageMagick 庫並多次呼叫該庫的應用程序或持久伺服器會做得很好。

  • CPU 如何在 ImageMagick 基準測試中勝過 GPU?

您正在閱讀錯誤的資訊。較低的分數意味著設備速度更快。GPU 速度快了近 6 倍。在這種情況下,術語 score 可能會令人困惑,因此我們可能希望在 ImageMagick 的未來版本中重命名它。

引用自:https://serverfault.com/questions/734854