Halide, un lenguaje para procesamiento de imágenes

En este mundo moderno hay herramientas para casi cualquier actividad. La programación no está exenta de esto y no es de extrañarse que ahora haya salido a la luz pública Halide, un lenguaje de código abierto nuevo, diseñado específicamente para procesamiento de imágenes y fotografía digital. No solamente hace más fácil implementar algoritmos fotográficos, sino que también puede hacer que corran más rápido usando paralelización semiautomática.

Los algoritmos que trabajan con imágenes son ideales para implementarlos de forma paralela, pues usualmente trabajan con bloques pequeños aislados de datos (por ejemplo, regiones en la pantalla), lo que significa que pueden paralelizarse sin mayores dificultades. El único problema es que incluso la conversión de código serial a código en paralelo no es tan simple si consideramos las arquitecturas de CPUs y GPUs existentes.

Halide es la respuesta del Massachusetts Institute of Technology (MIT, con la ayuda de Stanford y Adobe), en forma de un lenguaje funcional que permite especificar los algoritmos de procesamiento de imágenes, en la mayoría de los casos, vía los métodos de convolución (que son los que definen finalmente los filtros que vemos en programas como Photoshop, de hecho, son matrices de números que se suman, multiplican o restan, sobre los pixeles de regiones de imágenes). La ventaja es que los métodos de convolución ya hacen la tarea y no hay que entender siquiera cómo trabajan, solamente se hacen las llamadas a esas rutinas en caso necesario.

El lenguaje tiene una segunda sección que da una descripción general de cómo el algoritmo debería ser paralelizado. No solamente describe cómo el algoritmo debería dividirse entre los elementos a calcular, sino cómo organizar los datos para mantener el flujo del procesamiento corriendo con la máxima eficiencia.

Comparado con una implementación no paralelizable en C++, la versión de un programa para desenfocar una imagen (hacerla más difusa a la vista), corrió en 0.9 msegs. La versión de C++ tomó 9.94 msegs. Una versión optimizada, paralelizable de ese mismo programa, corrió como la versión de Halide, pero llevó más tiempo construirla. Por ejemplo, un filtro Laplaciano (que no es otra cosa que una matriz que saca promedios de valores de pixeles en regiones específicas de una imagen), le llevó 335 msegs y 262 líneas de código en C++/OpenMP, pero en Halide se hizo el trabajo en 158 msegs y 79 líneas. Normalmente los programas en Halide ocupan la tercera parte de los que se hacen en C++. El compilador genera código para x86, ARM y PTX, usando el compilador LLVM.

Sin duda la idea no solamente puede beneficiar a quienes trabajan con imágenes, sino que es un enfoque interesante al paralelismo, el cual podría extenderse a otras áreas. La especificación de un algoritmo y cómo las diferentes variables pueden ser tratadas en la paralelización parece ser un buen compromiso entre los métodos manuales y automáticos para estos procesos.

Referencias: Sitio web de Halide Web MIT

Deja un comentario