/CUDA-Sync

Este repositorio tiene como objetivo proporcionar a los desarrolladores una comprensión profunda y ejemplos prácticos sobre cómo coordinar y sincronizar hilos en programación CUDA.

Primary LanguageCuda

Programación Paralela

Coordinación y Sincronización de Hilos en CUDA

Licenciatura en Tecnología

alt text

Profesor

Dr. Ulises Olivares Pinto

Objetivo del curso

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.

Prerequisitos

Deseables

  • Dominio de los lenguajes de programación C y C++
  • Conicimiento básico de estructuras de datos y algoritmos

Hardware

Se deberá contar con una computadora con GPU de la marca NVIDIA

Software

Se deberá contar con el siguiente software instalado

Cuentas

Se deberán crear cuentas en las siguientes plataformas:

  • Crear una cuenta en GitHub

Contenido del Curso sobre Coordinación y Sincronización de Hilos en CUDA

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

Ejercicios Prácticos:

Ejercicios sobre Barreras de Sincronización en CUDA

  1. 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.

  2. 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.

Ejercicios sobre Sincronización entre Bloques

  1. 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.

  2. 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.

Ejercicios de Aplicación Práctica

  1. 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.

  2. 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.

Ejercicios de Optimización y Buenas Prácticas

  1. 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.

  2. 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.

Última actualización: 27 de octubre de 2023