ImageMagickは、いくつかのOpenCLアクセラレーションされた操作を組み込みでサポートしています。ただし、動作にはいくつかの条件があります。これらの要件を以下に示します。
- GPUプラットフォーム: AMDまたはIntel GPUがサポートされています。現時点ではNVIDIAはサポートされていません。
- OSとドライバー
- Mac OS X: 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 <オプション>
- コマンドラインユーティリティ: 適切な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およびMacOSXでは$HOME/.cache/ImageMagickに、Windowsでは%LOCALAPPDATA%\ImageMagickに保存されます。これらのテストを初めて実行するには、以下のコマンドを使用してください。
MAGICK_OCL_DEVICE=true magick sample.jpg -blur 0x5 null:
Windowsでは、MAGICK_OCL_DEVICE=trueの部分を削除し、上記のコマンドを実行する前にset MAGICK_OCL_DEVICE=trueコマンドを実行してOpenCL操作を有効にする必要があります。
キャッシュディレクトリを変更するには、MAGICK_OPENCL_CACHE_DIR環境変数を設定します。ImageMagickは、ハードウェアの変更、ドライバーの更新、新しいカーネルソースを検出し、セットアップとキャリブレーションテストを再実行できます。キャッシュディレクトリのコンテンツを削除することで、ImageMagickに処理の再実行を強制することもできます。
上記で説明した環境変数に加えて、ImageMagickは、開発者がOpenCLアクセラレーションをより細かく制御できるようにする一連のAPIを提供しています。たとえば、InitializeOpenCL()関数はOpenCL環境の初期化に使用します。
clEnv=GetCurrentOpenCLEnv(); if (InitializeOpenCL(clEnv,exception) == MagickFalse) { /* looks like OpenCL is not supported */ }