mcpField
H
hip-rocm

hip-rocm

github.com/mohitmishra786开发269295 次安装18 周前更新
代码仓库

关于 hip-rocm

hip-rocm 是一项指导 Agent 使用 HIP 和 ROCm 进行 AMD GPU 编程的技能,适合编写 HIP 内核或移植 CUDA 项目的开发者。内容涉及工具链、HIPIFY、性能分析、调试及 MI300X 优化。

主要功能

  1. 01HIP 内核编写与编译
  2. 02使用 HIPIFY 移植 CUDA
  3. 03ROCm 工具链配置
  4. 04rocprof 性能分析
  5. 05rocgdb 调试
  6. 06MI300X 优化指导

适用场景

  1. 01将现有 CUDA 代码移植到 AMD GPU
  2. 02在 Linux 上配置 ROCm
  3. 03分析 HIP 应用的内核性能
  4. 04调试设备错误并调整 MI300X 程序

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill hip-rocm

安装后在 Claude Code 中输入/hip-rocm确认已加载。

详细介绍

HIP / ROCm

用途

指导 Agent 使用 HIP 进行 AMD GPU 编程:HIP 运行时 API、hipcc 编译、使用 HIPIFY(hipify-perl、hipify-clang)移植 CUDA 代码、ROCm 工具链设置、使用 rocprof 进行性能分析、使用 rocgdb 调试、HIP 与 CUDA API 映射,以及针对 MI300X 的优化。

适用场景

  • 将现有 CUDA 代码库移植到 AMD GPU
  • 在 Linux 上为 MI200/MI300 硬件设置 ROCm
  • 为 AMD 数据中心 GPU 编写原生 HIP 内核
  • 使用 rocprof 或 rocprofiler-sdk 对 HIP 应用进行性能分析
  • 使用 rocgdb 或计算消毒器调试设备故障
  • 使用 HIP 可移植性宏构建多厂商 GPU 代码

工作流

1. 安装并验证 ROCm
# Ubuntu/Debian (check ROCm docs for your distro version)
sudo apt install rocm-dev rocm-libs hip-dev

# Verify
rocminfo | head -30
hipconfig --version
hipcc --version

# List devices
rocm-smi

设置编译用的 GPU 目标:

export AMDGPU_TARGETS=gfx942   # MI300X
export HIP_PLATFORM=amd
2. 最简 HIP 内核
// vector_add.hip
#include <hip/hip_runtime.h>
#include <stdio.h>

__global__ void vector_add(const float *a, const float *b, float *c, int n) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < n)
        c[i] = a[i] + b[i];
}

int main(void) {
    const int n = 1 << 20;
    size_t bytes = n * sizeof(float);
    float *d_a, *d_b, *d_c;

    hipMalloc(&d_a, bytes);
    hipMalloc(&d_b, bytes);
    hipMalloc(&d_c, bytes);

    int threads = 256;
    int blocks = (n + threads - 1) / threads;
    hipLaunchKernelGGL(vector_add, dim3(blocks), dim3(threads), 0, 0,
                       d_a, d_b, d_c, n);
    hipDeviceSynchronize();

    hipFree(d_a); hipFree(d_b); hipFree(d_c);
    return 0;
}
hipcc -O3 --offload-arch=gfx942 -o vector_add vector_add.hip
./vector_add
3. 使用 HIPIFY 移植 CUDA → HIP
# Perl-based batch converter (quick port)
hipify-perl cuda_kernel.cu > cuda_kernel.hip

# Clang-based (more accurate, preserves structure)
hipify-clang cuda_project/ -o hip_project/ --cuda-path=/usr/local/cuda

# Convert single file in place
hipify-clang -inplace --cuda-path=/usr/local/cuda main.cu

常见 API 映射:

CUDAHIP
cudaMallochipMalloc
cudaMemcpyhipMemcpy
cudaMemcpyAsynchipMemcpyAsync
cudaStream_thipStream_t
<<<grid, block>>>hipLaunchKernelGGL 或 <<<>>>(HIP 支持 CUDA 语法)
__syncthreads()__syncthreads()(相同)
threadIdx / blockIdx相同的内置变量

用于双重编译的可移植性头文件:

#ifdef __HIP_PLATFORM_AMD__
#include <hip/hip_runtime.h>
#else
#include <cuda_runtime.h>
#define hipMalloc cudaMalloc
#define hipMemcpy cudaMemcpy
// ... more macros
#endif
4. hipcc 标志
# Target specific GPU architecture
hipcc --offload-arch=gfx942 -O3 -o app main.hip

# Multiple architectures
hipcc --offload-arch=gfx90a --offload-arch=gfx942 -o app main.hip

# Debug
hipcc -g -O0 --offload-arch=gfx942 -o app_debug main.hip

# Link with rocBLAS
hipcc -lrocblas -o app main.hip
5. 使用 rocprof 进行性能分析
# Basic kernel trace
rocprof --stats ./app

# CSV metrics output
rocprof -i input.csv -o output.csv ./app

# input.csv example:
# pmc: SQ_INSTS_VALU_ADD_F32,SQ_INSTS_VALU_MUL_F32,GRBM_COUNT
# ROCm 6.x rocprofiler-sdk (preferred for new projects)
rocprofv3 --kernel-trace -- ./app

关键指标(AMD 术语):

  • VALU 利用率 — 计算单元活动度
  • LDS bank 冲突 — 共享内存(LDS)停顿
  • 内存吞吐量 — HBM 带宽利用率
6. 使用 rocgdb 调试
# Build with debug symbols
hipcc -g -O0 --offload-arch=gfx942 -o app_debug main.hip

rocgdb ./app_debug
(rocgdb) break vector_add
(rocgdb) run
(rocgdb) info rocm kernels
(rocgdb) rocm thread 0 0 0
(rocgdb) print i

AMD 还通过 ROCm 的 roc-obj-extract 和可用的内存检查工具提供与 compute-sanitizer 等效的工具。

7. MI300X 优化
# Enable MFMA (matrix fused multiply-add) instructions
hipcc --offload-arch=gfx942 -munsafe-fp-atomics -O3 -o app main.hip
优化MI300X 注意事项
矩阵运算GEMM 使用 rocBLAS/hipBLASLt;自定义运算使用 MFMA 内部函数
HBM 带宽峰值约为 5.3 TB/s(MI300X)——尽可能提高内存合并访问率,以接近峰值
Wavefront 大小64 个线程(CUDA warp 为 32)——调整归约模式
LDS(共享内存)每个 CU 为 64 KB;注意 bank 冲突

考虑 Wavefront 的归约:

__device__ float warp_reduce_sum(float val) {
    // AMD wavefront = 64 lanes
    for (int offset = 32; offset > 0; offset >>= 1)
        val += __shfl_down(val, offset);
    return val;
}
8. 库生态
NVIDIAAMD ROCm
cuBLASrocBLAS / hipBLAS
cuDNNMIOpen
NCCLrccl
ThrusthipCUB(可移植)
cuFFTrocFFT
hipcc -lrocblas -o gemm_test gemm.hip

常见问题

症状原因解决方法
hipErrorNoDeviceROCm 驱动未加载检查 rocm-smi;将用户添加到 render 组
架构二进制文件错误gfx* 目标不匹配使用 rocminfo → 设置 --offload-arch
hipify 移植不完整CUDA 专属 API手动修复:协作组、纹理引用
比 CUDA 参考实现慢Wavefront 为 64,warp 为 32将块大小调整为 64 的倍数
HSA_STATUS_ERRORGPU 忙或内存不足使用 rocm-smi --showmeminfo;减少分配
rocprof 输出为空未启动内核启动后验证 hipGetLastError()

相关技能

  • skills/gpu/cuda — 被移植的 CUDA 源代码模式
  • skills/gpu/cuda-profiling — Nsight 概念与 rocprof 的对应关系
  • skills/gpu/gpu-memory-model — Wavefront 与 warp、合并访问规则
  • skills/gpu/triton-lang — Triton 通过 ROCm 后端支持 AMD
  • skills/compilers/llvm — HIP 使用 Clang/LLVM 工具链

评论

支持 Markdown