Volver a los cursos
AI024 Professional

Introducción a la programación con ROCm y HIP: Una tutorial práctico

Una guía práctica y moderna sobre programación para GPU de AMD con ROCm y HIP. Cubre toda la pila de software, instalación, flujos de compilación, programación de kernels, gestión de memoria, ingeniería de rendimiento, uso de bibliotecas, migración desde CUDA y prácticas de depuración en producción.

5.0
30.0h
361 estudiantes
0 me gusta
Inteligencia Artificial
Comenzar a aprender

Descripción del curso

📚 Resumen del Contenido

Una guía práctica y moderna sobre programación de GPU AMD con ROCm e HIP. Cubre toda la pila de software, instalación, flujos de compilación, programación de kernels, gestión de memoria, ingeniería de rendimiento, uso de bibliotecas, migración desde CUDA y prácticas de depuración en producción.

Domina la programación de GPU AMD y la portabilidad de CUDA a HIP con esta profundización técnica.

Autor: EvoClass

Agradecimientos: Documentación oficial de AMD sobre ROCm e HIP, incluyendo proyectos como ROCm, HIP y ROCm LLVM.

🎯 Objetivos de Aprendizaje

  1. Definir HIP y su papel dentro del ecosistema ROCm en una sola oración concisa.
  2. Distinguir entre ROCm (plataforma), HIP (interfaz) y bibliotecas ROCm (bloques de construcción).
  3. Identificar las capas jerárquicas de la arquitectura ROCm desde el hardware hasta los marcos de aplicación.
  4. Definir la relación entre el SDK de HIP y la plataforma ROCm en diferentes sistemas operativos.
  5. Ejecutar un flujo de instalación sistemático, incluyendo verificación de matriz de compatibilidad y configuración de rutas tras la instalación.
  6. Compilar y ejecutar un programa mínimo de verificación para solucionar problemas comunes de controladores y acceso al entorno.
  7. Comprender por qué una estrategia de compilación sólida es esencial para reconciliar la portabilidad del código fuente con el rendimiento específico de la arquitectura.
  8. Implementar lanzamientos de kernels portables usando la macro hipLaunchKernelGGL como alternativa a la sintaxis de triple corchete de CUDA.
  9. Configurar proyectos CMake de nivel productivo que apunten a arquitecturas ROCm específicas y gestionen dependencias de bibliotecas externas.
  10. Definir la anatomía de un kernel HIP y aplicar la fórmula básica de ejecución para el indexado de hilos.

🔹 Lección 1: Introducción a la Arquitectura ROCm e HIP

Resumen: Esta lección proporciona una visión general fundamental de la plataforma ROCm y el lenguaje de programación HIP. Clarifica la relación entre la pila completa de ROCm, la interfaz HIP y las bibliotecas de alto nivel, estableciendo expectativas realistas sobre la portabilidad de CUDA a AMD y la ingeniería de rendimiento.

Resultados de Aprendizaje:

  • Definir HIP y su papel dentro del ecosistema ROCm en una sola oración concisa.
  • Distinguir entre ROCm (plataforma), HIP (interfaz) y bibliotecas ROCm (bloques de construcción).
  • Identificar las capas jerárquicas de la arquitectura ROCm desde el hardware hasta los marcos de aplicación.

🔹 Lección 2: Instalación y Configuración del Entorno

Resumen: Esta lección guía a desarrolladores de GPU e ingenieros de HPC a través de las estrategias esenciales para configurar un entorno listo para HIP tanto en plataformas Linux como Windows. Enfatiza un enfoque de "realidad de plataforma" donde los desarrolladores deben verificar la compatibilidad entre hardware y software antes de proceder con un flujo de instalación estructurado y una verificación final mediante el compilador hipcc.

Resultados de Aprendizaje:

  • Definir la relación entre el SDK de HIP y la plataforma ROCm en diferentes sistemas operativos.
  • Ejecutar un flujo de instalación sistemático, incluyendo verificación de matriz de compatibilidad y configuración de rutas tras la instalación.
  • Compilar y ejecutar un programa mínimo de verificación para solucionar problemas comunes de controladores y acceso al entorno.

🔹 Lección 3: La Herramienta de Compilación: hipcc y Estructura de Proyecto

Resumen: Esta lección explora las herramientas esenciales y las estrategias organizativas para desarrollar aplicaciones HIP en hardware AMD. Transita al desarrollador desde compilaciones simples con línea de comandos usando el driver hipcc hacia configuraciones profesionales y listas para producción usando CMake. Los temas clave incluyen macros de lanzamiento de kernels portables, optimización específica de arquitectura y la distinción crítica entre portabilidad a nivel de código fuente y rendimiento binario.

Resultados de Aprendizaje:

  • Comprender por qué una estrategia de compilación robusta es esencial para reconciliar la portabilidad del código fuente con el rendimiento específico de la arquitectura.
  • Implementar lanzamientos de kernels portables usando la macro hipLaunchKernelGGL como alternativa a la sintaxis de triple corchete de CUDA.
  • Configurar proyectos CMake de nivel productivo que apunten a arquitecturas ROCm específicas y gestionen dependencias de bibliotecas externas.

🔹 Lección 4: Modelo de Programación HIP y Desarrollo de Kernels

Resumen: Esta lección explora la arquitectura fundamental de los kernels HIP, centrándose en cómo se mapea el trabajo desde problemas lógicos hasta la ejecución en hardware a través de rejillas y bloques. Proporciona una plantilla para una programación de GPU robusta, cubriendo la fórmula de ejecución esencial, cuellos de botella de rendimiento (memoria frente a cómputo) y la implementación obligatoria de verificación de errores y sincronización para código listo para producción.

Resultados de Aprendizaje:

  • Definir la anatomía de un kernel HIP y aplicar la fórmula básica de ejecución para el indexado de hilos.
  • Configurar tamaños de rejilla y bloque de forma efectiva e implementar pruebas de rendimiento para encontrar el rendimiento óptimo.
  • Implementar macros de manejo de errores robustas y aplicar semánticas de sincronización para gestionar la interacción dispositivo-huésped.

🔹 Lección 5: Gestión de Memoria y Patrones de Datos

Resumen: Esta lección se centra en el pilar central de la programación de GPU: la gestión de memoria. Cubre la categorización de tipos de memoria (Página, Pinned, Dispositivo y Administrada), las implicaciones de rendimiento de los mecanismos de transferencia de datos y el papel crítico de los patrones de acceso a memoria—específicamente el coalescado—para alcanzar el rendimiento máximo. Los estudiantes aprenderán a equilibrar la facilidad de uso ofrecida por la memoria administrada con el control explícito requerido para aplicaciones de alto rendimiento en HPC.

Resultados de Aprendizaje:

  • Distinguir entre memoria host pageable y pinned e identificar cuándo usar cada una para obtener la velocidad de transferencia óptima.
  • Implementar asignación de memoria de dispositivo y memoria unificada/administrada usando APIs de HIP (hipMalloc, hipHostMalloc, hipMallocManaged).
  • Analizar patrones de acceso a memoria para garantizar acceso coalescido y evitar cuellos de botella de rendimiento como el acceso escalonado.

🔹 Lección 6: Streams, Eventos y Ejecución Asíncrona

Resumen: Esta lección transita a los desarrolladores desde un modelo de programación síncrona hacia una mentalidad concurrente, centrándose en cómo maximizar la utilización de GPU mediante streams y eventos de HIP. Cubre los mecanismos de superposición de transferencias de datos con la ejecución de kernels mediante pipelines segmentados e introduce las compensaciones entre captura de streams y construcción explícita de grafos. Además, destaca consideraciones críticas para producción, incluyendo el uso de bibliotecas seguras para grafos y temporización de alta precisión en GPU.

Resultados de Aprendizaje:

  • Identificar los beneficios de rendimiento de la ejecución asíncrona y los streams concurrentes frente a la ejecución síncrona.
  • Implementar pipelines segmentados para superponer la comunicación host-dispositivo con el cálculo de kernels.
  • Distinguir entre captura de streams y construcción explícita de grafos para reducir la sobrecarga de lanzamiento.

🔹 Lección 7: Ingeniería de Rendimiento en GPUs AMD

Resumen: Esta lección establece un marco científico para optimizar software en hardware AMD, pasando de la adivinanza a un enfoque sistemático y basado en mediciones. Cubre la relación arquitectónica entre unidades de cómputo, wavefronts y presión de registros, mientras proporciona metodologías prácticas para perfilar con rocprofv3 e implementar plantillas robustas de benchmarking.

Resultados de Aprendizaje:

  • Implementar el flujo de optimización de HIP de 6 pasos para identificar y resolver cuellos de botella de rendimiento.
  • Analizar el compromiso entre presión de registros y ocupación para maximizar la utilización del hardware.
  • Realizar mediciones de rendimiento precisas utilizando eventos de hardware y mejores prácticas de benchmarking con múltiples iteraciones.

🔹 Lección 8: El Ecosistema de Bibliotecas ROCm

Resumen: Esta lección introduce la filosofía de ingeniería "Primero bibliotecas", priorizando bibliotecas ROCm de alto rendimiento y preconstruidas sobre el desarrollo de kernels personalizados. Cubre la clasificación de la pila de bibliotecas ROCm (Matemáticas, FFT, Primitivas y ML/AI) y proporciona un marco de decisión para elegir entre interfaces portables hip* y implementaciones nativas de AMD roc*. Además, los estudiantes explorarán los requisitos críticos de "seguridad de grafos" al integrar bibliotecas en flujos de captura de grafos HIP.

Resultados de Aprendizaje:

  • Aplicar el principio de ingeniería "Primero bibliotecas" para justificar el uso de primitivas previamente probadas frente a kernels personalizados.
  • Distinguir entre bibliotecas hip* y roc* según los requisitos de portabilidad y necesidades de rendimiento.
  • Clasificar las bibliotecas ROCm en sus dominios funcionales respectivos (Matemáticas, FFT, Primitivas, ML/AI).

🔹 Lección 9: Migración de Aplicaciones CUDA a HIP

Resumen: Esta lección cubre la transición sistemática del código fuente CUDA al marco portable HIP en C++. Los estudiantes aprenderán a ejecutar un flujo de migración incremental usando herramientas automatizadas como hipify-perl y hipify-clang, identificar trampas críticas de portabilidad como suposiciones específicas de hardware sobre warpSize, e implementar un proceso riguroso de validación para comparar rendimiento y corrección tras la migración.

Resultados de Aprendizaje:

  • Ejecutar el flujo de migración incremental de 6 pasos para minimizar la sobrecarga de depuración.
  • Seleccionar y aplicar la herramienta de traducción automática adecuada (hipify-perl vs. hipify-clang) según la complejidad del código fuente.
  • Identificar y resolver trampas de portabilidad sensibles a la arquitectura, especialmente aquellas relacionadas con warpSize y errores de traducción mecánica.

🔹 Lección 10: Depuración, Pruebas y Prácticas de Producción

Resumen: Esta lección cubre las herramientas y metodologías esenciales para llevar kernels GPU desde el desarrollo hasta la producción en la plataforma ROCm. Detalla el uso de ROCgdb y AddressSanitizer para detección de errores, establece una estrategia de prueba rigurosa de cuatro capas y proporciona una lista de verificación de producción para asegurar la corrección y estabilidad del rendimiento de los kernels.

Resultados de Aprendizaje:

  • Usar ROCgdb, ltrace y AddressSanitizer para identificar errores de nivel de código y errores de acceso a memoria en código GPU.
  • Implementar una estrategia de prueba de cuatro capas para validar ayudantes, corrección de kernels, casos extremos y regresiones de rendimiento.
  • Aplicar patrones de código de producción y listas de verificación para gestionar interfaces de kernels, documentación y depuración basada en entorno.