需用 hip api 替换 cuda 调用,通过 hipcc 编译并链接 rocm 运行时库;依赖兼容的 linux 发行版与匹配的驱动/rocm 版本;__global__ 函数须在 .cpp/.hip 文件中定义,禁用 stl、异常等 host 特性;动态库路径缺失需配置 ld_library_path 或 ldconfig。

怎么用 C++ 写 HIP 程序跑在 AMD GPU 上
能,但不是直接写 C++ 就行——得用 HIP API 替换 CUDA 调用,且编译链必须走 hipcc 或配置好 clang + hip-runtime。HIP 不是语法糖,它是 AMD 提供的 C++ 运行时抽象层,核心逻辑和 CUDA 高度相似,但头文件、函数名、启动语法都不同。
常见错误现象:undefined reference to 'hipLaunchKernel'(没链接 hiprtc 或 hip_hcc)、hipErrorNoDevice(驱动没装或 ROCm 版本不匹配)、__global__ 报错(用了 CUDA 语法但没用 hipcc 编译)。
- 必须用 ROCm 支持的 Linux 发行版(Ubuntu 20.04/22.04、RHEL 8/9),Windows 和 macOS 不支持 HIP
- 驱动和 ROCm 版本强绑定,比如 ROCm 5.7 要求
amdgpu-pro内核模块或特定开源内核补丁,不能混用新版内核+旧 ROCm -
hipcc是推荐入口,它会自动选对clang、加-x hip、链接正确 runtime 库;手动用clang++ -x hip容易漏-L/opt/rocm/lib或-lhip_hcc
hipMalloc / hipMemcpy / hipLaunchKernel 怎么对应 CUDA
HIP 函数名基本是把 cuda 换成 hip,但行为细节有差异,不能无脑替换。
使用场景:从 CUDA 移植代码时,最常改这三类调用;新写 HIP 程序也绕不开它们。
-
hipMalloc和cudaMalloc语义一致,但分配的内存默认是“可分页”(pageable),如需 pinned memory 得用hipHostMalloc(对应cudaHostAlloc) -
hipMemcpy第四个参数是hipMemcpyKind,值和cudaMemcpyKind一样(如hipMemcpyHostToDevice),但传错会静默失败,不报错 -
hipLaunchKernel启动 kernel 更底层,比kernel>>()多一层封装;新手建议用 HIP 的 kernel 启动宏:hipLaunchKernelGGL(带 grid/block/dim 参数),或更简单的kernel_name>>()—— 这个语法需要#include <hip></hip>且用hipcc编译
为什么写了 __global__ 还编译不过
因为 __global__ 不是标准 C++,是 HIP(和 CUDA)的扩展关键字,必须由支持 HIP 的编译器识别。
性能 / 兼容性影响:用错编译器会导致符号未定义、kernel 不执行、甚至段错误;HIP kernel 里不能调用 STL 容器(如 std::vector),也不能用 C++ 异常、RTTI、虚函数——这些在 device code 中不支持。
- 必须用
hipcc,或clang++ -x hip -I/opt/rocm/include -L/opt/rocm/lib -lhip_hcc -
__global__函数必须定义在 .cpp 或 .hip 文件中(不能只在头文件里声明后 extern),否则链接时报undefined symbol - kernel 参数只能是基本类型、指针、POD 结构体;传
std::string或 lambda 会编译失败 - ROCm 6.0+ 开始支持部分 C++17 特性(如
constexpr if),但老版本只支持 C++14,hipcc --version要查清楚
运行时找不到 libamdhip64.so 怎么办
这是典型的动态库路径缺失,不是代码问题,而是环境没配好。
常见错误现象:error while loading shared libraries: libamdhip64.so: cannot open shared object file,即使 hipcc 编译成功也会挂在这里。
- 确认 ROCm 已安装:检查
/opt/rocm/lib/libamdhip64.so是否存在;不存在说明安装不完整(比如只装了hip-base没装rocm-device-libs) - 临时解决:运行前执行
export LD_LIBRARY_PATH=/opt/rocm/lib:$LD_LIBRARY_PATH - 永久解决:在
/etc/ld.so.conf.d/rocm.conf里加一行/opt/rocm/lib,再运行sudo ldconfig - 容器场景(如 docker):必须用
--device=/dev/kfd --device=/dev/dri --group-add video,且镜像里要预装对应 ROCm runtime,不能只拷二进制
最常被忽略的是权限:非 root 用户需要加入 video 和 render 组才能访问 GPU 设备节点,否则 hipInit(0) 返回 hipErrorInitializationError,而不是更具体的提示。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











