ZLUDA Windows 环境配置实战:HIP SDK 两种安装方式、HIP_PATH 配置与 cuda_check 全库验证
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
在 ZLUDA(CUDA on non-NVIDIA GPUs)中,Windows 平台除了 GPU 驱动外还依赖 AMD HIP SDK 作为底层算力来源。本文完整覆盖 HIP SDK 的两种安装途径(官方稳定版与 Nightly 构建版)、HIP_PATH环境变量的设置要求,并结合仓库中 cuda_check 检测工具 与 zluda_windows 重定向层 的源码,说明 ZLUDA 是如何定位、加载并验证各性能库(cuBLAS/cuDNN/cuFFT 等)的。读完本文,你可以在 Windows + AMD GPU 上正确配好 HIP SDK,并用cuda_check.exe逐库确认 ZLUDA 的替换链路是否打通。
一、为什么 ZLUDA 需要 HIP SDK
ZLUDA 的工作方式是在 Windows 上以 CUDA 库名(nvcuda.dll、cublas64_*.dll等)提供重定向 DLL,把应用发起的 CUDA 调用转译到 AMD 的 HIP 运行时上执行。因此 HIP SDK 不是可选项:CUDA 驱动层对应 HIP 的amdhip64.dll,cuBLAS 对应rocblas.dll,cuDNN 对应MIOpen.dll等。从源码结构看,64 位 Windows 下 ZLUDA 需要接管 17 个库,定义在 LIBRARIES 表 中:
pub static LIBRARIES: [LibraryInfo; 17] = [ NVCUDA, NVML, DNN8, DNN9, BLAS13, BLAS12, BLAS11, BLAS_LT13, BLAS_LT12, BLAS_LT11, SPARSE12, SPARSE11, SPARSE10, FFT12, FFT11, FFT10, NVAPI, ];32 位 Windows 下该表退化为仅NVCUDA与NVAPI两项(见 lib.rs 第 41-42 行)。每个LibraryInfo还携带 GUID 与ZLUDA_*_LIB追踪环境变量(如ZLUDA_BLAS_LIB、ZLUDA_DNN8_LIB),配合 故障排查文档 中的日志能力定位加载来源。
二、安装 HIP SDK:两种途径对比
在 Windows 上安装 GPU 驱动(AMD Software: Adrenalin Edition)之后,还需要安装 HIP SDK。官方文档给出两条路线,取舍要点如下表(继承自 docs/src/hip_sdk.md):
| 官方 HIP SDK | Nightly HIP SDK 构建 | |
|---|---|---|
| 安装方式 | 自动安装(安装器) | 手动安装(解压 tarball) |
| 稳定性 | 稳定,受 AMD 支持 | AMD 每日构建,无稳定性保证 |
| 代码新旧 | 较旧 | 较新 |
| 机器学习支持 | 无(PyTorch、TensorFlow 不能工作) | 有(PyTorch、TensorFlow 等必需) |
结论先行:要跑 PyTorch/TensorFlow 等机器学习框架,必须选 Nightly 构建;只做常规 CUDA 应用验证时官方 SDK 更省事。
方式 A:官方 HIP SDK
- 访问 AMD 官方的 "HIP SDK for Windows" 下载页面(AMD ROCm Hub);
- 下载与你操作系统匹配的最新版本;
- 运行安装器,按向导完成安装。
官方 SDK 不含 MIOpen,这是后文验证环节cudnn8/cudnn9报错的根源(见第四节注意事项)。
方式 B:Nightly HIP SDK 构建(机器学习必需)
- 访问 ROCm SDK nightly tarball 页面(AMD 的 therock 每日构建发布页);
- 下载较新的
therock-dist-windows-gfx<GPUARCH>...tar.gz文件。<GPUARCH>是 GPU 的 Shader ISA 代号(gcnArchName),获取方法有二:- 查 TechPowerUp 的 GPU 数据库,例如 AMD Radeon RX 9070 的 Shader ISA 为
1201; - 或任意下载一个
tar.gz,解压后运行包内自带的hipInfo.exe,读取输出中的gcnArchName;
- 查 TechPowerUp 的 GPU 数据库,例如 AMD Radeon RX 9070 的 Shader ISA 为
- 将
.tar.gz解压到任意目录(可用 7-Zip)。注意可能需要解压两次(先解.tar.gz得到.tar,再解.tar); - 设置
HIP_PATH环境变量指向解压后的目录。
对第 4 步有两个硬性校验条件(来自原文档):
- 该目录下必须包含一个
bin子目录; bin目录中必须包含一系列.dll,其中必须包括rocblas.dll。
这两个条件不是文档凭空规定:从源码看,ZLUDA 在重定向加载 HIP 库时正是拼接HIP_PATH\bin\<dll名>再调用LoadLibraryExW,实现位于 try_load_from_hip_path:
unsafe fn try_load_from_hip_path(redirect_name: &'static str) -> Option<HMODULE> { let hip_path = std::env::var_os("HIP_PATH")?; let hip_dll_path = PathBuf::from(hip_path) .join("bin") .join(redirect_name) // ... LoadLibraryExW(...) .ok() }加载策略是一个两级回退链(见 lib.rs 第 447-454 行):
try_load_from_self_dir(redirect_name).or_else(|| try_load_from_hip_path(redirect_name))即先在 ZLUDA 自身目录里找同名 DLL,找不到再到HIP_PATH\bin下找。这也解释了第一条注意事项——若应用先于 ZLUDA 从别的路径加载了某个 HIP 库,ZLUDA 会直接复用已加载的实例。
三、验证:用 cuda_check.exe 逐库自检
ZLUDA 自带一个小型 CUDA 应用cuda_check,用于测试全部性能库的加载与初始化。通过 ZLUDA 启动器运行(zluda.exe --的用法见 快速开始):
zluda.exe -- cuda_check.exe正常输出形如:
nvcuda : OK (C:\hip_sdk\bin\amdhip64_7.dll) nvml : OK cufft11 : OK cudnn9 : OK (C:\hip_sdk\bin\MIOpen.dll) cudnn8 : OK (C:\hip_sdk\bin\MIOpen.dll) cublaslt13: OK (C:\hip_sdk\bin\libhipblaslt.dll) cusparse12: OK cufft12 : OK cublas13 : OK (C:\hip_sdk\bin\rocblas.dll) cublaslt12: OK (C:\hip_sdk\bin\libhipblaslt.dll) cublas12 : OK (C:\hip_sdk\bin\rocblas.dll) cusparse11: OK括号中的路径是底层 HIP SDK 库的实际位置,没有括号说明该库由系统或 ZLUDA 自身提供(如nvml、cufft11)。各行与 HIP 库的对应关系可直接在 cuda_check/src/win.rs 中逐一对上:
| cuda_check 检查项 | 初始化的 CUDA 符号 | 反查的 HIP 底层库 |
|---|---|---|
nvcuda | cuInit | amdhip64_7.dll/amdhip64_6.dll(check_cuda) |
nvml | nvmlInit_v2 | rocm_smi64.dll |
cudnn8/cudnn9 | cudnnCreate/cudnnDestroy | MIOpen.dll |
cublas11/12/13 | cublasCreate_v2/cublasDestroy_v2 | rocblas.dll |
cublaslt11/12/13 | cublasLtCreate/cublasLtDestroy | hipblaslt.dll或libhipblaslt.dll(两种命名都兼容,见 check_cublaslt) |
cusparse10/11/12 | cusparseCreate/cusparseDestroy | rocsparse.dll |
cufft10/11/12 | cufftCreate/cufftDestroy | hipfft.dll |
几个源码层面的细节值得了解,便于读懂输出与排查异常:
- 检查顺序是随机的。默认情况下
cuda_check会先打乱库检查顺序再逐个加载(rand洗牌,见 win.rs 第 43-48 行),用于检验任意加载顺序下 ZLUDA 重定向的健壮性;传--driver-first开关可保证nvcuda先被初始化、其余库随机。 - 路径反查原理:初始化成功后,工具用
open_already_loaded查询已加载的 HIP 模块并取其文件路径(path_for_loaded_lib),这就是括号中路径的来源。 - 支持
CUDA_PATH环境变量:对非系统目录中的 DLL(in_system32: false的库),cuda_check会先尝试从%CUDA_PATH%\bin\x64\加载(win.rs 第 74-87 行),与 ZLUDA 主程序走HIP_PATH的回退链互为参照,可用于隔离问题出在库文件本身还是 ZLUDA 重定向。 cufft的宽松判定:cufftCreate返回NOT_SUPPORTED时也被视为通过(check_cufft),因为某些构建的 hipFFT 不支持该路径。
四、注意事项与已知问题
以下三点直接继承自 官方文档,遇到对不上的输出时先对照本节:
- 括号中的路径不保证被实际使用。它只是反查到的底层 HIP 库位置。若应用先于 ZLUDA 从其他路径加载了同一库,ZLUDA 会复用已加载的实例而不是
HIP_PATH下的那份——这与上文 两级回退链 的"已加载即复用"语义一致。 cuda_check.exe偶尔挂起不退出,已知原因是 MIOpen 的 bug,与你的环境配置无关,重跑即可。- 使用官方 HIP SDK 时,
cudnn8与cudnn9必然加载失败。官方 SDK 不含 MIOpen,而 ZLUDA 的 cuDNN 替换底层正是MIOpen.dll(见 check_cudnn8 中hip_path = path_for_loaded_lib("MIOpen.dll"))。这是预期行为,需要 cuDNN 支持时请改用 Nightly SDK。
五、相关文档
- 快速开始:
zluda.exe -- <应用>启动器与 Linux 侧LD_LIBRARY_PATH用法; - FAQ:常见疑问(如 DLSS 支持现状);
- 日志记录(通用问题排查):结合
ZLUDA_*_LIB环境变量追踪各库加载来源; - 预编译(启动慢) 与 llama.cpp:验证通过后的典型应用场景。
【免费下载链接】ZLUDACUDA on non-NVIDIA GPUs项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考