CUDA, la bestia de nVidia: Aproximación



En los últimos seis años, hemos sido testigos de uno de los acontecimientos más excitantes desde la perspectiva del desarrollador de los últimos tiempos, el paso de los sistemas monoprocesador a los sistemas de Multi Procesamiento Simétrico (SMP). Hoy en día cualquier sistema doméstico dispone de varios núcleos con capacidad absoluta para el SMP.

Hemos presenciado un aumento vertiginoso del rendimiento de los ordenadores de uso personal desde que los fabricantes decidieron incrementar el número de núcleos de los mismos en lugar de intentar seguir aumentando la velocidad del reloj que obviamente presenta problemas insalvables.

En mitad de este escenario de “multicores“ y “multiprocesamiento“ hemos visto el alzamiento del uso de las GPU para computación de propósito general (GPGPU) y como máximo exponente de ello, podemos contar con la tecnología CUDA, la bestia de nVidia.

¿Qué es CUDA?

En noviembre del 2006, nVidia sacó al mercado la primera GPU con soporte para DirectX 10, la GeForce 8800 GTX. La nueva GeForce 8800 GTX fue a su vez, la primera GPU construida con la arquitectura de cálculo en paralelo CUDA. La nueva arquitectura incluía muchos componentes diseñados específicamente para que la computación an nivel de GPU soportara la computación de carácter general de forma trivial.

La arquitectura CUDA

La arquitectura de CUDA es realmente particular en muchos aspectos. A diferencia de otras GPUs anteriores, CUDA no solo divide los recursos de computación en vertex y pixel shaders, además añade un pipeline para shaders unificado que permite a cada unidad aritmético lógica (ALU) en el chip ser “transformada” por una aplicación para efectuar operaciones de cómputo de propósito general.

Puesto que nVidia pretendía que esta nueva generación de procesadores gráficos pudieran ser usados para computación de propósito general, las unidades aritmético lógicas fueron construidas cumpliendo las especificaciones del IEEE para las operaciones de precisión simple aritmética de punto flotante.

Por ello, estas nuevas GPUs fueron diseñadas con la idea de tener un juego de instrucciones que soportara la computación de propósito general por encima de un conjunto específico para gráficos. Esto además ha generado no pocas críticas hacia el uso de las GPUs con un propósito para el que no fueron diseñadas inicialmente.

Más cambios en la arquitectura son por ejemplo, la posibilidad de cada unidad de procesamiento de la GPU de leer o escribir de forma arbitraria en la memoria además de poder acceder a un cache de memoria gestionado por software conocido como “memoria compartida“.

Con todos estos cambios en su nueva arquitectura, nVidia fabricó un chip gráfico capaz de realizar operaciones de propósito general de forma excelente y de ofrecer un rendimiento brutal en operaciones de tratamiento gráfico tradicional.

Usando CUDA

Una GPU solo sabe hacer una cosa, ofrecernos un color para cada pixel de nuestra pantalla utilizando unidades aritméticas programables conocidas como pixel shaders. Estos pixel shaders utilizan una posición (x, y) de la pantalla además de alguna información adicional que combinan varias entradas de datos utilizados para computar el resultado del color final.

Esta información adicional puede ser entradas de color, coordenadas de texturas o cualquier otro atributo que pueda ser pasado al shader cuando se ejecute. Resulta que esas entradas de datos no tienen por que ser “color” y pueden ser cualquier tipo de datos. El único problema es que es necesario utilizar una librería gráfica como OpenGL GLSL o DirectX HLSL para poder introducirlos.

Lo que hizo nVidia (a parte de solucionar el problema de las operaciones de punto flotante que en otras GPUs no se puede afirmar que se harán de la forma esperada por ciertas incompatibilidades como el peso de las variables de coma flotante por ejemplo) fue utilizar el estándar C y añadirle un pequeño conjunto de palabras clave con el propósito de añadir algunas características típicas de la arquitectura CUDA.

A los pocos meses del lanzamiento de la GeForce 8800 GTX, nVidia hizo pública la primera versión de un compilador para el lenguaje CUDA C. Así, CUDA C se convirtió en el primer lenguaje específicamente diseñado por una empresa de desarrollo de gráficas para facilitar la computación de carácter general en sus chips.

nVidia también provee de los controladores necesarios para explotar el enorme potencial de la arquitectura de computación masiva CUDA. Los programadores ya no necesitamos saber nada de OpenGL o DirectX para poder hacer uso de ella y nos abrió una puerta que para la mayoría de nosotros estaba cerrada.

Conclusión

En esta aproximación a CUDA hemos hablado sobre su nacimiento y su propósito, hemos hecho una pequeña introducción en su historia y hemos visto como nVidia ha superado algunos de los problemas tradicionales de la computación de propósito general en las GPUs creando herramientas y controladores para su uso por parte de la comunidad.

Mi GPU, una nVidia 480 GTX dispone de 480 cores para la arquitectura CUDA. En próximas entregas en las que hablare sobre GPGPU con CUDA veremos como sacarle un poco de jugo a esos cores.


Más Información | ¿Qué es CUDA?

Portada de Genbeta