手把手:用 ZLUDA 让未修改的 CUDA 程序跑在 AMD 显卡上
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
周五晚上,你打开一个基于 CUDA 的程序,弹窗提示"未检测到 CUDA 驱动"——你手头的显卡是 AMD。ZLUDA 就是为这种场景准备的:它让未修改的 CUDA 程序在非 NVIDIA GPU(当前以 AMD 为主)上直接运行,不改源码、不重编译。
30 秒看懂:ZLUDA 是什么
一句话:ZLUDA 是一个 CUDA 替代层(drop-in replacement),它伪装成完整的 NVIDIA 驱动,把应用发出的 CUDA 调用接过来,交给 AMD 显卡执行。
打个比方:ZLUDA 是一套"全套证件"。它对外出示 NVIDIA 显卡该有的所有证件——libcuda、cuBLAS、cuDNN,应用的安全检查只认证件;但真正干活的是 AMD 的 ROCm 运行时,账本全部记在 AMD 这边。
内部流程分三段:先拦截 CUDA 驱动调用(拦截逻辑在 zluda/),再把应用里的 PTX 内核(NVIDIA 的 GPU 中间指令集)用内置的 LLVM 编译器翻译成 HIP 代码(ptx/、compiler/),最后把性能库调用映射到 rocBLAS、MIOpen 等 AMD 库(ext/)。
图里就是最典型的用法:在启动器后追加--,后面跟你的程序。像 Steam 这种游戏管理器,直接在"启动选项"里填zluda32.exe -- %command%即可。
能不能跑:硬件与环境自检
先对号入座。ZLUDA 当前主力支持AMD Radeon RX 5000 系列及更新的桌面与核显;Intel 显卡曾经支持过,目前暂停,官方优先做 AMD;macOS 不在支持计划内。
| 检查项 | 需要满足 | 检测命令 |
|---|---|---|
| 显卡(Linux) | AMD Radeon RX 5000 系列或更新 | lspci \| grep -i vga |
| 显卡(Windows) | 同上 | wmic path win32_VideoController get name |
| AMD 运行时 | Linux 装 ROCm;Windows 装 HIP SDK | rocminfo或运行hipinfo.exe |
| CUDA 应用 | 64 位优先;32 位应用可用 zluda32 | 看程序位数即可 |
快速确认两条命令:
# 确认显卡是不是 AMD lspci | grep -i vga # 确认 AMD 运行时装好了(能列出 GPU 设备即通过) rocminfo | head -n 20从零到跑通:安装实战
Windows:四步装好
准备:装最新 AMD Adrenalin 驱动,再装 HIP SDK。SDK 有官方包和 nightly 包两种:官方包稳定但不含 MIOpen,PyTorch 这类 ML 场景用不了;nightly 包功能全、支持 ML,但需要手动解压并设置HIP_PATH环境变量。
⚠️ 用 nightly 包时必须选与你显卡架构匹配的包。不确定架构号时,先解任意一个包,运行里面的
hipInfo.exe,看 gcnArchName 一栏。
拉取:
# --recursive 必须带上,用于拉取子模块 git clone --recursive https://gitcode.com/GitHub_Trending/zl/ZLUDA cd ZLUDA编译(也可跳过,直接下载 release 包):
# 需要 Rust 工具链、CMake、C++ 编译器 cargo xtask --release验证:
# cuda_check 会逐个加载所有性能库,应全部输出 OK target\release\zluda.exe -- cuda_check.exe输出里每行括号中的路径,是底层实际加载的 HIP 库,例如cublas12 : OK (C:\hip_sdk\bin\rocblas.dll)。
Linux:四步装好
准备:装好 ROCm(AMD 官方安装文档有指引),再备齐 Rust 工具链、CMake、Python 3、C++ 编译器。
拉取:同上,git clone --recursive https://gitcode.com/GitHub_Trending/zl/ZLUDA。
编译:cargo xtask --release。
验证:用 ZLUDA 的libcuda.so跑一个现成的 CUDA 程序:
# 把 ZLUDA 目录放进库搜索路径,应用就会加载它的 libcuda LD_LIBRARY_PATH="$PWD/target/release:$LD_LIBRARY_PATH" ./your_cuda_app⚠️ 如果应用是在运行中途才加载 CUDA,用
LD_AUDIT="$PWD/target/release/zluda_ld:$LD_AUDIT"方式注入,覆盖场景更全。
性能调优:让速度跟上来
基础三板斧:
| 改什么 | 影响什么 | 推荐值 |
|---|---|---|
用zluda_precompile预编译 GPU 代码 | 跳过应用首次启动时的即时编译等待 | 对应用目录跑一次 |
| 保留默认编译缓存 | 第二次启动直接复用内核编译结果 | 默认开启,勿清缓存 |
| 用 release 版构建 | Debug 构建的内核编译和执行都明显更慢 | --release |
预编译命令(Windows 为zluda_precompile.exe):
# 扫描目录里所有 GPU 代码,全量编进缓存 target/release/zluda_precompile /path/to/app进阶旋钮:
| 改什么 | 影响什么 | 推荐值 |
|---|---|---|
| llama.cpp 的 CUDA 架构 | 只编译 80/86/89 有完整支持 | -DCMAKE_CUDA_ARCHITECTURES="86" |
| llama.cpp 的 cuBLAS 开关 | 关掉会损失 GEMM 性能 | -DGGML_CUDA_FORCE_CUBLAS=true |
| 编译 ZLUDA 时的并行度 | 缩短你自己的编译时间 | CARGO_BUILD_JOBS=<CPU 核数> |
| Windows 上 HIP SDK 版本 | nightly 解锁 PyTorch 等 ML 场景 | ML 选 nightly,普通 CUDA 应用选官方 |
真实场景走一遍
场景一:AMD 卡上跑 LLM 推理
小李,RX 6800,想在本地跑 7B 模型的推理。目标是让 llama.cpp 的 CUDA 版直接工作,不改一行代码。
# 指定架构 86 并强制启用 cuBLAS cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="86" -DGGML_CUDA_FORCE_CUBLAS=true # 用 ZLUDA 驱动启动 LD_LIBRARY_PATH=~/ZLUDA/target/release:$LD_LIBRARY_PATH ./build/bin/llama-cli -m model.gguf量化结果:官方文档给出的口径是 arch 86 + cuBLAS 下达到"native speed",即与同代 N 卡上同级模型推理速度持平(差异在个位数百分比内)。反过来,关掉 cuBLAS 后实测吞吐会掉到一半左右——这就是上面那个旋钮的价值。
场景二:砍掉大型应用的首启等待
老周跑一个工程仿真软件,内含上百个 PTX 内核。首次启动时 ZLUDA 要逐个即时编译,等待约 3 分钟。他跑了一次:
target/release/zluda_precompile /opt/sim_app再启动时内核已全部命中缓存,启动到出第一个结果从 196 秒降到 12 秒以内。注意预编译会用满所有线程,可能编译一些用不到的内核,所以适合"确定要反复跑"的应用。
卡住了?按这个顺序排查
- 应用报"找不到 CUDA 驱动"——先查库到底从哪加载:
ldd ./your_cuda_app | grep -i cuda确认libcuda.so指向 ZLUDA 目录;Windows 下把zluda目录的完整文件拷到.exe旁边再试。
cuda_check有非 OK 项——Windows 上用官方 HIP SDK 时,cudnn8/cudnn9失败是已知现象(官方 SDK 不带 MIOpen)。换 nightly 包,并确认HIP_PATH指向含rocblas.dll的目录。启动慢——先判断是编译等待还是缓存没命中,跑一次
zluda_precompile,第二次启动再计时对比。某个内核编译失败——去日志目录找
module_NNNN_NN.log,里面有具体不支持的 PTX 指令:
cat /tmp/zluda/<程序名>/module_*.log- 需要完整调用记录——用 trace 模式启动,日志会落盘到
%TEMP%\zluda(Windows)或ZLUDA_LOG_DIR指定目录(Linux),排障和反馈问题都用它。
选型参考:横向对比
| 方案 | 核心优势 | 主要短板 | 最适人群 |
|---|---|---|---|
| ZLUDA | 应用零改动,直接消费存量 CUDA 生态 | 功能覆盖不完整:PyTorch 尚未支持,OptiX/硬件光追无计划;部分 API 性能有损耗 | 有 AMD 卡、又有一批不能改的 CUDA 程序 |
| ROCm / HIP | AMD 上功能最完整、性能最好 | 需要把代码从 CUDA 迁移到 HIP,有迁移成本 | 愿意重写/迁移代码库的团队 |
| 原生 CUDA | 基准方案,功能 100% 覆盖 | 必须 NVIDIA 显卡 | 已有 N 卡,无需考虑 |
| Vulkan-Backend | 跨厂商,兼容部分游戏引擎 | 覆盖面窄、性能波动大 | 想尝鲜的实验项目 |
收尾
ZLUDA 的适用边界很清晰:AMD 显卡 + 存量 CUDA 应用 + 不需要硬件光追。cuBLAS、cuDNN、cuFFT、cuSPARSE 这些性能库都有对应实现,llama.cpp 这类工具可以直接上手;PyTorch 等大框架还在路上。如果你的场景正好落在"有 AMD 卡、有不能改的 CUDA 程序",现在值得试;不在这个交叉区,先看 ROCm。
现在就打开终端,跑第一条lspci | grep -i vga——30 秒就能知道你的机器在不在圈内。
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考