AMD ROCm GPU框架入门指南:从安装到第一个异构计算程序

1次阅读
没有评论

共计 2322 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

为什么选择 ROCm?

ROCm(Radeon Open Compute)是 AMD 推出的开源异构计算平台,与 NVIDIA CUDA 生态形成对标。其核心优势在于开源特性(MIT 许可证)和对消费级显卡(如 RX 系列)的支持。与 CUDA 相比,ROCm 的 HIP 编程层能实现 90% 以上的 CUDA 代码自动转换,大幅降低迁移成本。

AMD ROCm GPU 框架入门指南:从安装到第一个异构计算程序

环境搭建实战

系统准备

推荐使用 Ubuntu 20.04/22.04 LTS 系统,安装前必须执行:

  1. 禁用 nouveau 驱动(ROCm 与之冲突):
    sudo bash -c 'echo blacklist nouveau > /etc/modprobe.d/blacklist-nouveau.conf'
    sudo update-initramfs -u
  2. 安装基础依赖:
    sudo apt update && sudo apt install -y libnuma-dev curl

ROCm 安装

根据显卡架构选择版本(如 RDNA2 架构推荐 5.x+):

  1. 添加官方仓库:
    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
  2. 安装核心组件:
    sudo apt update && sudo apt install -y rocm-hip-sdk
  3. 验证安装:
    /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

性能调优初阶

  1. 使用 rocprof 工具分析核函数耗时
  2. 调整 block 大小(推荐 16×16 起步)
  3. 利用 hipMallocManaged 实现统一内存

进阶思考

  1. 如何通过 HIP Stream 实现计算与传输重叠?
  2. 尝试将示例代码扩展为支持 FP16 精度的版本
  3. 探索 rocBLAS 库中的 rocblas_sgemm 替代手写核函数

通过本文,你应该已经掌握了 ROCm 开发的基础流程。接下来可以尝试:
– 使用 ROCm-aware MPI 进行多机分布式训练
– 探索 PyTorch/TensorFlow 的 ROCm 后端支持
– 学习 AMD Infinity Fabric 在多 GPU 间的通信优化

正文完
 0
评论(没有评论)