Ejecución paralela (OpenMP)
Muchos de los algoritmos internos de ImageMagick están paralelizados con hilos para aprovechar las mejoras de velocidad que ofrecen los procesadores multinúcleo y OpenMP. OpenMP es una especificación de API para programación paralela. Si tu compilador admite las directivas de OpenMP (p. ej. gcc, Visual Studio 2005), ImageMagick incluye automáticamente la compatibilidad. Para verificarlo, busca la característica OpenMP de ImageMagick con este comando:
$ magick identify -version
Version: ImageMagick 7.0.10-50 2021-01-04 Q16 https://imagemagick.org
Copyright: © 1999-2021 ImageMagick Studio LLC
Features: OpenMP(4.5)
Con OpenMP habilitado, la mayoría de los algoritmos de ImageMagick se ejecutan en paralelo en todos los núcleos de tu sistema. ImageMagick normalmente divide el trabajo de modo que cada hilo procese 64 filas de píxeles. A medida que se completan las filas, OpenMP asigna más bloques de filas de píxeles a cada hilo hasta que el algoritmo finaliza. Por ejemplo, si tienes un sistema de cuatro núcleos e intentas redimensionar una imagen, el redimensionado se realiza en 4 núcleos (8 si el hyperthreading está habilitado).
Puedes aumentar aún más el rendimiento reduciendo la contención de bloqueos con la biblioteca de asignación de memoria tcmalloc. Para habilitarla, añade --with-tcmalloc a la línea de comandos de configure cuando compiles ImageMagick.
Los peligros de la ejecución paralela
Puede ser difícil predecir el comportamiento en un entorno paralelo. El rendimiento podría depender de varios factores, como el compilador, la versión de la biblioteca OpenMP, el tipo de procesador, el número de núcleos, la cantidad de memoria, si el hyperthreading está habilitado, la combinación de aplicaciones que se ejecutan simultáneamente con ImageMagick o el algoritmo de procesamiento de imágenes concreto que utilices. La única forma de estar seguro del rendimiento óptimo, en cuanto al número de hilos, es realizar pruebas de rendimiento (benchmark). ImageMagick incluye el escalado progresivo de hilos al hacer el benchmark de un comando y devuelve el tiempo transcurrido y la eficiencia para uno o más hilos. Esto puede ayudarte a identificar cuántos hilos son los más eficientes en tu entorno. Aquí tienes un ejemplo de benchmark para los hilos 1-8:
$ magick -bench 40 model.png -sharpen 0x1 null:
Performance[1]: 40i 0.712ips 1.000e 14.000u 0:14.040
Performance[2]: 40i 1.362ips 0.657e 14.550u 0:07.340
Performance[3]: 40i 2.033ips 0.741e 14.530u 0:04.920
Performance[4]: 40i 2.667ips 0.789e 14.590u 0:03.750
Performance[5]: 40i 3.236ips 0.820e 14.970u 0:03.090
Performance[6]: 40i 3.802ips 0.842e 15.280u 0:02.630
Performance[7]: 40i 4.274ips 0.857e 15.540u 0:02.340
Performance[8]: 40i 4.831ips 0.872e 15.680u 0:02.070
Un mejor rendimiento se correlaciona con valores más altos de IPS (iteraciones por segundo). En nuestro ejemplo, 8 núcleos son lo óptimo. Sin embargo, en ciertos casos podría ser óptimo fijar el número de hilos en 1 (p. ej. -limit thread 1) o deshabilitar OpenMP por completo. Para deshabilitar esta característica, añade --disable-openmp a la línea de comandos de tu script configure y luego vuelve a compilar y reinstalar ImageMagick.