OpenCL
ImageMagick には、一部の OpenCL 高速化操作の組み込みサポートがあります。ただし、その動作にはいくつかの条件があります。要件は次のとおりです。
- OS とドライバ:
- macOS: OpenCL の組み込みサポートあり。他の操作は不要。
- Linux/Windows: サポートされたプラットフォームで、OpenCL を有効にするため必要なドライバをインストールする。
- モバイル: ImageMagick の OpenCL サポートはモバイル OS(iOS/Android)では利用できない。
- コンパイル時フラグ: ImageMagick の OpenCL はコンパイル時に明示的に有効化する必要がある。configure を --enable-opencl フラグ付きで実行して行う。
- ランタイムサポートの確認: OpenCL サポートが有効か確認するには magick --version を実行する。出力に Features: ... OpenCL ... と表示されるはず。
- ランタイムフラグ: OpenCL はランタイムでは既定で無効。有効にするには環境変数 MAGICK_OCL_DEVICE=true を使う(例: MAGICK_OCL_DEVICE=true magick
)。特定のデバイスのみを有効にするには MAGICK_OCL_DEVICE=GPU または MAGICK_OCL_DEVICE=CPU を使う。 - コマンドラインユーティリティ: 適切な OpenCL サポートには、convert・mogrify などより magick ユーティリティの使用を推奨する。
- 画像タイプ: OpenCL 高速化はカラーマップのない画像でのみ機能する。代わりにトゥルーカラー画像を使う。
- 演算子: 以下は OpenCL 高速化された画像演算子の一覧。
blur contrast charcoal function grayscale motion-blur resize
次の演算子も OpenCL 高速化されていますが、アルファチャンネルが有効である必要があります(例: magick sample.jpg -alpha on -despeckle null:)。
despeckle
equalize
modulate
OpenCL 動作に関するメモ
OpenCL 高速化された演算子の一部が初めて呼び出され、上記のすべての条件が満たされると、ImageMagick はシステムハードウェアに応じて OpenCL 環境を構成するため一連のテストを行います。そのため、高速化オプションを初めて使うときに遅延が大きくなるのは正常です。OpenCL カーネルはソース形式で ImageMagick 内部に埋め込まれています。初期セットアップ中、ImageMagick は利用可能なすべての OpenCL デバイスを検出し、各ターゲット用にカーネルをコンパイルします。ImageMagick は、優先して使うデバイスを決めるため、内部でいくつかの性能テストも実行します。コンパイル済みカーネルコードと性能テスト結果はキャッシュディレクトリに格納され、以降の OpenCL パスの呼び出しで再利用できます。既定では、OpenCL キャッシュデータは Linux・macOS では $HOME/.cache/ImageMagick に、Windows では %LOCALAPPDATA%\ImageMagick に格納されます。これらのテストを初めて実行するには、次のコマンドを使います:
MAGICK_OCL_DEVICE=true magick sample.jpg -blur 0x5 null:
Windows では MAGICK_OCL_DEVICE=true の部分を取り除き、上記コマンドを実行する前に OpenCL 操作を有効にするコマンド set MAGICK_OCL_DEVICE=true を実行すべきです。
キャッシュディレクトリを変更するには、環境変数 MAGICK_OPENCL_CACHE_DIR を設定します。ImageMagick はハードウェアの変更・ドライバ更新・新しいカーネルソースを検出し、セットアップとキャリブレーションテストを再実行できます。キャッシュディレクトリの内容を削除することで、この処理の再実行を強制することもできます。
上記の環境変数に加えて、ImageMagick は開発者が OpenCL 高速化をより細かく制御できる一連の API を提供します。たとえば、OpenCL 環境を初期化するには InitializeOpenCL() 関数を使います:
clEnv=GetCurrentOpenCLEnv();
if (InitializeOpenCL(clEnv,exception) == MagickFalse)
{
/* looks like OpenCL is not supported */
}