Dr. Ulises Olivares Pinto
Presentar al estudiante el modelo de programación paralela empleando Unidades de Procesamiento Gráfico (GPUs). Se profundizará en los conceptos de coordinación y sincronización de hilos.
- Dominio de los lenguajes de programación C y C++
- Conicimiento básico de estructuras de datos y algoritmos
Se deberá contar con una computadora con GPU de la marca NVIDIA
Se deberá contar con el siguiente software instalado
- [CUDA Toolkit] (https://developer.nvidia.com/cuda-toolkit)
- Entonrno de desarrollo integrado(IDE)
- Eclipse
- Clion
- NVIDIA NSIGHT
Se deberán crear cuentas en las siguientes plataformas:
- Crear una cuenta en GitHub
No. | Tema | Conceptos Clave | Recursos Adicionales |
---|---|---|---|
1 | Introducción a CUDA | Introducción a la programación en CUDA, modelo de programación paralela en GPU | - Programming Massively Parallel Processors |
2 | Modelo de Ejecución Paralela | Hilos, bloques, warps en CUDA, asignación de hilos a bloques | - NVIDIA CUDA C Best Practices Guide |
3 | Barreras de Sincronización en CUDA | Uso de __syncthreads() para sincronizar hilos dentro de un bloque |
- Ejemplo de Barrera de Sincronización: Enlace |
4 | Sincronización entre Bloques | Uso de sincronización entre bloques con variables compartidas | - Ejemplo de Sincronización entre Bloques: Enlace |
5 | Sincronización con Eventos | Creación y uso de eventos para sincronizar ejecución de kernels | - Ejemplo de Sincronización con Eventos: Enlace |
6 | Semáforos y Mutex en CUDA | Implementación de semáforos y mutex para control de acceso | - Ejemplo de Semáforos en CUDA: Enlace |
7 | Cooperación y Comunicación entre Bloques | Uso de Cooperative Groups para colaboración entre bloques | - Ejemplo de Cooperación entre Bloques: Enlace |
8 | Optimización y Buenas Prácticas | Estrategias de optimización para sincronización y coordinación | - Ejemplo de Optimización en CUDA: Enlace |
9 | Estudios de Caso y Aplicaciones | Ejemplos prácticos de aplicaciones con sincronización en CUDA | - Ejemplo de Aplicación en Procesamiento de Imágenes: Enlace |
10 | Recursos Adicionales y Avanzados | Referencias y recursos avanzados de CUDA | - NVIDIA CUDA Toolkit Documentation |
-
Barrera en Bloques: Escribe un kernel CUDA que realiza algún cálculo en un bloque de hilos y utiliza
__syncthreads()
para sincronizar todos los hilos dentro del bloque. Luego, verifica que todos los hilos se sincronizan correctamente antes y después de la barrera. -
Sincronización de Bloques: Crea un programa CUDA que use múltiples bloques de hilos. Implementa una sincronización entre bloques para garantizar que ciertos resultados parciales estén disponibles antes de que otros bloques continúen. Demuestra cómo esta sincronización entre bloques afecta la ejecución de tu programa.
-
Sincronización Global: Desarrolla un programa CUDA que requiera la sincronización de hilos a nivel de grilla. Implementa una estrategia de sincronización para garantizar que todas las mallas hayan completado cierto trabajo antes de continuar con la siguiente fase del cálculo.
-
Coordinación en Escalas Grandes: Diseña un algoritmo paralelo que involucre múltiples mallas y bloques de hilos. Aplica coordinación y sincronización para garantizar que los resultados de cada malla se combinen correctamente al finalizar. Observa cómo se pueden evitar condiciones de carrera y conflictos de datos.
-
Procesamiento de Imágenes: Crea un programa CUDA que realice un procesamiento de imágenes en paralelo. Implementa la sincronización de hilos para garantizar que los píxeles de salida se calculen correctamente, considerando las dependencias entre píxeles adyacentes.
-
Ordenamiento Paralelo: Desarrolla un algoritmo de ordenamiento paralelo utilizando CUDA. Utiliza técnicas de coordinación de hilos para garantizar que los elementos se ordenen correctamente en paralelo. Mide el rendimiento y compáralo con una implementación en CPU.
-
Optimización de Sincronización: Toma uno de los ejercicios anteriores y optimiza la sincronización de hilos para reducir la sobrecarga de sincronización al mínimo necesario. Evalúa el impacto en el rendimiento.
-
Manejo de Memoria Compartida: Mejora un kernel existente utilizando memoria compartida de manera eficiente para acelerar el rendimiento de los cálculos. Compara el rendimiento antes y después de la optimización.