CUDA

Ya hemos hablado en entradas anteriores de GPGPU (General Purpose GPU) o lo que es lo mismo, de la posibilidad de utilizar el procesador de las tarjetas gráficas (la GPU) para acelerar la ejecución de aplicaciones de propósito general que en principio nada tienen que ver con el tipo de programa para el que en principio está diseñada una GPU.

La GPGPU tradicional, basada en la utilización de APIs gráficas como Open GL o DirectX y los lenguajes de programación de shaders (el más conocido es Cg) sufría de las importantes limitaciones causadas por:
  • La utilización de los procesadores de fragmentos pero no de los de vértices desaprovechaba muchos recursos de la GPU.
  • La utilización de las texturas para almacenar los datos con los que se opera limita los tipos de datos, los modos de direccionamiento, obliga a “rellenar” en algunos casos, etc.
  • No existían operaciones para trabajar con números enteros o para operar a nivel de bit.

Con la aparición de las arquitecturas unificadas de NVidia (a partir de la serie 8 de GPUs), este fabricante propone la utilización de CUDA, Computer Unified Device Architecture, para intentar limitar estas superaciones.

¿Qué es CUDA?, del que tanto se escucha hablar últimamente. Simplificando, se trata de una arquitectura HW y SW que trata a la GPU (device) como un coprocesador de la CPU (host), que incorpora su propia memoria principal y que tiene la capacidad de ejecutar multitud de threads simultáneamente. Estos threads son diferentes de los que estamos habituados a manejar en la CPU, ya que son tremendamente ligeros y su creación, cambios de contexto y destrucción casi no consumen tiempo.

La idea es que los códigos se ejecuten en la CPU y cuando lleguen a partes en las que sea posible explotar el paralelismo de datos, se envíen los kernels de código de estas partes a la GPU para que pueda acelerar su ejecución. Esto hace posible mejorar increíblemente los tiempos de ejecución en multitud de aplicaciones de cómputo científico, simulación, procesado de imagen, etc, llegando incluso a conseguir cumplir restricciones de tiempo real antes inalcanzables.

CUDA posee su propio driver, lenguaje y entorno de programación. El driver permite la carga y puesta en ejecución de los programas, por lo tanto ya no es necesaria una API gráfica (aunque se pueden compartir datos con OpenGL y DirectX). Además proporciona una ayuda importante en la gestión de la jerarquía de memoria completa del sistema. Por ejemplo, optimizando la carga y descarga en background de datos hacia/desde la memoria de vídeo.

En cuanto al lenguaje y al entorno de programación, son muy similares a los empleados para programar en C, de hecho, se plantea como una serie de extensiones a este lenguaje, por lo que es mucho más sencillo aprender a programar la GPU que antiguamente. Eso sí, es necesario tener unos "rudimentos" de programación paralela para poder sacar partido de todos los recursos disponibles en la GPU.
aa

2 comentarios:

Mauricio Mercado dijo...

Hola, hay alguien en Buenos Aires que enseñe CUDA? Saludos.

Mauricio Mercado dijo...

Hola, hay alguien en Buenos Aires que enseñe CUDA? Saludos.