v7.1.2-35 Latest Stable Release

Parallel Execution with OpenCL

Learn how to configure and run OpenCL-accelerated image processing operations in ImageMagick for high-performance parallel execution.

quickstart.sh
# Install via your favorite Package Manager
$ apt install imagemagick
# Convert PNG to WebP with compression
$ magick input.png -quality 85 output.webp
# Resize image maintaining aspect ratio
$ magick input.jpg -resize 800x600^ output.jpg

ImageMagick has built-in support for some OpenCL accelerated operations. However, there are some conditions for its operation. These requirements are listed below.

OpenCL Operation Requirements

  1. OS and drivers:
    • macOS: has built-in support for OpenCL. No other actions required.
    • Linux/Windows: on supported platforms, install required drivers to enable OpenCL.
    • Mobile: ImageMagick's OpenCL support is not available on mobile OSes (iOS/Android).
  2. Compile-time flag: ImageMagick's OpenCL must be explicitly enabled when compiling. This is done by running configure with --enable-opencl flag set.
  3. Check runtime support: to verify if OpenCL support is enabled, run
    $ magick --version
    . The command output should read Features: ... OpenCL ....
  4. Runtime flag: OpenCL is disabled by default at runtime. To enable it use the environment variable MAGICK_OCL_DEVICE=true, e.g., MAGICK_OCL_DEVICE=true magick <options>. And to only enable a specific device use MAGICK_OCL_DEVICE=GPU or MAGICK_OCL_DEVICE=CPU.
  5. Command line utility: for proper OpenCL support it's recommended to use the magick utility over convert, mogrify, and others.
  6. Image type: OpenCL acceleration only works on images without a color map. Use true color images instead.
  7. Operators: the following is a list of image operators that have been OpenCL accelerated:
    Standard Accelerated
    blur
    contrast
    charcoal
    function
    grayscale
    motion-blur
    resize
    Requires Alpha Channel Enabled

    Example: $ magick sample.jpg -alpha on -despeckle null:

    despeckle
    equalize
    modulate

OpenCL Operation Notes

When some of the OpenCL accelerated operators are invoked for the first time and all the conditions above are met, ImageMagick conducts a series of tests to configure the OpenCL environment according to the system hardware. Therefore, it is normal to experience a higher latency the first time you use an accelerated option. The OpenCL kernels are embedded inside ImageMagick in source format. During the initial setup, ImageMagick discovers all the available OpenCL devices and compiles the kernels for each of these targets. ImageMagick also runs several performance tests internally to determine the preferred device to use.

The compiled kernel code and the performance test results are stored into the cache directory so that the data can be reused by subsequent invocations of the OpenCL path. By default, the OpenCL cached data is stored in $HOME/.cache/ImageMagick on Linux and macOS or in %LOCALAPPDATA%\ImageMagick on Windows. To run these tests for the first time, use the command below:

MAGICK_OCL_DEVICE=true magick sample.jpg -blur 0x5 null:

To change the cache directory, set the MAGICK_OPENCL_CACHE_DIR environment variable. ImageMagick is able to detect hardware changes, driver updates, and new kernel sources and re-run the setup and the calibration test. You can also force ImageMagick to re-run the process by removing the content from the cache directory.

Developer API Control

In addition to the environment variables mentioned above, ImageMagick provides a set of APIs that allow developers to gain more fine-grained control of the OpenCL acceleration. For example, use the InitializeOpenCL() function to initialize the OpenCL environment:

clEnv=GetCurrentOpenCLEnv();
if (InitializeOpenCL(clEnv,exception) == MagickFalse)
  {
    /* looks like OpenCL is not supported  */
  }