OpenCL
ImageMagick incluye soporte integrado para algunas operaciones aceleradas con OpenCL. Sin embargo, existen ciertas condiciones para su funcionamiento. Estos requisitos se enumeran a continuación.
- SO y controladores:
- macOS: tiene soporte integrado para OpenCL. No se requiere ninguna otra acción.
- Linux/Windows: en las plataformas compatibles, instale los controladores necesarios para habilitar OpenCL.
- Móvil: el soporte de OpenCL de ImageMagick no está disponible en los SO móviles (iOS/Android).
- Indicador en tiempo de compilación: el soporte de OpenCL de ImageMagick debe habilitarse explícitamente al compilar. Esto se hace ejecutando configure con el indicador --enable-opencl activado.
- Comprobar el soporte en tiempo de ejecución: para verificar si el soporte de OpenCL está habilitado, ejecute magick --version. La salida del comando debería mostrar Features: ... OpenCL ...
- Indicador en tiempo de ejecución: OpenCL está deshabilitado de forma predeterminada en tiempo de ejecución. Para habilitarlo, use la variable de entorno MAGICK_OCL_DEVICE=true, p. ej. MAGICK_OCL_DEVICE=true magick
. Y para habilitar únicamente un dispositivo específico, use MAGICK_OCL_DEVICE=GPU o MAGICK_OCL_DEVICE=CPU. - Utilidad de línea de comandos: para un soporte adecuado de OpenCL, se recomienda usar la utilidad magick en lugar de convert, mogrify y otras.
- Tipo de imagen: la aceleración por OpenCL solo funciona con imágenes sin mapa de color. Use en su lugar imágenes de color verdadero (true color).
- Operadores: la siguiente es una lista de operadores de imagen que han sido acelerados con OpenCL.
blur contrast charcoal function grayscale motion-blur resize
Los siguientes operadores también están acelerados con OpenCL, pero requieren que el canal alfa esté habilitado, p. ej. magick sample.jpg -alpha on -despeckle null:.
despeckle
equalize
modulate
Notas sobre el funcionamiento de OpenCL
Cuando algunos de los operadores acelerados con OpenCL se invocan por primera vez y se cumplen todas las condiciones anteriores, ImageMagick realiza una serie de pruebas para configurar el entorno OpenCL según el hardware del sistema; por lo tanto, es normal experimentar una latencia mayor la primera vez que se usa una opción acelerada. Los núcleos (kernels) de OpenCL están incrustados dentro de ImageMagick en formato de código fuente. Durante la configuración inicial, ImageMagick descubre todos los dispositivos OpenCL disponibles y compila los núcleos para cada uno de estos destinos. ImageMagick también ejecuta internamente varias pruebas de rendimiento para determinar el dispositivo preferido a utilizar. El código de núcleo compilado y los resultados de las pruebas de rendimiento se almacenan en el directorio de caché para que los datos puedan reutilizarse en invocaciones posteriores de la ruta de OpenCL. De forma predeterminada, los datos en caché de OpenCL se almacenan en $HOME/.cache/ImageMagick en Linux y en macOS, o en %LOCALAPPDATA%\ImageMagick en Windows. Para ejecutar estas pruebas por primera vez, use el comando siguiente:
MAGICK_OCL_DEVICE=true magick sample.jpg -blur 0x5 null:
En Windows, la parte MAGICK_OCL_DEVICE=true debe eliminarse y el comando set MAGICK_OCL_DEVICE=true debe ejecutarse antes de ejecutar el comando anterior para habilitar las operaciones de OpenCL.
Para cambiar el directorio de caché, configure la variable de entorno MAGICK_OPENCL_CACHE_DIR. ImageMagick es capaz de detectar cambios de hardware, actualizaciones de controladores y nuevas fuentes de núcleos, y volver a ejecutar la configuración y la prueba de calibración. También puede forzar a ImageMagick a volver a ejecutar el proceso eliminando el contenido del directorio de caché.
Además de las variables de entorno mencionadas anteriormente, ImageMagick proporciona un conjunto de API que permiten a los desarrolladores obtener un control más detallado de la aceleración por OpenCL. Por ejemplo, use la función InitializeOpenCL() para inicializar el entorno OpenCL:
clEnv=GetCurrentOpenCLEnv();
if (InitializeOpenCL(clEnv,exception) == MagickFalse)
{
/* looks like OpenCL is not supported */
}