ZLUDA 使用指南:让 AMD 显卡跑 CUDA 应用
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
在没有 NVIDIA 显卡的机器上,绝大多数 CUDA 程序要么启动即报错,要么装完 PyTorch 之后torch.cuda.is_available()直接返回 False。ZLUDA 干的事很具体:把 CUDA 驱动和性能库"顶"在你的 AMD 显卡上,让原本没改过一行的 CUDA 应用照常加载、照常编译、照常跑,且不需要重写代码。它本质上是一套 CUDA 的替身——应用照旧调用libcuda,ZLUDA 在背后把这些调用翻译成 AMD 的 HIP 实现(ROCm/HIP SDK 提供)。
先说明它现在的支持范围,免得你白折腾。
先确认你的显卡和系统是否在支持列表里
ZLUDA 当前只认真正较新的 AMD 桌面和核显 GPU,从 RX 5000 系列往上算,再往前的 Polaris、Vega 这些老架构以及服务器卡都不支持(这些架构差异太大,官方明确不做)。Intel 显卡早期有过后端,但现在处于搁置状态,团队精力集中在 AMD 上;NVIDIA 显卡本身有原生 CUDA,不在规划内;macOS 也基本可以排除。另外它不基于 OpenCL 或 Vulkan 做通用回退——那样会丢一堆特性(比如非规范化数模式、子组操作、内联汇编、指针强转等),而且 cuBLAS/cuDNN 这类库也很难映射过去,所以它的通用性依赖 AMD 的原生 HIP 后端。
一句话自查:Windows 或 Linux + RX 5000 及更新的 AMD 卡,才值得往下走。
Windows 与 Linux 上如何启动一个 CUDA 应用
装好驱动之后,两个系统的启动方式都是"把 ZLUDA 塞到应用加载 CUDA 的路径里"。
- Windows:先装 AMD 显卡驱动(Adrenalin),再装 HIP SDK。装完用 ZLUDA 自带的启动器去拉起你的程序即可:
<ZLUDA目录>\zluda.exe -- <你的程序> <程序参数>也可以把zluda目录下的nvcuda.dll等文件直接拷到应用读取 CUDA 的目录(通常是 exe 旁边)。这里有个容易踩的坑:HIP SDK 的官方包不带 MIOpen,所以 cudnn8/cudnn9 会加载失败,PyTorch、TensorFlow 这类需要 MIOpen 的框架在 Windows 上要改用带 MIOpen 的 Nightly 构建(therock-dist-windows-gfx<架构号>那个包,解压后把HIP_PATH指过去)。GPU 架构号不确定时,可以先随便下个包跑一下里面的hipInfo.exe看gcnArchName。
- Linux:不需要装 HIP SDK 到系统路径,直接用环境变量把 ZLUDA 提供的
libcuda.so插到动态链接器前面:
LD_LIBRARY_PATH="<ZLUDA目录>:$LD_LIBRARY_PATH" ./你的程序 参数<ZLUDA目录>指你下载好的zluda包目录,或是自己编译出的target/release。另一种等价写法是用LD_AUDIT指向zluda_ld,效果一样,二选一即可。
两种平台共同点:应用不用改,改的是"它加载哪个 CUDA"。
用 cuda_check 和 trace 确认它真的在工作
跑起来不等于跑对了。ZLUDA 附带一个小程序,专门用来验证驱动和各个性能库(cuBLAS、cuDNN、cuFFT、cuSPARSE 等)是不是都成功顶上了。在 Windows 上:
zluda.exe -- cuda_check.exe正常的话每一行都会打OK,括号里是它实际顶替的 HIP SDK 库路径(比如cublas12顶到了rocblas.dll、cudnn9顶到了MIOpen.dll)。哪一行不是OK,基本就能定位到缺哪个库。注意官方 HIP SDK 下 cudnn8/cudnn9 会失败,这是预期内的;另外cuda_check偶尔会因为 MIOpen 的 bug 卡住不退,别当成 ZLUDA 挂了。
确认"在跑"之后,如果某个应用跑不起来,下一步是抓 trace。zluda_trace是一个 CUDA API 的追踪垫片:它把应用每一次 CUDA 调用、参数和返回码都记下来,还会把涉及的 PTX 模块存成文件(能直接看到应用到底用了哪些 PTX 指令、哪条没被支持)。Windows 上给启动器加--zluda-trace就行;Linux 上则把LD_LIBRARY_PATH指到zluda下的trace/子目录,再设ZLUDA_LOG_DIR指定日志目录、ZLUDA_CUDA_LIB指定 ZLUDA 的libcuda.so,然后照常跑程序。日志里每个运行会生成一个独立目录,里面有log.txt、对应的.ptx/.elf,以及编译失败时的module_NNNN_NN.log(形如Unrecognized statement "nanosleep.u32 ..."这种,就是应用用到了 ZLUDA 还没支持的 PTX)。把这份日志整理出来,是排查兼容性问题最快、也最能帮上忙的材料,仓库里的 troubleshooting 文档 对日志字段都有说明。
第一次启动很慢时,用预编译绕开
CUDA 应用首次启动时,GPU 代码(PTX)要现场编译,大应用这一步可能拖很久。ZLUDA 提供了一个预编译工具zluda_precompile:指向你的程序目录,它会扫出所有 GPU 代码、提前编译并写进缓存,这样应用第一次启动时缓存里已经有东西了。Windows 上叫zluda_precompile.exe <路径>,Linux 上叫zluda_precompile <路径>。它的取舍是:会占满所有 CPU 线程(比留给应用自己编快),但也可能编一些你的应用其实用不到的代码(所以不一定总是赢),大应用建议试一下。
哪些应用好跑、哪些还跑不了
挑应用时可以参考仓库 docs 里已经验证过的几类:
- llama.cpp:按 CUDA 架构 86(也接受 80/89)编译、并强制走 cuBLAS 时,能跑到接近原生的速度;多架构编译只要包含 80/86/89 之一即可,关掉 cuBLAS 则会明显掉速。
- PyTorch / TensorFlow:是官方当前最优先的两个目标,PyTorch 排在最前,TensorFlow 紧随其后。目前还在推进中,能跑的范围取决于你用的模型和算子覆盖度。
- 32 位 PhysX(老游戏物理引擎):ZLUDA 有一版为 PhysX 定制的 32 位实现,通过 Steam 启动项或命令行拉起游戏即可,
32目录里有专门的zluda.exe。已知限制:PhysX 重新初始化可能失败,游戏内改物理设置可能崩溃或卡住;官方测试过的有 Mirror's Edge、Alice: Madness Returns、Mafia II 等,多数游戏应该能跑。 - 明确不做的:OptiX 硬件光追(有自己的一套 PTX 方言和主机代码,复杂度极高)、Blender(低优先级)、DLSS(曾被 AMD D3D 驱动缺一个能力卡住,驱动现已补上但不在官方路线图,欢迎社区贡献)、32 位系统级安装(只作为最后手段)。
以 Alice: Madness Returns 为例,在 Steam 里打开游戏属性 → 通用 → 启动选项,填入"<ZLUDA路径>\32\zluda.exe" -- %command%就能让游戏走 ZLUDA 的 32 位驱动。
排查游戏不启动时,加一个 trace 选项
老游戏不跑时,最省事的做法还是抓 trace:给 Steam 启动项或命令行启动器加上--zluda-trace,ZLUDA 就会把这次运行的 CUDA 调用全记下来。如果你手上恰好还有一张 NVIDIA 卡,可以用--nvidia-trace在同一应用上采一份正常基线做对比,差异处通常就是问题所在。
最后给一条实际建议:先用cuda_check把环境确认成全绿,再挑一个已知能跑的轻量应用(比如 llama.cpp 或某个 PhysX 老游戏)验证整条链路,遇到不跑的就抓一份 trace 存下来——这套"先验证、后上手、卡住就留日志"的顺序,比直接上复杂应用要省心得多。
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考