Atras Menú

Black-byte

Conceptos de CUDA

En cuanto a CUDA, se justifica por la cantidad de documentación disponible, un conjunto de librerías más completo y herramientas para utilizar con entornos como Visual Studio. Adicionalmente el hecho de escoger CUDA no implica desconocer OpenCL o DirectCompute, ya que los estándares son similares en cuanto a su contenido teórico e interfaces para comunicarse entre los tres. De hecho el SDK de CUDA viene usualmente con algunos ejemplos de DirectCompute y de OpenCL.

Conceptos Básicos

Aunque no es mandatorio tener un conocimiento profundo acerca de computación paralela, si es deseable tener un conocimiento básico acerca de hilos, sincronización, semáforos, mutex memoria compartida, etc. Así que paralelamente este tutorial se debería complementar con un poco de lectura de computación paralela, no tanto con el fin de entenderlo sino de aprovechar mejor los recursos de GPGPU.
Este tutorial está orientada a CUDA 4 que al momento de escribir era la última versión. La razón del enfoque es que este release simplifica muchas cosas con respecto a CUDA 3, principalmente el manejo de memoria , la extensión a c++ y la escalabilidad entre multiples GPU por sistema.
El tutorial mantiene los nombres en inglés, con el fin de poder navegar mejora entre éste y la documentación de nVidia.

  • Host: Para CUDA es un dispositivo que ejecuta de manera de manera serial los programas de C. Generalmente se refiere a una o mas CPU con uno o más cores. Tiene como memoria principal la RAM del sistema.
  • Device: Dispositivo habilitado para ejecutar código CUDA de manera paralela. Puede consistir de una o más GPU montada sobre uno o más dispositivos físicos, cada uno con su propio pool de VRAM. Las múltiples GPU por dispositivos es debido a que durante los últimos años han salido al mercado tarjetas gráficas de alta gama con multiples GPU, en cuanto a múltiples dispositivos, CUDA 4 soporta programación directa sobre tarjetas en modo SLI, permitiendo compartir pools de memoria y lanzando hilos en éstas de manera independiente.

Hay que notar que CUDA tiene múltiples “capabilities” empezando con el 1.0 soportado por la primera generación de GPU la G80, hasta las mas recientes Tesla con 2.0. Las “capabilities” son un listado de características soportadas por la GPU respecto a CUDA. Estas se explorarán con más detalle en el segundo tutorial de la serie.

Por ahora la mayoría de las características no suenan a nada, algunas como procesamiento de flotantes de doble precisión si son bastante dicientes y algunos conceptos como los tipos de memoria se repasarán más adelante. Por supuesto las capacidades se pueden acceder de manera programática, por lo que se puede establecer un cierto nivel para ejecutar un programa en caso de que se necesite, por ejemplo, impedir correr cualquier programa que requerirá flotantes de doble precisión si la “capability” es menor a 1.3.
Hardware

Aunque no es indispensable conocer la arquitectura de hardware de las CPU que se encuentran ejecutando CUDA, su conocimiento permite una referencia más clara al nivel conceptos para entender y optimizar el uso de la arquitectura.
La arquitectura actual es derivada del chip g80, chip incluido en todas la tarjetas de la serie 8 de nVidia, con la reconocida 8800Gtx. Bajo este chip nVidia empezó a ver las posibilidades de la computación masiva paralela en el GPU, aunque en un principio dichos elementos fueron incorporados a nivel de software.
Con la llegada de la arquitectura Fermi, nVidia realizó una apuesta a la GPGPU, puesto que en esta arquitectura no solo mejoró la capacidad gráfica, sino que también se introdujeron elementos para GPGPU como es el caso del procesamiento de flotantes de doble precisión.
La actual generación de GPU se denomina Fermi para la línea desktop y Tesla para la línea de HPC, ambas se pueden programar a través de CUDA y tiene más bien diferencias en rendimiento al ser una orientada a gráficos y GPU Computing, mientras que la otra está totalmente dedicada a GPU Computing. Ambas cuentan con las siguientes características.

  • CUDA Core: Extraña denominación que da a una pequeña unidad de procesamiento que permite hacer operaciones aritméticas, trascendentales para flotantes de precisión simple.
  • Multiprocesor: Es el ensamble de 8 CUDA cores.
  • Gigathread: Es una tecnología integrada y optimizada en hardware para el manejo eficiente de hilos. Gigathread agrupa los hilos de manera jerárquica en paquetes denominados warps. Posteriormente manda cada hilo a uno de los multiprocesadores dependiendo de la disponiblidad de éstos. Algunas de las mejoras introducidas en esta versión del Gigathread es la posibilidad de subdividir el trabajo de los hilos para aprovechar al máximo el multiprocesor al disminuir el idle time.
  • ECC implementado para el procesamiento, lamentablemente parece que solo está disponible en algunas de las gamas de Tesla.

Por ejemplo una de las últimas tarjetas de video lanzada por nVidia para el mercado Desktop al momento de realizar este tutorial es la GeForce GTX 590. Dentro de sus especificaciones cuenta con 1024 CUDA Cores o el equivalente a 126 multiprocesadores con un rendimiento teórico de 2488.3 Gflops.

Páginas: 1 2 3