Conceptos de CUDA

Este tutorial aborda la programación de CUDA desde un contexto teórico, previo a abordar cualquier ejemplo que implique código. A pesar de que Cuda está implementado sobre C y C++ y que tiene una estructura similar a la arquitectura CPU, es importante conocer sus particularidades antes de tomar la tarea de desarrollar para ésta.

CUDA, GPGPU y CPUs

CUDA es algo menos que un lenguaje pero algo más que un API, CUDA significa “Compute Unified Device Architecture” o Arquitectura Unificada de Dispositivos de Cómputo. Es una forma de acceder de manera programática al poder de cómputo se la GPU. Pero, por qué utilizar la GPU para realizar computo cuando tenemos la CPU? La respuesta está un poco en el contexto histórico de ambos enfoques de hacer chips.

Entre la década del 70 y el 2004 la orientación comercial para desktop de las CPU fue ejecutar de manera muy rápido un conjunto de instrucciones complejas para una línea de ejecución simple, Esto implicó crear una CPU con un creciente grado de complejidad (branch prediction y out of order execution por ejemplo) que corriera a cada vez mayor velocidad de reloj. El resultado fue que el Pentium V nunca salió porque el modelo se topó con una brecha en la cual el procesador consumía mucha electricidad y tenía un desempeño menor al esperado. Cuando se canceló el Pentium V, Intel y AMD entraron a una carrera diferente y era la de portar sus arquitecturas a un mundo orientado a dos o más procesadores dentro del mismo chip, que es el desarrollo que vemos actualmente en los cuatro procesadores de dos, cuatro, seis, ocho core, etc.

Paralelamente otro mercado fue naciendo, el de los procesadores gráficos. Las CPU eran muy buenas realizando su función, ejecutar programas de manera lineal, pero era deficientes en otras áreas como hacer gran cantidad de tareas simples de manera paralela. Para el procesamiento gráfico se requería precisamente esto, por lo que se desarrollaron chips que permitieran transformar polígonos, texturizarlos e iluminarlos. Esta arquitectura fue creciendo en paralelismo cuando la demanda de mayor resolución de pantalla, mayor cantidad de polígonos y texturas y finalmente juegos con escenas más complejas.

Dado las diferentes orientaciones y a las diferencias de arquitectura, ambos tipos de procesadores tuvieron diferentes ritmos de crecimiento en poder de cómputo. Por un lado los CPU sufrieron un ligero estancamiento mientras se adecuaban a la arquitectura de múltiples procesadores, haciendo únicamente mejoras pequeñas en cuando a velocidad de reloj o haciendo mejoras en la arquitectura del colosal procesador. Por el otro las GPU hacía refinamientos sobre sus pequeños núcleos y cada vez que pasaban a una litografía más pequeña introducían un mayor número de éstos y una mayor sofisticación en el manejo de paralelismo. El resultado se puede ver en la figura 1. Algunos papers indican que el “poder bruto” medido en GFlops podría ser de entre 15 y 100 veces de una GPU por encima de una CPU.

Figura 1: Rendimiento en Gflops para diferentes modelos de GPU y CPU durante la década del 2000-2010 Tomado de:
http://theinf2.informatik.uni-jena.de/Lectures/Programming+with+CUDA/SS+2011.html
Adicional al crecimiento en complejidad, la velocidad con que se hacían nuevos desarrollos en el área de investigación en computación gráfica, especialmente para tiempo real, hacía ineficiente tener que esperar a que estos se implementaran en hardware o a través de un driver, por lo que las dos o tres empresas principales del ramo desarrollaron técnicas para programar de manera dinámica sobre las GPU (a saber shaders programables). Para este momento sin embargo las GPU se dedicaban únicamente a su tarea especializada de procesar gráficos. Hace unos cuantos años sin embargo surgió el concepto de GPGPU (General Purpouse Graphics Processor Unit), que es básicamente acceder al GPU para hacer cálculos como se haría con el CPU sin necesidad de tener un entorno orientado a gráficos, sino desde lenguajes de propósito general.
Bajo este estandarte se crearon tres “estándares”, OpenCL (Open Computing Language) de Khronos Group , CUDA de Nvidia y DirectCompute de Microsoft. Los estándares son similares entre sí, cada uno con sus ventajas y desventajas:

  • OpenCL es uno de los más recientes (2009), como un estándar abierto con ansias de universalidad tiene una muy buena arquitectura pero deja muchas cosas por fuera del estándar. Lo más interesante es el amplio soporte que se le quiere dar, ya que funciona para tarjetas Nvidia, AMD y para algunas móviles como las PowerVR.
  • CUDA es el más antiguo (2007) y es uno de los más completos en cuanto a funcionalidades, librerías y sofisticación de la plataforma. Sin embargo su gran talón de Aquiles es ser orientado únicamente a GPUs Nvidia.
  • DirectCompute es Microsoft siendo Microsoft, es decir sacando una respuesta a los estándares competencia para su plataforma Windows. De los tres es tal vez el menos difundido.

Ahora surge la pregunta, por qué estudiar CUDA? Y en general, por qué estudiar programación sobre GPU? . Quiere decir esto que las CPU van a desaparecer frente al surgimiento de sus primos las GPU? Probablemente no, cada una de las arquitecturas tienen sus ventajas y desventajas, por ejemplo para los problemas que son paralelizables las GPU brillan, pero para los que no, su relativa simplicidad por core y su reloj de baja velocidad son una desventaja. Lo que probablemente apunte a aplicaciones que pueden sobresalir con lo mejor de ambos mundos.
La respuesta radica en que es una oportunidad para explotar la supercomputación (otra vez) , pero esta vez con una diferencia. Esta vez es supercomputación masiva a relativamente bajo costo, una GPU con un rendimiento 5 o 10 veces superior a una CPU en poder de computo , tiene un valor similar a ésta y está presente no solamente en grandes vendedores especializados sino también en los hogares. Y aunque el foco principal de Nvidia y AMD para sus GPGPU es las aplicaciones científicas, la minería de datos y otros nichos especializados, esto abre oportunidades para hacer aplicaciones desktop y de empresas pequeñas que no habían sido posibles, dadas las limitadas capacidades de cómputo en la PC.

1 2 3

Compartir esta entrada

DiggReddit