| Artículos | 01 ENE 2010

OpenCL

Tags: Histórico
API para programación paralela de cualquier tipo de procesador
Eugenio Barahona.
Últimamente se aprecia una evolución mucho más rápida del hardware de los procesadores gráficos que el de los microprocesadores de propósito general. Esto se debe, fundamentalmente, a la naturaleza eminentemente paralela de las tareas que ejecuta una GPU, algo que no tiene porqué ser así necesariamente en el caso del software que debe ejecutar un microprocesador convencional.

Últimamente se aprecia una evolución mucho más rápida del hardware de los procesadores gráficos que el de los microprocesadores de propósito general. Esto se debe, fundamentalmente, a la naturaleza eminentemente paralela de las tareas que ejecuta una GPU, algo que no tiene porqué ser así necesariamente en el caso del software que debe ejecutar un microprocesador convencional.
La misión principal de una GPU es realizar los cálculos necesarios para generar los pixeles que forman una escena tridimensional. Esta función suele tomar como parámetros una serie de coordenadas correspondientes a los vértices de la geometría a visualizar y una serie de objetos, como por ejemplo texturas, que se aplican a los polígonos durante el proceso de render. Este tipo de trabajos puede acelerarse simplemente añadiendo al hardware un cada vez mayor número de procesadores gráficos que se encargan de procesar en paralelo la geometría que debe renderizarse. La continua mejora de los procesos de fabricación de semiconductores hace que añadir más procesadores a una GPU sea una tarea relativamente sencilla.
Estas mejoras constantes del hardware gráfico han llevado a los fabricantes de este tipo de productos a desarrollar API que permiten usar la potencia de la GPU para ejecutar operaciones que no necesariamente son de tipo gráfico, pero que una GPU puede acelerar de forma notable debido a la naturaleza paralela de las operaciones a realizar. Los principales fabricantes de procesadores gráficos han desarrollado sus propias interfaces de programación, pero lo que no existía hasta ahora era una API independiente de cualquier fabricante de hardware.

Open CL
OpenCL (Open Computing Language) es precisamente eso, una API que posibilita el desarrollo de aplicaciones que aprovechen la potencia del hardware gráfico para realizar tareas cuyo objetivo no sea necesariamente la generación de gráficos 3D. Pero, además, hace también posible el desarrollo de software para procesadores digitales de señal, lo que puede ser interesante en el caso de algunos tipos de plataformas, o incluso para coprocesadores, como por ejemplo el procesador Cell (este chip se ha usado en algunos portátiles como coprocesador).
Esta nueva herramienta de programación está formada por dos elementos principales: una API para coordinar la ejecución de software entre procesadores de diversos tipos y un lenguaje de programación independiente de la plataforma. Este lenguaje de programación se basa en el estándar ISO C99, si bien se le han añadido una serie de extensiones para soportar paralelismo. Al tratarse de una herramienta multiplataforma se ha definido un perfil específico para plataformas con capacidades reducidas, como dispositivos embebidos y portátiles (teléfonos, consolas portátiles de videojuegos…). También se ha tenido en cuenta la integración de OpenCL con las API de tipo gráfico, de forma que sea sencillo interactuar desde OpenCL con otras partes de una aplicación que usen OpenGL o cualquier otra API gráfica.
OpenCL proporciona una abstracción de bajo nivel del hardware disponible en el sistema y el marco de trabajo necesario para exponer la gran mayoría de los detalles del hardware subyacente. Con este fin la arquitectura de OpenCL expone al programador cuatro modelos que describiremos a continuación.

Modelo de plataforma
OpenCL divide la plataforma en un host, o anfitrión, que está conectado a uno o más dispositivos OpenCL. Cada uno de estos dispositivos se divide en una o más de una unidades de computación, dividiéndose cada una de ellas en uno o más de un elemento de procesamiento. Los cálculos que realiza un dispositivo OpenCL tienen lugar en los elementos de procesamiento. De esta forma, una aplicación que use OpenCL se ejecutaría en el host siguiendo las reglas que marque la plataforma de dicho host. Dicha aplicación enviaría comandos para ejecutar cálculos en los elementos de procesamiento de un dispositivo OpenCL. Los elementos de procesamiento de una unidad de computación ejecutarían un único flujo de instrucciones comportándose como elementos de una arquitectura SIMD (Single Instruction Multiple Data) en la que todos los elementos de procesamiento ejecutan el mismo flujo de instrucciones, o bien como unidades de tipo SPMD de forma que cada elemento disponga de su propio contador de programa y ejecute su código de forma independiente al resto de elementos de procesamiento.

Modelo de ejecución
La ejecución de una aplicación OpenCL tiene dos partes: los kernel que se ejecutan en uno o más dispositivos OpenCL y un programa que se ejecuta en el host encargándose de definir el contexto en que se ejecutan los kernel y de administrar la ejecución de los mismos. El modelo de ejecución se define fundamentalmente por cómo se ejecutan los kernel.
Cuando el host inicia la ejecución de un kernel, crea un espacio de índices. Para cada punto de dicho espacio de índices se ejecuta una instancia del kernel en cuestión. A cada instancia del kernel se le denomina elemento de trabajo y se le identifica por su punto dentro del espacio de índices, el cual proporciona al elemento de trabajo un identificador global único. Cada elemento de trabajo de un kernel ejecuta exactamente el mismo código, pero las transiciones que puede experimentar dicho código y los datos sobre los que trabaja pueden variar por cada instancia del kernel.
Los elementos de trabajo, o instancias del kernel, se organizan en grupos de trabajo. Estos grupos hacen posible descomponer el espacio de índices en distintos grupos. Los elementos de trabajo englobados dentro de un grupo de trabajo tendrán asignado un identificado local dentro de dicho grupo, además de su identificador global. De esta forma, es posible identificar una instancia del kernel mediante su identificado global o bien mediante la combinación del identificador del grupo de trabajo del que forman parte y su identificador local dentro de dicho grupo.
Es misión del anfitrión definir el contexto en que se ejecutan los kernels. Dicho contexto está formado por la colección de dispositivos OpenCL que se encuentran conectados al anfitrión, los kernels (que son las funciones que se ejecutan en los dispositivos OpenCL), los objetos de programa (el código fuente y ejecutable mediante los que se implementan los kernels) y los objetos de memoria (conjunto de objetos visibles tanto para el anfitrión como para los dispositivos OpenCL y que contienen datos que pueden manipular las instancias de los kernels).
El contexto lo crea y lo manipula el anfitrión a través de las llamadas que efectúe a las distintas funciones de la API de OpenCL. También es función del anfitrión la creación de una cola de comandos mediante la que se coordina la ejecución de los kernels en los dispositivos. Existen tres tipos de comandos que el anfitrión puede enviar: comandos de ejecución de kernels (provocan la ejecución de un kernel en un elemento de procesamiento de un dispositivo OpenCL), comandos de memoria (pe

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información