Programación de procesadores masivamente paralelos: Un enfoque práctico
Este curso ofrece una introducción completa al cálculo en GPU y programación paralela utilizando el entorno CUDA C. Cubre arquitecturas de GPU, paralelismo de datos, gestión de hilos, optimización de memoria y consideraciones avanzadas de rendimiento, ilustradas mediante casos prácticos reales como la reconstrucción de resonancia magnética y la visualización molecular.
Descripción del curso
Resumen del contenido
Este curso ofrece una introducción completa al cálculo en GPU y al programación paralela utilizando el entorno CUDA C. Cubre arquitecturas de GPU, paralelismo de datos, gestión de hilos, optimización de memoria y consideraciones avanzadas de rendimiento, ilustradas mediante estudios de caso del mundo real como la reconstrucción de MRI y la visualización molecular.
Domine el arte del cálculo paralelo de alto rendimiento con una guía práctica y basada en la experiencia sobre CUDA y arquitecturas de GPU.
Autor: David B. Kirk, Wen-mei W. Hwu
Agradecimientos: Ian Buck, John Nickolls, equipo NVIDIA DevTech, Jensen Huang, David Luebke, Bill Bean, Simon Green, Mark Harris, Manju Hedge, Nadeem Mohammad, Brent Oster, Peter Shirley, Eric Young y Cyril Zeller.
Objetivos de aprendizaje
- Distinguir entre las filosofías de diseño y trayectorias de rendimiento de los multicore CPUs y los muchos-core GPUs.
- Identificar los componentes clave de una arquitectura de GPU moderna, incluyendo Multiprocesadores de flujo (SMs) y estructuras de memoria.
- Aplicar la Ley de Amdahl para calcular el aceleramiento teórico e identificar el impacto de cuellos de botella secuenciales.
- Contrastar las diferencias arquitectónicas entre pipelines fijos y arreglos procesadores unificados programables.
- Explicar el papel del "GPGPU" como paso intermedio y las restricciones de los primeros modelos de programación de shaders.
- Analizar cómo características de hardware como operaciones atómicas, sincronización por barrera y soporte de doble precisión permitieron la transición hacia un cálculo generalizado escalable.
- Identificar y aprovechar el paralelismo de datos dentro de algoritmos de multiplicación de matrices.
- Implementar la gestión de memoria del dispositivo, incluyendo asignación, transferencia de datos entre host y dispositivo y desasignación.
- Crear e iniciar kernels CUDA usando índices de hilos y configuraciones adecuadas de grilla/bloque.
- Diseñar jerarquías de hilos multidimensionales (grillas y bloques) para mapear estructuras de datos complejas a hardware de GPU.