為什麼帶有 OpenCL 的 ImageMagick 比 OpenMP 慢?
我一直在嘗試將 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 的未來版本中重命名它。