快速结论:在使用 llama.cpp 的 Hexagon HTP 后端执行 F32/F16 的 GGML_OP_ADD 时,如果 src1 的 dim 1 为 1、同时在 dim 2 上有多个 slice(即按行广播但跨 dim 2 切片),HTP 内核可能读错行,导致输出出现 FLT_MAX / inf。优先排查该 ADD 广播形状是否命中已知的内核分派问题,并升级到包含修复的版本。
适用环境:工具为 llama.cpp,后端为 Hexagon HTP;受影响算子为 GGML_OP_ADD,使用 F32 或 F16 操作数。Issue 来源版本为当前上游 master 的 f805c57a2d0b7cc171e599303ce2040f6e1bfe15,同一路径也存在于 6e0962b6f60b73ec9e6c0d428d4503151a8ee3d3。Issue 未提供操作系统、Python、CUDA、具体显卡型号或依赖版本信息。
最快修复方案:该问题已在 #29502 中修复,更新/切换到包含该修复的 llama.cpp 版本即可。
注意事项:Issue 本身明确说明报告基于源码分析与已报告的输出症状,没有附上设备端日志。修复合并前的 f805c57a2d0b7cc171e599303ce2040f6e1bfe15 及相同路径版本仍受影响。如果升级后形状不同的 ADD 仍出现异常,需要单独排查,不能默认都由该问题覆盖。
问题场景
用户在 llama.cpp 的 Hexagon HTP 后端上运行 GGML_OP_ADD,操作数为 F32 或 F16。触发条件为:src0 的 GGML 维度是 [N, R, B, 1],src1 的维度是 [N, 1, B, 1],且 N > 1、R > 1、B > 1。例如 [128, 4, 8, 1] 加上 [128, 1, 8, 1]。按语义,dim 2 的每个 slice 内,每一行都应使用同一个 src1 行;但 HTP 上的结果与 CPU 对比不一致,表现为输出 FLT_MAX / inf。
报错原文
Misc. bug: Hexagon ADD reads wrong rows when dim 1 broadcasts across dim 2 slices
FLT_MAX / inf output
原因分析
可能原因在 HTP 二元算子的内核分派逻辑中:
- 主机端分派把该形状归类为
HTP_BINARY_KERNEL_SAME_SHAPE,因为ne11 == 1满足is_same_shape;但ne12 > 1又使其不进入HTP_BINARY_KERNEL_ROW_BCAST。 - 同形状 HTP worker 从
i11 = 0开始,却按源 stridenb11拷贝current_block_size个src1行。当一个 block 至少包含两行时,第二次拷贝会读到下一个 dim-2 slice,而不是重复当前行;最后一个 slice 还可能读过src1边界。
现有 binary broadcast 测试用例不包含这一精确形状组合,因此该路径未被覆盖。
环境排查
- 确认 llama.cpp 版本是否在
#29502修复之前,尤其是 Issue 中提到的f805c57a2d0b7cc171e599303ce2040f6e1bfe15或同一路径存在的6e0962b6f60b73ec9e6c0d428d4503151a8ee3d3。 - 确认后端为 Hexagon HTP,而不是 CPU 或其他后端。
- 确认算子为
GGML_OP_ADD,数据类型为 F32 或 F16。 - 确认测试形状确实满足:
src0 = [N, R, B, 1]、src1 = [N, 1, B, 1],且N > 1、R > 1、B > 1。 - Issue 未提供操作系统、Python、CUDA、PyTorch、GPU 型号或依赖版本,因此这些项目无法从本 Issue 中确认。
解决步骤
- 如果当前使用的是
f805c57a2d0b7cc171e599303ce2040f6e1bfe15或相同路径存在的6e0962b6f60b73ec9e6c0d428d4503151a8ee3d3,先升级到包含#29502修复的 llama.cpp 版本。 - 如果无法立即升级,可优先尝试在受影响路径上避开
src1 = [N, 1, B, 1]且B > 1的 ADD 形状,例如改由 CPU 执行该算子或调整广播形状;这类规避方式属于推测性建议,Issue 中未提供已验证的替代路径。 - 在测试或复现脚本中,使用固定输入分别跑 HTP 与 CPU,对比
ggml_add(src0, src1)的输出,确认是否只在 HTP 上出现FLT_MAX/inf。 - 如果升级后仍可复现,收集设备端日志、具体形状、数据类型和 llama.cpp 提交号,再向上游提交新的 Issue;原 Issue 本身没有设备端日志可供比对。
验证方法
使用触发形状(例如 [128, 4, 8, 1] 加 [128, 1, 8, 1]),为 src1 的每个 dim-2 slice 填入不同的有限值,分别在 HTP 和 CPU 上执行 ggml_add。修复生效时,输出不应出现 FLT_MAX / inf,且 HTP 结果应与 CPU 一致:同一 dim-2 slice 内每一行都使用相同的 src1 行。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![Misc. bug: Vulkan ARGSORT ne=[2048,1,1,1] only sorts half of the array on some devices](https://www.chat-gpts.plus/wp-content/uploads/2026/09/29431-0e9cbdaa-768x403.jpg)
![[Bug] Qwen4Exp QSA indexer: per-chunk logits buffer grows with max_seq_len, caching allocator keeps every size, device OOM/hang on unified-m](https://www.chat-gpts.plus/wp-content/uploads/2026/09/56457-d01dde83-768x403.jpg)
![[Bug]: Batch invariance is broken when sequence parallelism / async TP is enabled (`VLLM_BATCH_INVARIANT=1` + `pass_config.enable_sp`)](https://www.chat-gpts.plus/wp-content/uploads/2026/09/56370-536c0b3f-768x403.jpg)