ROCm与HIP编程入门:实用教程
一份实用且现代的AMD GPU编程指南,涵盖ROCm和HIP。内容包括完整的软件栈、安装流程、构建工作流、内核编程、内存管理、性能工程、库使用、CUDA迁移以及生产环境调试实践。
课程概述
📚 内容概要
一本实用且现代的 AMD GPU 编程指南,涵盖 ROCm 与 HIP。内容包括完整的软件栈、安装流程、构建工作流、内核编程、内存管理、性能工程、库使用、CUDA 迁移以及生产环境下的调试实践。
通过本次技术深度解析,掌握 AMD GPU 编程与 CUDA 到 HIP 的可移植性。
作者: EvoClass
致谢: 基于 AMD 官方 ROCm 与 HIP 文档资料,包括 ROCm、HIP 及 ROCm LLVM 等项目。
🎯 学习目标
- 用一句简洁的话定义 HIP 及其在 ROCm 生态系统中的角色。
- 区分 ROCm(平台)、HIP(接口)和 ROCm 库(构建模块)之间的差异。
- 识别从硬件到应用框架的 ROCm 架构分层结构。
- 定义 HIP SDK 与不同操作系统下 ROCm 平台之间的关系。
- 执行系统化的安装流程,包括支持矩阵验证和安装后路径配置。
- 编译并运行一个最小验证程序,以排查常见的驱动与环境访问问题。
- 理解稳健的构建策略对于平衡源码可移植性与架构特定性能的重要性。
- 使用
hipLaunchKernelGGL宏实现可移植的内核启动,作为 CUDA 三重尖括号语法的替代方案。 - 配置面向生产的 CMake 项目,针对特定 ROCm 架构并管理外部库依赖。
- 描述 HIP 内核的组成结构,并应用基本的线程索引执行公式。
🔹 第 1 课:ROCm 与 HIP 架构简介
概述: 本课程提供 ROCm 平台与 HIP 编程语言的基础概述。阐明完整 ROCm 堆栈、HIP 接口与高层库之间的关系,同时建立对 CUDA 向 AMD 迁移及性能工程的合理预期。
学习成果:
- 用一句简洁的话定义 HIP 及其在 ROCm 生态系统中的角色。
- 区分 ROCm(平台)、HIP(接口)和 ROCm 库(构建模块)之间的差异。
- 识别从硬件到应用框架的 ROCm 架构分层结构。
🔹 第 2 课:安装与环境设置
概述: 本课程指导 GPU 开发者与高性能计算(HPC)工程师在 Linux 与 Windows 平台上设置 HIP 就绪环境。强调“平台现实”方法——开发者必须在进行结构化安装流程前验证软硬件兼容性,并通过 hipcc 编译器完成最终验证。
学习成果:
- 定义 HIP SDK 与不同操作系统下 ROCm 平台之间的关系。
- 执行系统化的安装流程,包括支持矩阵验证和安装后路径配置。
- 编译并运行一个最小验证程序,以排查常见的驱动与环境访问问题。
🔹 第 3 课:构建工具链:hipcc 与项目布局
概述: 本课程探讨在 AMD 硬件上开发 HIP 应用所需的核心工具链与组织策略。引导开发者从使用 hipcc 驱动的简单命令行构建,过渡到基于 CMake 的专业、生产就绪项目配置。重点包括可移植内核启动宏、架构特定优化,以及源码级可移植性与二进制性能之间关键区别的理解。
学习成果:
- 理解稳健的构建策略对于平衡源码可移植性与架构特定性能的重要性。
- 使用
hipLaunchKernelGGL宏实现可移植的内核启动,作为 CUDA 三重尖括号语法的替代方案。 - 配置面向生产的 CMake 项目,针对特定 ROCm 架构并管理外部库依赖。
🔹 第 4 课:HIP 编程模型与内核开发
概述: 本课程深入探讨 HIP 内核的基本架构,聚焦如何通过网格与线程块将逻辑问题映射到硬件执行。提供稳健的 GPU 编程蓝图,涵盖基本执行公式、性能瓶颈(内存与计算)、以及为生产就绪代码强制实现错误检查与同步机制。
学习成果:
- 描述 HIP 内核的组成结构,并应用基本的线程索引执行公式。
- 有效配置网格与线程块大小,并通过基准测试找到最优吞吐量。
- 实现健壮的错误处理宏,并应用同步语义以管理设备与主机间的交互。
🔹 第 5 课:内存管理与数据模式
概述: 本课程聚焦 GPU 编程的核心支柱——内存管理。涵盖内存类型分类(可分页、固定、设备、统一/托管内存)、数据传输机制的性能影响,以及内存访问模式(特别是合并访问)在实现峰值性能中的关键作用。学员将学会在托管内存带来的易用性与高性能 HPC 应用所需的显式控制之间取得平衡。
学习成果:
- 区分可分页与固定主机内存,并确定在何种场景下使用以获得最佳传输速度。
- 使用 HIP API(
hipMalloc、hipHostMalloc、hipMallocManaged)实现设备内存分配与统一/托管内存。 - 分析内存访问模式以确保合并访问,避免如步进访问等性能瓶颈。
🔹 第 6 课:流、事件与异步执行
概述: 本课程引导开发者从同步编程模型转向并发思维,聚焦如何通过 HIP 流与事件最大化 GPU 利用率。涵盖通过分块流水线实现数据传输与内核执行重叠的机制,介绍流捕获与显式图构建之间的权衡。此外,还强调关键的生产环境考量,包括图安全库的使用和 GPU 上的高精度计时。
学习成果:
- 识别异步执行与并发流相比同步执行所带来的性能优势。
- 实现分块流水线,以重叠主机到设备通信与内核计算。
- 区分流捕获与显式图构建,以降低启动开销。
🔹 第 7 课:AMD GPU 上的性能工程
概述: 本课程建立一套科学的软件优化框架,用于在 AMD 硬件上进行优化,摆脱盲目猜测,采用系统化、基于测量的方法。涵盖计算单元、波前与寄存器压力之间的架构关系,并提供使用 rocprofv3 进行分析的实用方法,以及构建稳健基准测试骨架的实践技巧。
学习成果:
- 实施六步式 HIP 优化流程,以识别并解决性能瓶颈。
- 分析寄存器压力与占用率之间的权衡,以最大化硬件利用率。
- 使用硬件事件和多迭代基准测试的最佳实践,执行准确的性能测量。
🔹 第 8 课:ROCm 库生态系统
概述: 本课程引入“库优先”的工程理念,优先选择高性能、预构建的 ROCm 库,而非自定义内核开发。涵盖 ROCm 库堆栈的分类(数学、FFT、原语、机器学习/人工智能),并提供在可移植的 hip* 接口与 AMD 原生的 roc* 实现之间进行选择的决策框架。此外,学员还将探索在将库集成到 HIP 图捕获工作流中时,“图安全”这一关键要求。
学习成果:
- 应用“库优先”工程原则,证明使用经过充分测试的原语优于自定义内核。
- 根据可移植性需求与性能要求,区分
hip*与roc*库。 - 将 ROCm 库按其功能领域(数学、FFT、原语、机器学习/人工智能)进行分类。
🔹 第 9 课:将 CUDA 应用迁移到 HIP
概述: 本课程系统讲解将 CUDA 源代码迁移至可移植的 HIP C++ 框架的过程。学员将学习使用自动化工具(如 hipify-perl 与 hipify-clang)执行增量迁移工作流,识别关键的可移植性陷阱(如对硬件特定的 warpSize 假设),并实施严格的验证流程,以对比迁移后的性能与正确性。
学习成果:
- 执行六步式增量迁移工作流,以最小化调试开销。
- 根据源码复杂度,选择并应用合适的自动化转换工具(
hipify-perl与hipify-clang)。 - 识别并解决与架构相关的“可移植性陷阱”,特别是涉及
warpSize和机械翻译错误的问题。
🔹 第 10 课:调试、测试与生产实践
概述: 本课程涵盖将 GPU 内核从开发阶段推向生产环境所必需的工具与方法。详细说明使用 ROCgdb 与 AddressSanitizer 进行错误检测,建立严谨的四层测试策略,并提供生产检查清单,以确保内核的正确性与性能稳定性。
学习成果:
- 使用 ROCgdb、ltrace 与 AddressSanitizer 识别 GPU 代码中的源码级错误与内存访问错误。
- 实施 四层测试策略,以验证辅助函数、内核正确性、边界情况与性能退化。
- 应用 生产代码模式 与检查清单,管理内核接口、文档编写以及基于环境的调试。