Introdução à Programação ROCm e HIP: Um Tutorial Prático
Um guia prático e moderno sobre programação em GPU da AMD com ROCm e HIP. Aborda todo o stack de software, instalação, fluxos de compilação, programação de kernels, gerenciamento de memória, engenharia de desempenho, uso de bibliotecas, migração do CUDA e práticas de depuração em produção.
Visão Geral do Curso
📚 Resumo do Conteúdo
Um guia prático e moderno sobre programação de GPU da AMD com ROCm e HIP. Aborda toda a pilha de software, instalação, fluxos de compilação, programação de kernels, gerenciamento de memória, engenharia de desempenho, uso de bibliotecas, portabilidade de CUDA e práticas de depuração em produção.
Domine a programação de GPU da AMD e a portabilidade de CUDA para HIP com esta análise técnica aprofundada.
Autor: EvoClass
Agradecimentos: Documentação oficial da AMD baseada no ROCm e HIP, incluindo projetos como ROCm, HIP e ROCm LLVM.
🎯 Objetivos de Aprendizagem
- Defina HIP e seu papel dentro do ecossistema ROCm em uma única frase concisa.
- Diferencie entre ROCm (plataforma), HIP (interface) e bibliotecas ROCm (elementos construtivos).
- Identifique as camadas hierárquicas da arquitetura ROCm desde o hardware até os frameworks de aplicação.
- Defina a relação entre o SDK HIP e a plataforma ROCm em diferentes sistemas operacionais.
- Execute um fluxo de instalação sistemático, incluindo verificação da matriz de suporte e configuração de caminhos após a instalação.
- Compile e execute um programa mínimo de verificação para solucionar problemas comuns de driver e acesso ao ambiente.
- Compreenda por que uma estratégia robusta de compilação é essencial para reconciliar a portabilidade de código-fonte com o desempenho específico da arquitetura.
- Implemente lançamentos de kernels portáveis usando a macro
hipLaunchKernelGGLcomo alternativa à sintaxe de triplas chaves do CUDA. - Configure projetos CMake de nível produtivo que visem arquiteturas específicas do ROCm e gerenciem dependências de bibliotecas externas.
- Defina a anatomia de um kernel HIP e aplique a fórmula básica de indexação de threads.
🔹 Aula 1: Introdução à Arquitetura ROCm e HIP
Visão Geral: Esta aula oferece uma visão fundamental da plataforma ROCm e da linguagem de programação HIP. Clarifica a relação entre a pilha completa do ROCm, a interface HIP e bibliotecas de alto nível, estabelecendo expectativas realistas quanto à portabilidade de CUDA para AMD e engenharia de desempenho.
Resultados de Aprendizagem:
- Defina HIP e seu papel dentro do ecossistema ROCm em uma única frase concisa.
- Diferencie entre ROCm (plataforma), HIP (interface) e bibliotecas ROCm (elementos construtivos).
- Identifique as camadas hierárquicas da arquitetura ROCm desde o hardware até os frameworks de aplicação.
🔹 Aula 2: Instalação e Configuração do Ambiente
Visão Geral: Esta aula orienta desenvolvedores de GPU e engenheiros HPC nos estratégias essenciais para configurar um ambiente preparado para HIP tanto no Linux quanto no Windows. Destaca uma abordagem baseada na "realidade da plataforma", onde os desenvolvedores devem verificar a compatibilidade entre hardware e software antes de prosseguir com um fluxo de instalação estruturado e verificação final usando o compilador hipcc.
Resultados de Aprendizagem:
- Defina a relação entre o SDK HIP e a plataforma ROCm em diferentes sistemas operacionais.
- Execute um fluxo de instalação sistemático, incluindo verificação da matriz de suporte e configuração de caminhos após a instalação.
- Compile e execute um programa mínimo de verificação para solucionar problemas comuns de driver e acesso ao ambiente.
🔹 Aula 3: A Ferramenta de Compilação: hipcc e Estrutura do Projeto
Visão Geral: Esta aula explora as ferramentas essenciais e estratégias organizacionais para desenvolver aplicações HIP em hardware da AMD. Transfere o desenvolvedor de compilações simples via linha de comando usando o driver hipcc para configurações profissionais e prontas para produção usando CMake. Os focos principais incluem macros de lançamento de kernels portáveis, otimizações específicas de arquitetura e a distinção crítica entre portabilidade no nível de código-fonte e desempenho binário.
Resultados de Aprendizagem:
- Compreenda por que uma estratégia robusta de compilação é essencial para reconciliar a portabilidade de código-fonte com o desempenho específico da arquitetura.
- Implemente lançamentos de kernels portáveis usando a macro
hipLaunchKernelGGLcomo alternativa à sintaxe de triplas chaves do CUDA. - Configure projetos CMake de nível produtivo que visem arquiteturas específicas do ROCm e gerenciem dependências de bibliotecas externas.
🔹 Aula 4: Modelo de Programação HIP e Desenvolvimento de Kernels
Visão Geral: Esta aula explora a arquitetura fundamental dos kernels HIP, focando na forma como o trabalho é mapeado de problemas lógicos para execução em hardware através de grades e blocos. Oferece um plano para programação robusta em GPU, cobrindo a fórmula de execução essencial, gargalos de desempenho (memória vs. computação) e a implementação obrigatória de verificação de erros e sincronização para códigos prontos para produção.
Resultados de Aprendizagem:
- Defina a anatomia de um kernel HIP e aplique a fórmula básica de indexação de threads.
- Configure tamanhos eficazes de grade e bloco e implemente benchmarking para encontrar o throughput ideal.
- Implemente macros robustas de tratamento de erros e aplique semânticas de sincronização para gerenciar interações entre dispositivo e host.
🔹 Aula 5: Gerenciamento de Memória e Padrões de Dados
Visão Geral: Esta aula foca no pilar central da programação em GPU: gerenciamento de memória. Cobertura da categorização de tipos de memória (Página, Fixa, Dispositivo e Gerenciada), implicações de desempenho dos mecanismos de transferência de dados e o papel crítico dos padrões de acesso à memória — especificamente o agrupamento (coalescing) — para alcançar o desempenho máximo. Os alunos aprenderão a equilibrar a facilidade de uso fornecida pela memória gerenciada com o controle explícito necessário para aplicações HPC de alto desempenho.
Resultados de Aprendizagem:
- Diferencie entre memória host paginável e fixa e identifique quando usar cada uma para velocidade de transferência ótima.
- Implemente alocação de memória de dispositivo e memória unificada/gerenciada usando APIs HIP (
hipMalloc,hipHostMalloc,hipMallocManaged). - Analise padrões de acesso à memória para garantir acesso agrupado e evitar gargalos de desempenho como acesso escalonado.
🔹 Aula 6: Streams, Eventos e Execução Assíncrona
Visão Geral: Esta aula conduz os desenvolvedores de um modelo de programação síncrona para uma mentalidade concorrente, focando em como maximizar a utilização da GPU por meio de streams e eventos HIP. Cobertura dos mecanismos de sobreposição de transferências de dados com execução de kernels via pipelines segmentadas e introdução das trade-offs entre captura de streams e construção explícita de grafos. Além disso, destaca considerações críticas para produção, incluindo o uso de bibliotecas seguras para grafos e temporização de alta precisão na GPU.
Resultados de Aprendizagem:
- Identifique os benefícios de desempenho da execução assíncrona e streams concorrentes em relação à execução síncrona.
- Implemente pipelines segmentadas para sobrepor comunicação host-dispositivo com computação de kernel.
- Diferencie entre captura de stream e construção explícita de gráfico para reduzir o overhead de lançamento.
🔹 Aula 7: Engenharia de Desempenho em GPUs da AMD
Visão Geral: Esta aula estabelece um quadro científico para otimizar software em hardware da AMD, indo além da tentativa e erro para uma abordagem sistemática e orientada por medições. Cobertura da relação arquitetural entre Unidades de Computação, wavefronts e pressão de registradores, enquanto fornece metodologias práticas para perfilamento com rocprofv3 e implementação de esqueletos robustos de benchmark.
Resultados de Aprendizagem:
- Implemente o fluxo de otimização HIP de 6 etapas para identificar e resolver gargalos de desempenho.
- Analise o trade-off entre pressão de registradores e ocupação para maximizar a utilização do hardware.
- Execute medições de desempenho precisas usando eventos de hardware e melhores práticas de benchmark com múltiplas iterações.
🔹 Aula 8: O Ecossistema de Bibliotecas ROCm
Visão Geral: Esta aula apresenta a filosofia de engenharia "primeiro biblioteca", priorizando bibliotecas ROCm altamente performáticas e pré-construídas em vez de desenvolvimento de kernels personalizados. Cobertura da categorização da pilha de bibliotecas ROCm (Matemática, FFT, Primitivas e ML/AI) e fornece um framework de decisão para escolher entre interfaces portáveis hip* e implementações nativas da AMD roc*. Além disso, os alunos explorarão os requisitos críticos de "segurança de gráfico" ao integrar bibliotecas em fluxos de captura de grafos HIP.
Resultados de Aprendizagem:
- Aplique o princípio de engenharia "primeiro biblioteca" para justificar o uso de primitivas pré-testadas em vez de kernels personalizados.
- Diferencie entre bibliotecas
hip*eroc*com base em requisitos de portabilidade e necessidades de desempenho. - Categorize bibliotecas ROCm em seus respectivos domínios funcionais (Matemática, FFT, Primitivas, ML/AI).
🔹 Aula 9: Portabilidade de Aplicações CUDA para HIP
Visão Geral: Esta aula aborda a transição sistemática de código-fonte CUDA para o framework C++ portável HIP. Os alunos aprenderão a executar um fluxo de portabilidade incremental usando ferramentas automatizadas como hipify-perl e hipify-clang, identificar armadilhas críticas de portabilidade como suposições específicas de hardware warpSize, e implementar um processo rigoroso de validação para comparar desempenho e correção após a migração.
Resultados de Aprendizagem:
- Execute o fluxo de portabilidade incremental de 6 etapas para minimizar o custo de depuração.
- Selecione e aplique a ferramenta de tradução automática apropriada (
hipify-perlvs.hipify-clang) com base na complexidade do código-fonte. - Identifique e resolva armadilhas de portabilidade sensíveis à arquitetura, especificamente aquelas envolvendo
warpSizee erros de tradução mecânica.
🔹 Aula 10: Depuração, Testes e Práticas em Produção
Visão Geral: Esta aula aborda as ferramentas e metodologias essenciais para levar kernels GPU do desenvolvimento para produção na plataforma ROCm. Detalha o uso do ROCgdb e do AddressSanitizer para detecção de erros, estabelece uma estratégia rigorosa de teste em quatro camadas e fornece uma checklist de produção para garantir correção do kernel e estabilidade de desempenho.
Resultados de Aprendizagem:
- Use ROCgdb, ltrace e AddressSanitizer para identificar bugs de nível de origem e erros de acesso à memória em código de GPU.
- Implemente uma estratégia de teste em quatro camadas para validar ajudantes, correção de kernels, casos extremos e regressões de desempenho.
- Aplique padrões de código em produção e checklists para gerenciar interfaces de kernel, documentação e depuração baseada em ambiente.