sábado, 26 de noviembre de 2011

CUDA: Un lenguaje de programación para cálculo científico.



1. ¿Que es CUDA?

CUDA proviene de las siglas de Compute Unified Device Architecture (Arquitectura de Dispositivos de Cómputo Unificado), y podemos pensar en este como una variante de los lenguajes de programación C/C++, desarrollado con el propósito de aprovechar las capacidades de cálculo de los procesadores en tarjetas gráficas (GPU's) nVidea, aprovechándose de los multiplicidad de núcleos en estos para utilizar el paradigma de la programación en paralelo.

2. ¿Solo una variante de C/C++?

Aunque el compilador de CUDA (nvcc) como hemos mencionado anteriormente, es muy parecido a C (gcc en linux), actualmente existen usa serie de wrappers (adaptadores de código) para utilizar CUDA desde python (PyCUDA), Fortran y Java, lo que abre ampliamente su capacidad de difusión en las comunidades de programadores.

3. ¿Cuales son las ventajas de programar en CUDA?

Puesto que la filosofía de CUDA radica en la explotación del paralelismo que ofrecen los múltiplos nucleos en las GPU's (nVidea), lo que se traduce en el lanzamiento de un gran número de hilos simultaneamente, tenemos que CUDA es realmente eficiente en el análisis y simulación de sistemas de muchas partículas, y en general, en sistemas complejos, donde el número de agentes interactuando junto con la complejidad de sus interacciones hacen que el paralelismo como paradigma de programación sea el mas adecuado. Un ejemplo de esto puede verse en el siguiente video, en donde se muestra la simulación de multiples agentes interactuando (entes biológicos), lo que sería imposible realizar con un computador estándar sin GPU's.



Más aún, en algoritmos que requieren múltiples repeticiones para conseguir el resultado buscado, p.e., algoritmos de optimización combinatoria como el algoritmo de recosido simulado, puede ser de mucha ayuda, colocando en lugar de varias repeticiones, muchas simulaciones en paralelo con condiciones iniciales aleatorias.

4. ¿Como funciona CUDA y en general los lenguajes orientados al aprovechamiento de los procesadores en las GPU's?

De manera simple, puede resumirse su funcionalidad en los siguientes 4 pasos:

a. Se copian los datos de la memoria principal a la memoria de la GPU
b. La CPU encarga el proceso a la GPU
c. La GPU lo ejecuta en paralelo en cada núcleo.
d. Se copia el resultado de la memoria de la GPU a la memoria principal



5. ¿Es este tipo de sistemas rentable?

Los costos de un servidor de cálculo científicos son exorbitantes, superan generalmente los 50.000 $ sumando a ello, el coste de refrigerantes, y las estaciones desde la que se podrá acceder a este tipo de servidor. Mas costoso aún es construir un cluster descente, pues el número de equipos necesarios para obtener resultados descentes es alto, además que dichos equipos deben ser suficientemente buenos para que el rendimiento del cluster en general sea alto.

Con una GPU básicamente podemos convertir cualquier equipo, en una estación de cálculo científico. El costo de una tarjeta nVidea para dicha tarea oscila entre 1000 – 4000 $.

6. Limitaciones

Uno de los problemas que puede aparecer al programar en CUDA es la aparición de un “cuello de botella” entre la CPU y la GPU por el ancho de banda de los buses y sus latencias, i.e., puede que el CPU del equipo, no envíe la información a procesar al GPU con sufiente rapidez, desaprovechando considerablemente la capacidad de cálculo de este último.


7. ¿Que tarjetas soportan CUDA?

Funciona en todas las GPU nVidia desde la serie G8X en adelante, incluyendo GeForce, Quadro y la serie Tesla.


8. Libros sobre CUDA
 


[1] Janson Sanders and Edward Kandrot, CUDA by Example: An Introduction to General-Purpose GPU Programming, Addison-Wesley, 2010.
http://www.amazon.com/CUDA-Example-Introduction-General-Purpose-Programming/dp/0131387685/ref=sr_1_1?ie=UTF8&qid=1322370279&sr=8-1
 


[2] Rob Farber, CUDA Application Design and Development, Morgan Kauffman Ed., 2011.
http://www.amazon.com/CUDA-Application-Design-Development-Farber/dp/0123884268/ref=sr_1_2?ie=UTF8&qid=1322370279&sr=8-2
 


[3] David B. Kirk and Wen-mei W. Hwu, Programming Massively Parallel Processors: A Hands-on Approach (Applications of GPU Computing Series), Morgan Kauffman Ed., 2010.
http://www.amazon.com/Programming-Massively-Parallel-Processors-Hands-/dp/0123814723/ref=sr_1_3?ie=UTF8&qid=1322370279&sr=8-3

No hay comentarios:

Publicar un comentario