Para medir la potencia de un procesador se suele contabilizar el número de operaciones (por ejemplo de coma flotante, o sea, de números decimales) que realiza por segundo. Cuantas más operaciones pueda realizar en un segundo, más potente será y más rápido correran las aplicaciones que ejecuten (obviando que pueden haber otros factores que limiten la ejecución de la aplicación como los accesos a memoria u otros).
Por lo tanto definimos los FLOPS de un procesador como la cantidad de operaciones de coma flotante que realiza en un segundo (del inglés FLoating point Operations Per Second). Como habitualmente es un valor muy alto, usaremos las abreviaturas habituales como G, que significa "Giga", o sea 1000 millones de veces algo. Así 1 GFLOPS equivale a 1000 millones de FLOPS.
A lo que quiero llegar es que los procesadores actuales, por ejemplo un Intel Core 2 DUO apenas si llega (teóricamente) a los 50 GFLOPS.
Si ahora nos fijamos en las tarjetas gráficas, éstas tienen a su vez un procesador conocido como GPU (o sea, procesador gráfico o Graphic Processor Unit). Pues bien, resulta que la capacidad de cálculo de las GPUs modernas alcanza los 500GFLOPS (en la tarjeta GeForce 8800GTX de NVIDIA por ejemplo). ¿Nadie ha pensado en sacar partido de semejante potencia para otras cosas que no sea jugar a videojuegos? Pues ahí es donde aparece NVIDIA con su arquitectura CUDA.


La arquitectura CUDA permite abrir al programador la tarjeta gráfica y así poderla utilizar como una especie de co-procesador matemático. Antes de CUDA, si alguien quería hacer algo que no fuesen operaciones gráficas en la GPU tenía que pelearse con interfaces como OpenGL o DirectX y asumir las restricciones de la GPU. Ahora con CUDA podemos programar aplicaciones sobre la GPU en lenguaje C. Vamos a ver en qué consiste.
Programación CUDA
Para programar en CUDA hay que realizar un enfoque diferente del problema a resolver, explotando sobre todo el paralelismo de datos. Es decir, los problemas en que tengamos una única aplicación (o secuencia de código) que se realiza sobre muchos datos diferentes son ideales para explotar el paralelismo que ofrece CUDA. Imaginemos el producto de dos matrices A y B, la secuencia de operaciones a realizar (sumas y productos para grupos de elementos de las dos matrices) es siempre la misma aunque actuando sobre datos diferentes. A esta aplicación básica la llamaremos kernel.
Ahora la idea es aplicar ese kernel a todos los datos en paralelo. La ejecución del kernel sobre unos datos concretos se conoce como thread (o hilo, en castellano). En el ejemplo de multiplicación de dos matrices, podemos hacer que cada thread se encargue de calcular un elemento de la matriz resultado, C. Por tanto, el número de threads a procesar será igual al número de elementos de C.
A su vez, estos threads los podemos agrupar en bloques. Volviendo al ejemplo de la multiplicación de dos matrices, podemos hacer que cada bloque se encargue de calcular una submatriz de C. Los threads dentro de un mismo bloque tienen puntos de sincronización.
Hardware CUDA
La tarjeta gráfica se presenta como un procesador masivamente paralelo. Consta de varios multiprocesadores, cada uno de los cuales está formado a su vez por varios procesadores. Estos procesadores son los que se encargan de ejecutar los threads que vienen agrupados en bloques. Así se estará ejecutando la misma aplicación (kernel) en todo el multiprocesador pero actuando sobre datos diferentes.
Si nos fijamos en la tarjeta GeForce 8800GTX, ésta viene con 16 multiprocesadores, cada uno de los cuales lleva 8 procesadores. ¡Por tanto estamos hablando de 128 cores para procesamiento paralelo!
Transparencias sobre CUDA en castellano
Al final preparé unas transparencias en castellano sobre CUDA para mostrarlas en clase. Por si son de utilidad para alguien, aquí están en PDF:
Más sobre CUDA
Bueno, esto es sólo una brevísima introducción a la nueva tecnología que está causando furor últimamente. Si se quiere saber más, aquí hay una lista de enlaces imprescindibles. Están en inglés, lo siento :-)


4 comentarios:

  1. Anónimo dijo...

    Hola, me interesaria mucho poder tener acceso al enlace "transparencias cuda castellano", por algún motivo el enlace es erróneo.

    Muchas gracias  

  2. Gaspar Mora dijo...

    Si te urge ponme un correo a la dirección que tienes ahí arriba y te lo envío en un adjunto.

    En cualquier caso ya estoy trabajando en otro alojamiento para los ficheros, pero aún puede tardar unos días.  

  3. Gaspar Mora dijo...

    Enlace arreglado  

  4. Roberto Taylor dijo...

    A mi no me funciona el enlace de las transparencias en castellano.