共计 2322 个字符,预计需要花费 6 分钟才能阅读完成。
为什么选择 ROCm?
ROCm(Radeon Open Compute)是 AMD 推出的开源异构计算平台,与 NVIDIA CUDA 生态形成对标。其核心优势在于开源特性(MIT 许可证)和对消费级显卡(如 RX 系列)的支持。与 CUDA 相比,ROCm 的 HIP 编程层能实现 90% 以上的 CUDA 代码自动转换,大幅降低迁移成本。

环境搭建实战
系统准备
推荐使用 Ubuntu 20.04/22.04 LTS 系统,安装前必须执行:
- 禁用 nouveau 驱动(ROCm 与之冲突):
sudo bash -c 'echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf' sudo update-initramfs -u - 安装基础依赖:
sudo apt update && sudo apt install -y libnuma-dev curl
ROCm 安装
根据显卡架构选择版本(如 RDNA2 架构推荐 5.x+):
- 添加官方仓库:
curl -fsSL https://repo.radeon.com/rocm/rocm.gpg.key | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/rocm.gpg echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/5.7 ubuntu main' | sudo tee /etc/apt/sources.list.d/rocm.list - 安装核心组件:
sudo apt update && sudo apt install -y rocm-hip-sdk - 验证安装:
/opt/rocm/bin/rocminfo | grep -i 'gpu'应显示检测到的 GPU 设备信息
第一个 HIP 程序:矩阵乘法
代码结构解析
#include <hip/hip_runtime.h>
// HIP 核函数(类比 CUDA 的__global__)__global__ void matrixMul(float *C, float *A, float *B, int M, int N, int K) {
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
if (row < M && col < K) {
float sum = 0.0f;
for (int i = 0; i < N; ++i) {sum += A[row * N + i] * B[i * K + col];
}
C[row * K + col] = sum;
}
}
int main() {
// 矩阵维度设置
constexpr int M = 1024, N = 1024, K = 1024;
// 主机内存分配
float *h_A = new float[M*N], *h_B = new float[N*K], *h_C = new float[M*K];
// 设备内存分配(hipMalloc 替代 cudaMalloc)float *d_A, *d_B, *d_C;
hipMalloc(&d_A, M*N*sizeof(float));
hipMalloc(&d_B, N*K*sizeof(float));
hipMalloc(&d_C, M*K*sizeof(float));
// 数据传输(hipMemcpy 参数顺序与 CUDA 一致)hipMemcpy(d_A, h_A, M*N*sizeof(float), hipMemcpyHostToDevice);
hipMemcpy(d_B, h_B, N*K*sizeof(float), hipMemcpyHostToDevice);
// 执行配置(HIP 使用与 CUDA 相同的 dim3 结构)dim3 block(16, 16);
dim3 grid((K + block.x - 1) / block.x, (M + block.y - 1) / block.y);
// 启动核函数
hipLaunchKernelGGL(matrixMul, grid, block, 0, 0, d_C, d_A, d_B, M, N, K);
// 结果回传
hipMemcpy(h_C, d_C, M*K*sizeof(float), hipMemcpyDeviceToHost);
// 资源释放
hipFree(d_A); hipFree(d_B); hipFree(d_C);
delete[] h_A; delete[] h_B; delete[] h_C;
return 0;
}
关键差异说明
- 头文件:
hip/hip_runtime.h替代cuda_runtime.h - API 前缀:
hip替代cuda(如 hipMalloc) - 核函数启动:
hipLaunchKernelGGL替代三重尖括号语法
常见问题解决
编译时报错
若出现error: rocblas.h not found:
sudo apt install rocblas
并在编译命令添加:
-I/opt/rocm/include -L/opt/rocm/lib -lrocblas -lamdhip64
多 GPU 选择
通过环境变量指定设备:
export HIP_VISIBLE_DEVICES=0,1 # 使用前两块 GPU
性能调优初阶
- 使用
rocprof工具分析核函数耗时 - 调整 block 大小(推荐 16×16 起步)
- 利用
hipMallocManaged实现统一内存
进阶思考
- 如何通过 HIP Stream 实现计算与传输重叠?
- 尝试将示例代码扩展为支持 FP16 精度的版本
- 探索 rocBLAS 库中的
rocblas_sgemm替代手写核函数
通过本文,你应该已经掌握了 ROCm 开发的基础流程。接下来可以尝试:
– 使用 ROCm-aware MPI 进行多机分布式训练
– 探索 PyTorch/TensorFlow 的 ROCm 后端支持
– 学习 AMD Infinity Fabric 在多 GPU 间的通信优化
正文完
