Hace 15 años | Por --29106-- a anandtech.com
Publicado hace 15 años por --29106-- a anandtech.com

AnandTech explica de forma sencilla qué es OpenCL y por qué es importante. Esencialmente, es una tecnología fácil de usar que permite aprovechar la potencia de cálculo de las tarjetas gráficas y procesadores multinúcleo para ejecutar aplicaciones paralelas. (Traducción en los primeros comentarios).

Comentarios

D

Página 1 (Introducción al paralelismo)
-----------------------------------------------------

A principios de Diciembre, el Grupo Khronos publicó la especificación de OpenCL. Khronos es un consorcio de empresas de la industria de semiconductores y dispositivos móviles. El grupo está enfocado en crear y administrar estándares para gráficos, multimedia y computación paralela en un gran abanico de productos, desde dispositivos móviles a ordenadores de sobremesa y estaciones de trabajo. Parte de la la labor de Khronos es organizar el estándar OpenGL y todos sus parientes con el prefijo Open-, de modo que la nomenclatura tiene cierto sentido.

El objetivo de OpenCL es hacer ciertos tipos de programación paralela más sencillos y proveer la habilidad de ejecutar código paralelo de manera portable y acelerada por hardware. Suena complicado, pero simplemente significa que OpenCL dará a los programadores un conjunto común de herramientas fáciles de usar y así aprovechar cualquier dispositivo que tenga un driver de OpenCL (procesadores generales, tarjetas gráficas, etc) para ejecutar código concurrentemente.

Aunque ya hay herramientas disponibles que permiten procesamiento en paralelo, éstas estan mayormente dirigidas a paralelismo de tareas. El modelo de paralelismo de tareas está formado alrededor de la idea de que el paralelismo se puede extraer construyendo hilos (threads) y dándole a cada uno cierta labor que realizar. Aunque la mayor parte de la programación concurrente está basada en este modelo, hay otras forma de paralelismo que se puede beneficiar enormemente con otro modelo de ejecución.

En contraste al modelo de paralelismo de tareas, el paralelismo de datos ejecuta el mismo bloque de código sobre cientos (o miles, o millones) de elementos de datos. Mientras que mi videojuego puede tener unos pocos hilos para gestionar la Inteligencia Artificial, simulaciones físicas, audio, estado del juego, visualización y posiblemente otras labores si estoy dispuesto, un programa con paralelismo de datos para hacer algo como procesamiento de imágenes puede lanzar millones de hilos, uno para cada pixel de la imagen. De modo en que estos hilos están agrupados y organizados dependerá tanto de la forma en que haya escrito el programa como el hardware en el que se esté ejecutando este programa.

Como hemos dicho muchas veces en el pasado, los algoritmos gráficos son casi infinitamente paralelizables. Los millones de píxeles en la pantalla pueden todos actuar de manera (casi) totalmente independiente de cada uno. Un hilo ligero se ocupa de toda la computación necesaria para cada píxel particular. Cuanto más pequeños se vuelven los píxeles y tenemos más de ellos en cada pantalla, ganamos más oportunidad de hacer trabajo en paralelo. Las tarjetas gráficas son los mejores motores de computación para aprovechar paralelismo de datos que existen actualmente. Y una vez tengamos drivers de OpenCL disponibles, los programadores tendrán acceso a toda esa potencia de cálculo para resolver cualquier problema con paralelismo de datos que deseen.

Ahora bien, no tiene sentido ejecutar un procesador de textos en tu tarjeta gráfica, puesto que simplemente no hay suficiente sucediendo al mismo tiempo para aprovechar el hardware. El rendimiento de una GPU ejecutando un sólo hilo no es muy bueno, sobre todo si lo comparamos con una CPU, e intentar ejecutar en la GPU código que no sea masivamente paralelo no dará buenos resultados. Sin embargo, hay cantidad de aplicaciones que pueden beneficiarse de la GPU. Básicamente cualquier procesamiento multimedia se puede beneficiar, desde codificación, edición y decodificación de audio y video a manipulación de imágenes, e incluso acelerar cómputos matemáticos (Maple, Matlab, Mathematica). También hay algunos algoritmos criptográficos y de compresión que se pueden ejecutar en paralelo.

Las mejores aplicaciones para computación con paralelismo de datos probablemente no se hayan considerado seriamente todavía, puesto que se necesita tiempo desde que se dispone de las herramientas hasta que el producto está acabado; ya no digamos para concebir ideas que hasta ahora no se han llevado a cabo por la falta de hardware donde ejecutarlas. Pero OpenCL no es un milagro que va a acelerarlo todo. Más bien, es un vehículo a través del cual los programadores serán capaces de resolver ciertas tareas un orden de magnitud más rápido usando hardware que ya está disponible en la mayoría de ordenadores, lo cual es ciertamente un avance. Pero veámoslo más de cerca.

D

Página 2 (Motivación para crear OpenCL)
----------------------------------------------------------
¿Por qué es difícil la computación en paralelo?

Hay multitud de problemas con la computación en paralelo. Dividir el problema en pedazos es generalmente el paso más importante y más difícil, sobre todo cuando el paralelismo no es evidente. Como estamos enraizados en un mundo de programación secuencial, llevar a cabo la división de un algoritmo en tareas que se puedan ejecutar concurrentemente es difícil. Puede no sólo requerir reorganizar el código, sino incluso rediseñar completamente la forma en la que resolvemos un problema.

Incluso en problemas que son fácilmente paralelizables, explotar el paralelismo puede ser complejo. Incluso cuando conoces el mejor y más rápido algoritmo para resolver cierto problema en paralelo, no es siempre fácil convertirlo en un programa eficiente. Por ejemplo, si quiero multiplicar dos matrices de 100.000x100.000 elementos, no puedo simplemente lanzar todos los hilos que serían necesarios. Si estuviese usando hilos POSIX para calcular un elemento de la matríz resultante con cada uno, invertiría más tiempo creando los hilos y racionando los recursos que realmente haciendo el cómputo en sí. Tengo que tomar los recursos de los que dispongo y usarlos de la mejor manera posible. Aunque sé cómo resolver en paralelo un producto matricial, tengo que ser cuidadoso a la hora de dividir el problema y no puedo aprovechar todo el paralelismo posible debido a las herramientas de las que dispongo (hilos POSIX en este caso).

También estamos limitados en recursos hardware. Con sólo un puñado de núcleos disponibles en nuestra CPU, incluso si no hubiese ninguna sobrecarga software, no podríamos acelerar la ejecución más allá del número de núcleos de los que disponemos. Esto no sólo significa que no podemos beneficiarnos de tareas masivamente paralelas, sino que además desanima a los programadores a hacer el esfuerzo de expresar sus algoritmos de forma paralela.

¿Cómo ayuda OpenCL?

¿Qué pasaría si no sólo tuviésemos a nuestra disposición cientos de recursos hardware capaces de ejecutar miles de hilos concurrentemente sin ningún coste adicional? De hecho ya lo tenemos: se llama una tarjeta gráfica.

La manera en que realizas cómputos en OpenCL es escribiendo tu algoritmo en una función especial, llamada un kernel, que se puede ejecutar millones de veces sobre diferentes conjuntos de datos sin necesidad de administrar los hilos tú mismo. Lo único que tienes que hacer es indicar el número de elementos que deseas computar y el driver se ocupará de decidir la mejor forma de aprovechar la tarjeta gráfica o las CPUs disponibles en tu ordenador.

D

Algunas preguntas frecuentes con respuestas. Si tienes alguna duda, pregunta y trataré de responder en los comentarios.

1- ¿En qué se diferencia OpenCL de CUDA?

OpenCL es un estándar abierto respaldado por las mayores empresas del sector, incluyendo AMD, Apple, IBM, Intel y Nvidia. CUDA es una tecnología propietaria de Nvidia.

2- ¿Tiene algo que ver con OpenGL?

Está relacionado con OpenGL en tanto que el Grupo Khronos es responsable de definir ambos estándares. OpenGL es una API para acelerar la visualización de contenidos 3D, tales como juegos y programas de CAD. OpenCL permite ejecutar algoritmos paralelos usando tanto la CPU como la GPU (tarjeta gráfica).

3- ¿Es OpenCL software libre?

OpenCL es una especificación, igual que OpenGL. Varios fabricantes de microprocesadores y tarjetas gráficas están trabajando en implementaciones (es decir, drivers) que se ajustan a este estándar. No tengo noticia de ninguna implementación que sea software libre.

4- ¿Tiene algo que ver con Apple?

Sí. Apple propuso al Grupo Khronos un boceto de OpenCL en Junio de 2008 para mejorarlo y estandarizarlo. De acuerdo a las noticias de prensa de Apple, OpenCL es un elemento fundamental de la próxima versión de OS X, Snow Leopard.

5- ¿En qué se diferencia usar OpenCL de programar usando hilos, OpenMP o MPI?

Programar gestionando hilos a mano es complejo, es fácil cometer errores, y no aprovecha ese gran procesador que tienen muchos ordenadores: la tarjeta gráfica.

OpenMP simplifica mucho la gestión de los hilos, pero tampoco permite hacer uso de la tarjeta gráfica.

MPI se basa en un paradigma de paso de mensajes mientras que OpenCL permite básicamente lanzar tareas, unidas entre sí por un grafo de dependencias explícito. Cada una de estas tareas típicamente expresa paralelismo de datos y se ejecuta en un gran número de hilos. El programador puede elegir si desea ejecutar cada tarea en la CPU o en la CPU (de momento no hay balanceo de carga automático).

D

#3 No sé de ninguna implementación, pero suena a un buen proyecto

Creo que pasará al menos un año hasta que la gente empiece a dar con usos innovadores para OpenCL. De momento quienes parecen más interesados son la gente que trabaja en supercomputación, especialmente basada en procesadores Cell, porque son complicados de programar a mano y se ajustan muy bien al modelo de OpenCL.

D

¿pero sirve para hackear la wifi del vecino o no? lol