ZLUDA Windows 环境配置实战:HIP SDK 两种安装方式、HIP_PATH 配置与 cuda_check 全库验证
2026/9/14 10:09:05 网站建设 项目流程

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.dllcublas64_*.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 下该表退化为仅NVCUDANVAPI两项(见 lib.rs 第 41-42 行)。每个LibraryInfo还携带 GUID 与ZLUDA_*_LIB追踪环境变量(如ZLUDA_BLAS_LIBZLUDA_DNN8_LIB),配合 故障排查文档 中的日志能力定位加载来源。

二、安装 HIP SDK:两种途径对比

在 Windows 上安装 GPU 驱动(AMD Software: Adrenalin Edition)之后,还需要安装 HIP SDK。官方文档给出两条路线,取舍要点如下表(继承自 docs/src/hip_sdk.md):

官方 HIP SDKNightly HIP SDK 构建
安装方式自动安装(安装器)手动安装(解压 tarball)
稳定性稳定,受 AMD 支持AMD 每日构建,无稳定性保证
代码新旧较旧较新
机器学习支持无(PyTorch、TensorFlow 不能工作)有(PyTorch、TensorFlow 等必需)

结论先行:要跑 PyTorch/TensorFlow 等机器学习框架,必须选 Nightly 构建;只做常规 CUDA 应用验证时官方 SDK 更省事。

方式 A:官方 HIP SDK

  1. 访问 AMD 官方的 "HIP SDK for Windows" 下载页面(AMD ROCm Hub);
  2. 下载与你操作系统匹配的最新版本;
  3. 运行安装器,按向导完成安装。

官方 SDK 不含 MIOpen,这是后文验证环节cudnn8/cudnn9报错的根源(见第四节注意事项)。

方式 B:Nightly HIP SDK 构建(机器学习必需)

  1. 访问 ROCm SDK nightly tarball 页面(AMD 的 therock 每日构建发布页);
  2. 下载较新的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
  3. .tar.gz解压到任意目录(可用 7-Zip)。注意可能需要解压两次(先解.tar.gz得到.tar,再解.tar);
  4. 设置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 自身提供(如nvmlcufft11)。各行与 HIP 库的对应关系可直接在 cuda_check/src/win.rs 中逐一对上:

cuda_check 检查项初始化的 CUDA 符号反查的 HIP 底层库
nvcudacuInitamdhip64_7.dll/amdhip64_6.dll(check_cuda)
nvmlnvmlInit_v2rocm_smi64.dll
cudnn8/cudnn9cudnnCreate/cudnnDestroyMIOpen.dll
cublas11/12/13cublasCreate_v2/cublasDestroy_v2rocblas.dll
cublaslt11/12/13cublasLtCreate/cublasLtDestroyhipblaslt.dlllibhipblaslt.dll(两种命名都兼容,见 check_cublaslt)
cusparse10/11/12cusparseCreate/cusparseDestroyrocsparse.dll
cufft10/11/12cufftCreate/cufftDestroyhipfft.dll

几个源码层面的细节值得了解,便于读懂输出与排查异常:

  1. 检查顺序是随机的。默认情况下cuda_check会先打乱库检查顺序再逐个加载(rand洗牌,见 win.rs 第 43-48 行),用于检验任意加载顺序下 ZLUDA 重定向的健壮性;传--driver-first开关可保证nvcuda先被初始化、其余库随机。
  2. 路径反查原理:初始化成功后,工具用open_already_loaded查询已加载的 HIP 模块并取其文件路径(path_for_loaded_lib),这就是括号中路径的来源。
  3. 支持CUDA_PATH环境变量:对非系统目录中的 DLL(in_system32: false的库),cuda_check会先尝试从%CUDA_PATH%\bin\x64\加载(win.rs 第 74-87 行),与 ZLUDA 主程序走HIP_PATH的回退链互为参照,可用于隔离问题出在库文件本身还是 ZLUDA 重定向。
  4. cufft的宽松判定cufftCreate返回NOT_SUPPORTED时也被视为通过(check_cufft),因为某些构建的 hipFFT 不支持该路径。

四、注意事项与已知问题

以下三点直接继承自 官方文档,遇到对不上的输出时先对照本节:

  1. 括号中的路径不保证被实际使用。它只是反查到的底层 HIP 库位置。若应用先于 ZLUDA 从其他路径加载了同一库,ZLUDA 会复用已加载的实例而不是HIP_PATH下的那份——这与上文 两级回退链 的"已加载即复用"语义一致。
  2. cuda_check.exe偶尔挂起不退出,已知原因是 MIOpen 的 bug,与你的环境配置无关,重跑即可。
  3. 使用官方 HIP SDK 时,cudnn8cudnn9必然加载失败。官方 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询