Compile bug: Build error with sm_70 on Windows 11

这个 Compile bug: Build error with sm_70 on Windows 11 通常出现在用 CUDA 加上 -DCMAKE_CUDA_ARCHITECTURES 包含 70-real (Volta / V100,sm_70)编译 llama.cpp 时, fattn.cu

快速结论:这个 Compile bug: Build error with sm_70 on Windows 11 通常出现在用 CUDA 加上 -DCMAKE_CUDA_ARCHITECTURES 包含 70-real(Volta / V100,sm_70)编译 llama.cpp 时,fattn.cu.obj 编译失败。优先排查你是否在编译 sm_70 架构,以及是否落入了引入回归的 commit 1884824fd。

适用环境:Issue 已确认的环境为 Windows 11、CUDA 12.9、NVIDIA V100(sm_70)、llama.cpp commit 1884824fdaeb19af27cd8ba0ca50fcbed28eca44;评论中另有 Debian 13、NVIDIA 驱动 580、CUDA 12.9、V100 16GB 与 RTX 3090 24GB 的复现。

最快修复方案:暂无确认的一步修复方案。Issue 中未给出已合并或已验证的补丁,建议临时规避或跟踪上游修复。

注意事项:该 Issue 标签为 bug-unconfirmed,说明当时尚未被维护者正式确认为 bug,也没有明确给出修复 commit 或 PR,请勿把下面的排查步骤当作已验证的官方修复。

问题场景

用户在 Windows 11 上用 CMake 构建 llama.cpp,开启 CUDA 后端,并在 CMAKE_CUDA_ARCHITECTURES 中指定 70-real;89-real(即包含 Volta sm_70),编译目标为 llama-server。失败发生在 CUDA 源文件 fattn.cu.obj,报错位置在它包含的 fattn-mma-f16.cuh。评论中同类复现出现在 Debian 13 + V100 / RTX 3090,架构写成 70-real;86-real

报错原文

FAILED: [code=1] ggml/src/ggml-cuda/CMakeFiles/ggml-cuda.dir/Release/fattn.cu.obj
D:\...\ggml\src\ggml-cuda\fattn-mma-f16.cuh(683): error: no instance of overloaded function "load_ldmatrix" matches the argument list
            argument types are: (ggml_cuda_mma::tile<8, 4, half2, ggml_cuda_mma::DATA_LAYOUT_I_MAJOR_MIRRORED>, half2 *const __restrict__, const int, int, const int)
                      load_ldmatrix<swz>(K_A, tile_K, i_KQ_0, k_KQ_0 - k0_start, stride_tile_K);
                      ^
D:\...\ggml\src\ggml-cuda\mma.cuh(877): note #3327-D: candidate function template "ggml_cuda_mma::load_ldmatrix<swz,T,dl>(tile<16, 8, T, dl> &, const T *, int, int, int)" failed deduction

注释中列出的候选重载均不匹配 tile<8, 4, ...>,其中包括:

note #3323-D: substituting explicit template arguments ... for function template "ggml_cuda_mma::load_ldmatrix(ggml_cuda_mma::tile<8, 8, T, ggml_cuda_mma::DATA_LAYOUT_I_MAJOR> &, const T *, int)" failed
note #3323-D: substituting ... "ggml_cuda_mma::load_ldmatrix(ggml_cuda_mma::tile<16, 4, T, dl> &, const T *, int)" failed
note #3323-D: substituting ... "ggml_cuda_mma::load_ldmatrix(ggml_cuda_mma::tile<16, 8, T, dl> &, const T *, int)" failed
note #3327-D: candidate function template "ggml_cuda_mma::load_ldmatrix<swz,T,dl>(tile<16, 8, T, dl> &, const T *, int, int, int)" failed deduction

原因分析

根据 Issue 正文的描述:

  • 回归由 commit 1884824fdaeb19af27cd8ba0ca50fcbed28eca44 引入(作者标注为 First Bad Commit)。
  • 该 commit 新增的 5 参数 load_ldmatrix 重载只对 tile<16, 8> 定义,而 Volta 路径调用的是 tile<8, 4, half2, DATA_LAYOUT_I_MAJOR_MIRRORED>,因此模板推导失败。
  • 在该 commit 之前,fattn-swizzle.cuh 中的 wrapper 能在非 swizzled 路径上处理任意 tile 形状;重构把这条路径去掉了。
  • 作者检查了其他架构,只有 sm70 受影响;CI 不构建 sm70,所以没有被捕获。

因此根因可判断为重构时删除了 Volta 非 swizzled 路径对任意 tile 形状的处理,而不只是“可能是”这样。sm_70 以下之外是否还有边界情况,Issue 未展开。

环境排查

  • 确认构建命令中的 CMAKE_CUDA_ARCHITECTURES 是否包含 70-real(或等价 sm_70)。
  • 确认当前 git commit 是否等于或晚于 1884824fdaeb19af27cd8ba0ca50fcbed28eca44
  • 确认 CUDA 版本(Issue 复现为 12.9)。
  • 确认显卡架构:V100 / sm_70 是已确认复现的硬件。
  • 确认操作系统与编译器环境:Windows 11(原 Issue)、Debian 13(评论复现)。

解决步骤

  1. 先确认自己是否真的在编译 sm_70。检查 CMake 缓存或构建命令中的 -DCMAKE_CUDA_ARCHITECTURES 值,是否包含 70-real
  2. 如果目标机器并不运行 sm_70 硬件(例如只跑 RTX 30/40 系),可优先尝试从 CMAKE_CUDA_ARCHITECTURES 中移除 70-real 后重新配置并编译。
  3. 如果必须为 V100 产出 sm_70 代码,可优先尝试回退到 commit 1884824fd 之前的版本进行构建,以规避该回归。
  4. 保留完整报错日志(含候选重载的 note #3323-D / #3327-D 行),便于上游定位。
  5. 关注上游是否针对该回归提交修复;在确认修复 commit 前,不建议把“添加自定义 5 参数重载”当作标准解法,因为 Issue 未验证该做法。

验证方法

重新执行原有构建命令(例如 cmake --build build --config Release --target llama-server)。若 fattn.cu.obj 不再出现 no instance of overloaded function "load_ldmatrix",且目标成功链接完成,则说明规避或修复生效。若使用回退版本方法,还需确认回退后的 commit 不再包含 1884824fd

参考来源

ggml-org/llama.cpp #29222

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 24814

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注