Windows版ImageMagickをOpenCLを有効にしてビルドする

 ImageMagickはいくつかのコマンド*1OpenCL対応していますが、公式が配布しているバイナリはOpenCLサポートが無効化されています。
 Linux版にせよWindows版にせよ、OpenCLを有効化するには自前でソースからビルドする必要があります。
 ビルド手順は公式が公開しており、Linuxなら Install from Source @ ImageMagickWindowsなら Install from Source @ ImageMagick に記されています。
 Ubuntu18.04では特に嵌る点もなく普通にビルドできましたが、恐らくRadeon RX470のドライバ周りの関係でUbuntuではOpenCLが機能しなかったので、Windows10環境でビルドすることにしました*2
 以下、備忘を兼ねてその手順を記載します。
 
 

前提環境

OS
Windows 10 Pro 1809 x64
GPU
AMD Radeon RX470

 

ImageMagickビルド手順

1. Visual Studio Communityのインストール
 個人向けの無償で使えるVisual Studio Communityをダウンロードし、インストールします。
ダウンロード | IDE、Code、Team Foundation Server | Visual Studio
 
2. ImageMagickソースコードのダウンロード・展開・デプロイ
 公式のビルド手順にあるように、以下のZIPをダウンロードし、展開します。
https://imagemagick.org/download/windows/ImageMagick-windows.zip

 展開したソースコードの配置先は特に指定されていませんが、今回はVisual Studioのデフォルトのソースコード配置先にImageMagickディレクトリを作成してデプロイしました。

%USERPROFILE%\source\repos\ImageMagick-7.0.8-28

3. Visual Studioでconfigureソリューションを開き、ビルドする
 Linux環境の.configureの代わりにWindows版ではconfigure.slnをビルドして実行します。
 初回ビルド時、Windows 8.1 SDKが無いとか、VisualStudioのバージョン差異などによる警告やエラーが発生するので、メッセージに従ってSDKダウンロードやソリューションの再ターゲット操作などを行ない、再ビルドします。

4. configureソリューションの実行
4.1 以下の画面が表示されるので[次へ]を押下
f:id:kachine:20190222201905p:plain
4.2 ビルド設定画面が表示されるが、[Enable OpenCL]が非活性状態でチェックできないので一旦[キャンセル]する
f:id:kachine:20190222202129p:plain

5. Enable OpenCLできない原因の調査
 (私はRX470のOpenCLを使いたいのですが、)configureのソースコードを調べてみると、AMDAPPSDKROOTという環境変数の有無と、その環境変数が指すディレクトリ下にincludeというディレクトリが存在するかを判定して[Enable OpenCL]できるか制御しているようです。

6. OpenCL SDKの入手・デプロイ
 検索してみるとAMDOpenCL SDKは現在はAMD公式サイトで公開されていないようですが、AMDコミュニティの以下の投稿によると、GitHubから入手できるようです。
How to download AMD APP SDK 3.0? | Community
https://github.com/GPUOpen-LibrariesAndSDKs/OCL-SDK/files/1406216/lightOCLSDK.zip
 ライセンスについての説明が見当たらないのですが、ヘッダファイル中には以下のコメントがあり、Khronos Groupの著作権表示等を改変しない限り、使用はもちろん販売を含めた再配布も禁止されていないようですので、特に扱いに困るといったことはなさそうです。

/*******************************************************************************
 * Copyright (c) 2008 - 2013 The Khronos Group Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and/or associated documentation files (the
 * "Materials"), to deal in the Materials without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Materials, and to
 * permit persons to whom the Materials are furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Materials.
 *
 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
 ******************************************************************************/

 ダウンロードしたZIPを展開し、Visual Studioのデフォルトのソースコード配置先にOpenCL SDKディレクトリを作成してデプロイします。

%USERPROFILE%\source\repos\lightOCLSDK

 環境変数AMDAPPSDKROOTを追加し、値を%USERPROFILE%\source\repos\lightOCLSDKに設定します。

7. configureソリューションの再実行
 Visual Studioを再起動し、configureソリューションを再実行します。
7.1 ビルド設定画面で[Enable OpenCL]が活性状態でチェックできるようになっているのでチェックを入れ、その他のオプションも必要に応じて選択し[次へ]を押下
f:id:kachine:20190222204515p:plain
7.2 システム設定画面で中間ファイルおよび最終出力ディレクトリを必要に応じて変更して、[次へ]を押下
f:id:kachine:20190222204804p:plain
7.3 設定完了画面で[完了]を押下
f:id:kachine:20190222204838p:plain

8. VisualDynamicMTソリューションのビルド
 VisualDynamicMTソリューションを開き、ビルドします。configureソリューションを初回ビルドした時と同様にエラーが発生するので、エラーメッセージに従いソリューションのリターゲット操作などを行います(stdlib.hなどC言語標準のヘッダファイルが見つからないといったエラーも発生しましたが、なぜか再ターゲットで解消しました)。
 無事にビルドできると、configureソリューション実行時に出力ディレクトリを変更していなければ、以下のディレクトリにバイナリが生成されています。

%USERPROFILE%\source\repos\ImageMagick-7.0.8-28\VisualMagick\bin

9. 動作確認
 生成されたバイナリを実行して、バージョン情報からOpenCLサポートされていることを確認します。

> convert --version
Version: ImageMagick 7.0.8-28 Q16 x64 2019-02-19 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Visual C++: 191627027
Features: Cipher DPC HDRI Modules OpenCL OpenMP
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg lcms lqr lzma openexr pangocairo png ps raw rsvg tiff webp xml zlib

 無事にFeaturesにOpenCLが表示されていることが確認できます。

 参考までに、バイナリで公開されているImageMagickの場合、以下のようにOpenCLの表記はありません。

> convert -version
Version: ImageMagick 7.0.8-28 Q16 x64 2019-02-18 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2018 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Visual C++: 180040629
Features: Cipher DPC HDRI Modules OpenMP
Delegates (built-in): bzlib cairo flif freetype gslib heic jng jp2 jpeg lcms lqr lzma openexr pangocairo png ps raw rsvg tiff webp xml zlib

10. OpenCLを使ったコマンド実行
 例えばblurやresizeはOpenCLに対応しているので、以下のようなコマンドを実行してみます。

convert -verbose logo: -resize 200% -blur 0x5 out.png

 エラーが発生するようなこともなく、出力ファイルも正常です。が、OpenCL非対応のバイナリ公開版ImageMagickより遅い…。
 環境変数MAGICK_OCL_DEVICEでOpenCLを無効化できるので、

set MAGICK_OCL_DEVICE=OFF
convert -verbose logo: -resize 200% -blur 0x5 out.png

 と、OpenCLを無効にして試してみましたが、やはりバイナリ公開版ImageMagickより遅いです。
 もしやと思って確認したところ、Visual StudioのビルドオプションがDebugビルドになっていたことが原因でした。Releaseビルドにしてクリーンリビルドしたところ、バイナリ公開版ImageMagickより僅かながらも高速になりました!
 



以上。

*1: Parallel Execution with OpenCL @ ImageMagick

*2:単なる主観ですが、Windowsでビルド環境を整えるのは面倒な印象が強いので、Ubuntuで出来るならそちらを使いたかったのですけどね…