news 2026/9/11 12:00:30

手把手:用 ZLUDA 让未修改的 CUDA 程序跑在 AMD 显卡上

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手:用 ZLUDA 让未修改的 CUDA 程序跑在 AMD 显卡上

手把手:用 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 显卡该有的所有证件——libcudacuBLAScuDNN,应用的安全检查只认证件;但真正干活的是 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 SDKrocminfo或运行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 秒以内。注意预编译会用满所有线程,可能编译一些用不到的内核,所以适合"确定要反复跑"的应用。

卡住了?按这个顺序排查

  1. 应用报"找不到 CUDA 驱动"——先查库到底从哪加载:
ldd ./your_cuda_app | grep -i cuda

确认libcuda.so指向 ZLUDA 目录;Windows 下把zluda目录的完整文件拷到.exe旁边再试。

  1. cuda_check有非 OK 项——Windows 上用官方 HIP SDK 时,cudnn8/cudnn9失败是已知现象(官方 SDK 不带 MIOpen)。换 nightly 包,并确认HIP_PATH指向含rocblas.dll的目录。

  2. 启动慢——先判断是编译等待还是缓存没命中,跑一次zluda_precompile,第二次启动再计时对比。

  3. 某个内核编译失败——去日志目录找module_NNNN_NN.log,里面有具体不支持的 PTX 指令:

cat /tmp/zluda/<程序名>/module_*.log
  1. 需要完整调用记录——用 trace 模式启动,日志会落盘到%TEMP%\zluda(Windows)或ZLUDA_LOG_DIR指定目录(Linux),排障和反馈问题都用它。

选型参考:横向对比

方案核心优势主要短板最适人群
ZLUDA应用零改动,直接消费存量 CUDA 生态功能覆盖不完整:PyTorch 尚未支持,OptiX/硬件光追无计划;部分 API 性能有损耗有 AMD 卡、又有一批不能改的 CUDA 程序
ROCm / HIPAMD 上功能最完整、性能最好需要把代码从 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 11:57:41

MicroPython实现硬件级Scatter-Gather DMA链式触发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 11:57:14

Vite 8换芯实测:Rolldown取代esbuild+Rollup,构建提速3.19倍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 11:57:12

awesome-design-md:直接拿走 73 份 DESIGN.md,3 步生成品牌同款 UI

awesome-design-md&#xff1a;直接拿走 73 份 DESIGN.md&#xff0c;3 步生成品牌同款 UI 【免费下载链接】awesome-design-md A collection of DESIGN.md files analysis by popular brand design systems. Drop one into your project and let coding agents generate a mat…

作者头像 李华
网站建设 2026/9/11 11:57:06

TCP协议深度解析:从设计哲学到tcpdump抓包实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 11:57:03

AutoHedge:面向不可靠API的分布式韧性契约范式

1. AutoHedge不是自动对冲&#xff0c;而是分布式任务协同的底层范式重构 AutoHedge这个词&#xff0c;第一次在MIT实验室的内部技术简报里出现时&#xff0c;我正盯着一段用Python写的Docker Swarm服务巡检脚本发呆。当时没人把它当真——毕竟“Hedge”在金融语境里是“对冲”…

作者头像 李华
网站建设 2026/9/11 11:56:19

四激光雷达+华为ADS 5:岚图泰山X8智能驾驶深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华