Solicitar información

Temario del curso

Introducción a la computación acelerada mediante GPUs

  • Computación heterogénea y arquitectura CPU-GPU.
  • Ejecución de código en CUDA y espacios de memoria asociados.
  • Compilación de código CUDA C++ usando nvcc y CMake.
  • Verificación del entorno de desarrollo para GPUs.

Algoritmos paralelos con Thrust y CUB

  • Ordenamiento, reducción y transformación acelerados por GPU.
  • Adaptación de algoritmos del STL para ejecución en la GPU.
  • Vectores dispositivo e políticas de ejecución proporcionadas por Thrust.
  • Operaciones básicas a nivel de todo el dispositivo facilitadas por CUB para diseñar pipelines personalizados.

Arquitectura y gestión de la memoria en GPU

  • Tipos de memoria global, constante y de texturas.
  • Asignación y transferencia manuales de memoria al dispositivo.
  • Memoria unificada: simplificación del acceso a la información en distintas ubicaciones.
  • Técnicas para coherencia de datos y optimización de patrones de acceso a la memoria.

Ejecución asíncrona mediante flujos CUDA

  • Creación y gestión adecuada de los distintos flujos CUDA disponibles.
  • Superposición entre el procesamiento en la GPU y las transferencias de información hacia ella o desde ella.
  • Manejo de dependencias mediante eventos especiales de CUDA.
  • Priorización de flujos y ajuste detallado del nivel de concurrencia posible.

Diseño e implementación de kernels personalizados en CUDA

  • Características principales del modelo SIMT y comportamiento de ejecución por warps.
  • Configuración adecuada al lanzar los kernels, incluyendo el uso de bucles iterativos en la organización de las estructuras.
  • Cómo determinar correctamente índices y coordenadas entre hilos según el tipo de cuadrícula utilizada.
  • Detección y corrección rápida de errores mediante la API básica de tiempo de ejecución de CUDA.

Jerarquía de hilos y dinámica del entorno de ejecución en la GPU

  • Comprensión de los componentes básicos: cuadrículas, bloques e hilos.
  • Operaciones específicas disponibles al nivel del warp y su uso estratégico.
  • Sincronización eficaz entre bloques mediante barreras adecuadas.
  • Análisis preciso sobre el nivel de ocupación y aprovechamiento óptimo de los recursos disponibles en la GPU.

Grupos cooperativos para un paralelismo flexible

  • Presentación y descripción clara del API dedicado a la gestión de grupos colaborativos: distintas tipologías disponibles.
  • Técnicas de particionamiento eficiente de bloques en tareas basadas en mosaicos discretos mediante el uso de tiled_partition.
  • Posibilidad de ejecutar conjuntamente diversas operaciones a nivel global a través del lanzamiento coordinado de grupos colaborativos.
  • Métodos para sincronizar múltiples cuadrículas paralelas entre sí durante la realización de tareas complejas.

Técnicas avanzadas para optimización mediante el uso eficiente de la memoria compartida

  • Conceptos fundamentales acerca del banco físico de la memoria compartida y cómo evitar conflictos entre distintas solicitudes simultáneas.
  • Estrategias eficaces para dividir operaciones matriciales en bloques manejables según el acceso a dicha memoria.
  • Empleo creativo de la memoria compartida como caché personal gestionada por el propio programador.
  • Uso de herramientas especializadas tales como cuda::shared_memory_mdspan con vistas multidimensionales orientadas a un uso más flexible en distintos algoritmos.

Unificación de múltiples kernels y patrones paralelos avanzados

  • Agrupar sucesivas operaciones en un único kernel con el fin principal de minimizar las demoras inherentes a lanzamientos múltiples consecutivos.
  • Realización conjunta de algoritmos como reducción, detección por claves y escaneo mediante diseño estructurado apropiado.
  • Aplicación segura de operaciones atómicas en combinación con construcciones especiales sin bloqueos para simplificar la concurrencia.
  • Utilización selectiva de técnicas como la agregación por warps durante operaciones que involucren múltiples intentos atómicos y requieran un rendimiento máximo posible.

Perfilado del comportamiento real de las aplicaciones ejecutadas en la GPU y optimización basada en datos con Nsight Systems

  • Generación y lectura exhaustiva de cronogramas que permiten entender el flujo completo entre componentes CPU y GPU.
  • Detección rápida de puntos de cuello de botella generados durante las transferencias de datos hacia o desde la memoria dedicada a cálculos.
  • Evaluación detallada del rendimiento final de los kernels analizados junto con el nivel aproximado de ocupación disponible.
  • Procesos iterativos basados en las recomendaciones específicas derivadas al utilizar la herramienta Nsight Compute para mejorar continuamente distintas fases del código desarrollado.

Habilitación de funcionalidades modernas del lenguaje C++ en el entorno controlado por CUDA

  • Aplicación correcta de expresiones lambda, valores estáticos generados mediante constexpr y declaraciones tipo auto al codificar kernels propios.
  • Uso combinado entre algoritmos paralelizables ya incluidos desde el lenguaje C++17 y las políticas orientadas al modo de operación en cada caso específico.
  • Aprovechamiento práctico de conceptos recientemente introducidos como los rangos o los concepts durante la definición lógica y jerárquica de las secciones destinadas a ejecutarse en el dispositivo.
  • Habilitación funcional con resultados comprobables mediante utilidad nvcc y su compatibilidad demostrada en CCCL 3.x respecto al uso potencial de características únicamente disponibles desde la versión C++23 reciente del estándar.

Uso combinado de grafos CUDA y procedimientos altamente asíncronos durante ejecución en tiempo real

  • Diseño, planificación detallada así como ejecución coordinada de estructuras definidas mediante la tecnología ofrecida específicamente por CUDA Graphs.
  • Creación automática precisa de dichos diagramas a partir del seguimiento continuo y riguroso realizado previamente por distintos flujos concurrentes existentes durante las pruebas.
  • Modificaciones o cambios estratégicos realizables con facilidad para ajustar condicionalmente la evolución de nodos según criterios predeterminados dentro del propio proyecto.
  • Minimización real y constante de los intervalos muertos entre transiciones distintas, sobre todo en sistemas con muchas tareas iterativas similares.

Estrategias estandarizadas para la integración armónica del código acelerado por GPUs con aplicaciones preexistentes desarrolladas exclusivamente en CPU

  • Formas recomendadas de encapsular lógica crítica asociada al cálculo distribuido mediante interfaces propiamente construidas bajo reglas definidas para lenguaje C++.
  • Gestión práctica de entornos físicos con acceso simultáneo a varias GPUs o integración fluida dentro de arquitecturas NUMA basadas en nodos distintos.
  • Conexión efectiva y sencilla entre los mecanismos propios para construcción del proyecto como es CMake y las librerías oficiales proporcionadas por CUDA según cada requerimiento específico.
  • Técnicas demostradas útiles para depuración eficiente al usar herramientas especializadas dedicadas tales como cuda-gdb en fases tempranas y estables del proceso desarrollado.

Conclusión general y resumen de recomendaciones prácticas para mejorar continuamente el rendimiento global esperado

  • Selección lógica según las necesidades reales entre usar bibliotecas como Thrust, CUB o bien desarrollar kernels propios adaptados en cada caso particular.
  • Evaluación de cuán portables podrían ser resultados obtenidos y su viabilidad para trabajar eficazmente bajo distintos modelos arquitectónicos disponibles actualmente entre las tarjetas gráficas más recientes del mercado.
  • Distribución funcional estructurada mediante clases RAII apropiadas que ayuden a simplificar de forma significativa el control permanente sobre recursos asociados exclusivamente a CUDA.
  • Orientación hacia futuros caminos recomendables y posibilidades avanzadas para seguir profundizando en todo lo relacionado con los múltiples usos potenciales derivados del uso consciente de esta tecnología.

Requerimientos

  • Conocimientos básicos de C++, incluyendo expresiones lambda, plantillas y el STL.
  • Dominio de los algoritmos estándar, contenedores e iteradores del lenguaje.
  • Habilidad para utilizar bucles, condicionales y funciones.
  • No se requiere conocimiento previo sobre CUDA ni programación en GPU.

Público objetivo

  • Desarrolladores en C++ que buscan acelerar aplicaciones intensivas en cálculos mediante el uso de GPUs.
  • Ingenieros de software que deseen pasar de un entorno basado exclusivamente en CPU a uno con programación paralela heterogénea.
  • Ingenieros especializados en rendimiento y desarrolladores cuantitativos que trabajan con conjuntos de datos extensos.
 8 Horas

Formación Corporativa a Medida

Soluciones de formación diseñadas exclusivamente para empresas.

  • Contenido personalizado: Adaptamos el temario y los ejercicios prácticos a los objetivos y necesidades reales del proyecto.
  • Calendario flexible: Fechas y horarios adaptados a la agenda de su equipo.
  • Modalidad: Online (en directo), In-company (en sus oficinas) o Híbrida.
Inversión

Precio por grupo privado (formación online) desde 2900 € + IVA*

Contáctenos para obtener un presupuesto exacto y conocer nuestras promociones actuales

Reseñas (3)

Próximos cursos

Categorías Relacionadas