Hoy pude dedicarme a leer la tesis de un par de compañeros de la universidad la cual trata de CUDA (Compute Unified Device Architecture - Arquitectura de cómputo paralelo de propósito general). Esta nueva forma de ver a las placas de video como arquitecturas de procesamiento paralelo para cualquier aplicación (no sólo las gráficas) me llamó mucho la atención y me parece una excelente idea para aprovechar semejante poder de cómputo para algo que no sea exclusivamente el ocio =P
En éste artículo haré un resumen de lo presentado por estos muchachos en su tesis, la cual denominaron "COMPUTACIÓN DE PROPÓSITO GENERAL SOBRE GPUS UTILIZANDO CUDA", con mi visión sobre esta tecnología.
Para el que no tenga idea (yo no tenía mucha antes de leer la tesis), CUDA es parte de la evolución de las placas de video desde una arquitectura de pipeline de funciones fijas (Entrada del pipeline, Transformaciones del modelo, Iluminación, Simulación de cámara, Rasterización, Texturizado y Superficies ocultas) dedicada exclusivamente al procesamiento de píxels y vértices a una nueva era de GPUs (Graphics Processing Unit) de Propósito General (GPGPU) que permiten la ejecución de cualquier aplicación que pueda ser paralelizada.
Esta evolución no fue pensando directamente en aplicaciones de propósito general, sino que ésta arquitectura permite una significativa mejora en el balance de carga, aprovechándose mejor la potencia de los GPUs. Además provee una mayor flexibilidad para el desarrollador en conjunto con la reducción en la dificultad de programación para el desarrollador, dado que ahora se cuenta con un solo set de instrucciones mientras que antes se necesitaban dos sets, uno para procesar píxeles y otro para procesar vértices (en síntesis, un dolor de huevos).
Las GPUs que fueron diseñadas para realizar grandes cantidades de cómputo, contienen múltiples procesadores que aprovechan la naturaleza paralela de las aplicaciones gráficas, y por lo tanto, gracias a CUDA, se pueden adaptar para realizar cualquier tarea que tome ventaja de la paralelización para lograr mayores velocidades de cómputo.
CUDA, la cual es desarrollada por NVIDIA, no es la única en su campo dado que ATI lanzo al poco tiempo su Stream Computing, el cual ahora se llama AMD FireStream, pero aunque no llega a ser igual de famosa, no deja de ser prometedora.
La arquitectura de CUDA se basa en un arreglo escalable de Streaming Multiprocessors (SMs) multihilados (la paralelización se logra creando hilos, no procesos, debido a que estos presentan menor costo en los cambios de contexto y accesos a memoria). Cada SM es capaz de manejar 768 contextos de hilos activos simultáneamente. Un multiprocesor consiste de ocho núcleos Scalar Processor (SP), dos unidades de funciones especiales básicas, una unidad de instrucción multihilada, y una memoria compartida on-chip. Dos o tres SMs se agrupan en Texture Processor Clusters (TPCs).
Las mayores ventajas de utilizar GPUs en lugar de CPUs se deben a la relación costo por GFlop, dado que las GPUs superan con creces la cantidad de GFlops que puede entregar una CPU. Pero la diferencia está marcada en las tareas para las cuales fueron diseñadas cada una. Los GPUs fueron pensados para operaciones con alto nivel de procesamiento y paralelismo, con baja cantidad de accesos a memoria. Por otro lado las CPUs se dedican al procesamiento secuencial y optimizan al máximo los accesos a memoria.
Si bien todo suena hermoso para las GPUs, uno tranquilamente podría pensar "por qué no reemplazamos los CPUs por GPUs?". El problema está en que sólo un rango limitado de aplicaciones es altamente paralelizable y pueden aprovechar las facilidades de las GPUs, el resto es muy dependiente de los accesos a memoria y dependen de los datos que se van generando secuencialmente en las distintas instrucciones. Por otro lado, la programación de programas paralelos no es sencilla. Hacer programas que aprovechen la ejecución paralela es bastante complejo, requiere de un buen análisis de los problemas, de la partición de los datos, son más complicados de depurar y mantener, y, aunque intenten lo contrario, son muy dependientes de la arquitectura sobre la que se ejecutan. Un programa que se abstrae de la arquitectura subyacente no logra aprovechar el verdadero poder de cómputo, e incluso puede llegar a generar peores tiempos de ejecución que un programa secuencial.
A pesar de las contraindicaciones, hay casos particulares donde la ejecución paralela es excelentemente aprovechada y es ahí donde las GPUs toman realmente ventaja con respecto a sus "primas", las CPUs. Claros ejemplos son las clásicas multiplicación de matrices, el algoritmo gravitacional N-body, simulaciones de clima y cracking por fuerza bruta >=)
En los resultados de la tesis, los problemas altamente paralelizables logran unos speedups increíbles. Realmente vale la pena esta tecnología si la aplicamos correctamente.
CUDA provee un modelo de programación que utiliza librerías de funciones escritas en C. Las librerías proveen un conjunto de funciones que facilitan la creación de los hilos (definidos en conjunto a través de las funciones denominadas kernels), herramienta de sincronización mediante barreras y facilidades para acceder a las distintas memorias (local del hilo, compartida con otros hilos, espacios constantes, de texturas y la memoria global). Los programas se pueden ejecutar parte en el CPU y el resto en el GPU.
Por lo que pude observar, la programación lleva su tiempo de aprendizaje debido a los conceptos nuevos, las herramientas a utilizar y la mezcla que se puede hacer entre lo que se ejecuta en la CPU y lo que va a la GPU. Igualmente no parece excesivamente complejo y es cuestión de acostumbrarse.
Por suerte el Driver, Toolkit, SDK y debugger de CUDA están disponibles tanto para Windows, como para Linux y Mac, algo que es de agradecer, ya que abren la posibilidad de aprovechar la arquitectura sin importar la elección del sistema operativo. Todo se puede descargar desde http://www.nvidia.com/object/cuda_get.html
Para saber qué placas cuentan con la arquitectura CUDA, pueden visitar http://www.nvidia.com/object/cuda_learn_products.html
Desde éste humilde espacio les mando mis felicitaciones a los creadores de la tesis por su gran trabajo, la verdad que me encantó.
Etiquetas:
articulos,
CUDA,
GPU,
nvidia,
paralelismo,
programacion
Suscribirse a:
Enviar comentarios (Atom)
2 comentarios:
Muyyyy buen artículo.Me servirá mucho.
Solo un comentario "umilde" lleva h.
Saludos,
Lorena.
Gracias por el comentario!
Se me escaparon un par de errores en este artículo, gracias por avisar!, ya los corregí.
Publicar un comentario