Misc. bug: Hexagon ADD reads wrong rows when dim 1 broadcasts across dim 2 slices

在使用 llama.cpp 的 Hexagon HTP 后端执行 F32/F16 的 GGML_OP_ADD 时,如果 src1 的 dim 1 为 1、同时在 dim 2 上有多个 slice(即按行广播但跨 dim 2 切片),HTP 内核可能读错行,导致输出出现 FLT_MAX / inf 。

快速结论:在使用 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 二元算子的内核分派逻辑中:

  1. 主机端分派把该形状归类为 HTP_BINARY_KERNEL_SAME_SHAPE,因为 ne11 == 1 满足 is_same_shape;但 ne12 > 1 又使其不进入 HTP_BINARY_KERNEL_ROW_BCAST。
  2. 同形状 HTP worker 从 i11 = 0 开始,却按源 stride nb11 拷贝 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 中确认。

解决步骤

  1. 如果当前使用的是 f805c57a2d0b7cc171e599303ce2040f6e1bfe15 或相同路径存在的 6e0962b6f60b73ec9e6c0d428d4503151a8ee3d3,先升级到包含 #29502 修复的 llama.cpp 版本。
  2. 如果无法立即升级,可优先尝试在受影响路径上避开 src1 = [N, 1, B, 1] 且 B > 1 的 ADD 形状,例如改由 CPU 执行该算子或调整广播形状;这类规避方式属于推测性建议,Issue 中未提供已验证的替代路径。
  3. 在测试或复现脚本中,使用固定输入分别跑 HTP 与 CPU,对比 ggml_add(src0, src1) 的输出,确认是否只在 HTP 上出现 FLT_MAX / inf。
  4. 如果升级后仍可复现,收集设备端日志、具体形状、数据类型和 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 行。

参考来源

ggml-org/llama.cpp #29411

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25901

发表回复

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