name: hip-rocm description: 用于跨平台GPU开发的AMD HIP和ROCm生态系统。执行hipify转换工具,生成HIP兼容的内核代码,处理CUDA/HIP API差异,配置ROCm工具链,并使用rocprof进行性能分析。 allowed-tools: Bash(*) 读取 写入 编辑 全局搜索 Grep 网络获取 metadata: author: babysitter-sdk version: “1.0.0” category: cross-platform backlog-id: SK-009
hip-rocm
您是hip-rocm - 一个专门用于AMD HIP和ROCm生态系统开发的技能。该技能为面向AMD GPU的跨平台GPU编程提供专家级能力。
概述
此技能支持AI驱动的AMD GPU开发,包括:
- 执行hipify转换工具(hipify-perl、hipify-clang)
- 生成HIP兼容的内核代码
- 处理CUDA/HIP API差异
- 配置ROCm工具链编译
- 使用rocprof和omniperf进行性能分析
- 支持MI100/MI200/MI300架构
- 维护单一源代码的NVIDIA/AMD代码
- 跨平台性能基准测试
前提条件
- ROCm 5.0+
- HIP运行时
- hipify工具
- AMD GPU(或支持HIP的NVIDIA GPU)
能力
1. CUDA到HIP转换
将CUDA代码转换为HIP:
# 使用hipify-perl(快速转换)
hipify-perl cuda_file.cu > hip_file.cpp
# 使用hipify-clang(更准确)
hipify-clang cuda_file.cu -o hip_file.cpp
# 批量转换
hipify-perl -inplace *.cu
hipconvertinplace.sh .
# 生成转换统计信息
hipify-perl --print-stats cuda_file.cu
# 排除特定模式
hipify-perl --skip-includes cuda_file.cu > hip_file.cpp
2. HIP内核开发
编写HIP兼容的内核:
#include <hip/hip_runtime.h>
// HIP内核(可移植到CUDA和AMD)
__global__ void vectorAdd(const float* a, const float* b, float* c, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
c[idx] = a[idx] + b[idx];
}
}
// 启动语法(与CUDA相同)
int main() {
// 分配内存
float *d_a, *d_b, *d_c;
hipMalloc(&d_a, size);
hipMalloc(&d_b, size);
hipMalloc(&d_c, size);
// 复制到设备
hipMemcpy(d_a, h_a, size, hipMemcpyHostToDevice);
hipMemcpy(d_b, h_b, size, hipMemcpyHostToDevice);
// 启动内核
int blockSize = 256;
int numBlocks = (n + blockSize - 1) / blockSize;
hipLaunchKernelGGL(vectorAdd, dim3(numBlocks), dim3(blockSize),
0, 0, d_a, d_b, d_c, n);
// 替代启动语法
vectorAdd<<<numBlocks, blockSize>>>(d_a, d_b, d_c, n);
// 同步并复制回主机
hipDeviceSynchronize();
hipMemcpy(h_c, d_c, size, hipMemcpyDeviceToHost);
// 清理
hipFree(d_a);
hipFree(d_b);
hipFree(d_c);
}
3. API兼容性宏
处理CUDA/HIP差异:
// 平台检测
#ifdef __HIP_PLATFORM_AMD__
// AMD特定代码
#elif defined(__HIP_PLATFORM_NVIDIA__)
// NVIDIA HIP代码
#elif defined(__CUDA_ARCH__)
// CUDA特定代码
#endif
// 通用兼容性头文件
#if defined(__HIPCC__) || defined(__HIP__)
#include <hip/hip_runtime.h>
#define DEVICE_SYNC hipDeviceSynchronize
#define MALLOC hipMalloc
#define FREE hipFree
#define MEMCPY hipMemcpy
#else
#include <cuda_runtime.h>
#define DEVICE_SYNC cudaDeviceSynchronize
#define MALLOC cudaMalloc
#define FREE cudaFree
#define MEMCPY cudaMemcpy
#endif
// 线程束大小处理
#ifdef __HIP_PLATFORM_AMD__
#define WARP_SIZE 64 // AMD波前
#else
#define WARP_SIZE 32 // NVIDIA线程束
#endif
4. ROCm编译
编译HIP代码:
# 为AMD GPU编译
hipcc -o program program.cpp
# 指定目标架构
hipcc --offload-arch=gfx90a -o program program.cpp # MI200
hipcc --offload-arch=gfx942 -o program program.cpp # MI300
# 多目标
hipcc --offload-arch=gfx908 --offload-arch=gfx90a -o program program.cpp
# 带优化
hipcc -O3 -o program program.cpp
# 生成汇编
hipcc -S --offload-arch=gfx90a program.cpp
# 详细编译
hipcc -v -o program program.cpp
# CMake配置
set(CMAKE_CXX_COMPILER hipcc)
set(GPU_TARGETS "gfx90a" CACHE STRING "GPU架构")
5. 使用rocprof进行性能分析
分析AMD GPU应用程序:
# 基本性能分析
rocprof ./program
# 收集特定指标
rocprof -i metrics.txt ./program
# 生成跟踪
rocprof --hip-trace ./program
rocprof --hsa-trace ./program
# 系统跟踪
rocprof --sys-trace ./program
# 导出到JSON
rocprof --stats --json ./program
# 指标文件示例(metrics.txt)
# pmc: SQ_WAVES, SQ_INSTS_VALU, SQ_INSTS_SMEM
# pmc: TCC_HIT_sum, TCC_MISS_sum
6. Omniperf分析
深度性能分析:
# 分析应用程序
omniperf profile -n workload_name ./program
# 分析性能数据
omniperf analyze -p workload_name
# 基于Web的GUI
omniperf analyze -p workload_name --gui
# 比较性能数据
omniperf analyze -p baseline -p optimized --compare
# 特定分析部分
omniperf analyze -p workload_name --metric-set memory
omniperf analyze -p workload_name --metric-set compute
7. 架构特定优化
针对AMD架构优化:
// 波前感知编程(64线程波前)
__device__ int waveReduceSum(int val) {
#pragma unroll
for (int offset = 32; offset > 0; offset >>= 1) {
val += __shfl_down(val, offset);
}
return val;
}
// 高效使用LDS(本地数据共享)
__shared__ __align__(16) float lds[256];
// AMD内存合并(256字节粒度)
__global__ void coalescedKernel(float4* data, int n) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < n) {
float4 val = data[idx]; // 16字节对齐加载
// 处理...
data[idx] = val;
}
}
// 架构特定内核
#if __gfx90a__ || __gfx942__
// MI200/MI300优化
// 使用矩阵核心(MFMA指令)
#elif __gfx908__
// MI100优化
#endif
8. hipBLAS和rocBLAS
GPU数学库:
#include <hipblas/hipblas.h>
// 或ROCm原生
#include <rocblas/rocblas.h>
hipblasHandle_t handle;
hipblasCreate(&handle);
// GEMM操作
float alpha = 1.0f, beta = 0.0f;
hipblasSgemm(handle,
HIPBLAS_OP_N, HIPBLAS_OP_N,
M, N, K,
&alpha,
d_A, M,
d_B, K,
&beta,
d_C, M);
// 带显式流的rocBLAS
rocblas_handle roc_handle;
rocblas_create_handle(&roc_handle);
rocblas_set_stream(roc_handle, stream);
rocblas_sgemm(roc_handle,
rocblas_operation_none, rocblas_operation_none,
M, N, K,
&alpha, d_A, M, d_B, K, &beta, d_C, M);
9. RCCL集合操作
AMD的NCCL等效库:
#include <rccl/rccl.h>
// 初始化RCCL(与NCCL相同API)
rcclComm_t comm;
rcclUniqueId id;
rcclGetUniqueId(&id);
rcclCommInitRank(&comm, worldSize, id, rank);
// 全归约
rcclAllReduce(sendbuff, recvbuff, count, rcclFloat, rcclSum, comm, stream);
// 清理
rcclCommDestroy(comm);
流程集成
此技能与以下流程集成:
hip-porting-cross-platform.js- 跨平台移植multi-gpu-programming.js- 多GPU开发
输出格式
{
"operation": "hipify",
"status": "success",
"input_files": ["kernel.cu", "main.cu"],
"output_files": ["kernel.cpp", "main.cpp"],
"conversion_stats": {
"cuda_calls_converted": 45,
"manual_review_needed": 3,
"warnings": ["__shfl_sync无法直接移植到HIP"]
},
"target_architectures": ["gfx90a", "gfx942"],
"recommendations": [
"检查归约内核中的波前大小(64 vs 32)",
"考虑使用rocBLAS进行BLAS操作"
]
}
依赖项
- ROCm 5.0+
- HIP运行时
- hipify-perl或hipify-clang
- rocprof/omniperf(用于性能分析)
限制
- 线程束/波前大小不同(32 vs 64)
- 某些CUDA内置函数需要手动移植
- 纹理内存API不同
- CUDA特定功能可能无法移植