开源llama.cpp Releases·原文 2026年10月9日

llama.cpp b11516修复Hexagon NPU上IM2COL DMA环形缓冲区溢出

该版本修复了骁龙Hexagon NPU上IM2COL exact-tiling内核在IC*KH超过 255 时丢弃DMA传输、导致输出混入NaN/inf的问题,并新增了会触发该缺陷的测试用例。

AI解读:llama.cpp发布b11516版本,修复了Hexagon后端IM2COL patch-embed的DMA环形缓冲区溢出问题(PR #30189)。

问题出在exact-tiling(stride等于kernel、无padding与dilation)的IM2COL DMA内核:它按每个输出行提交IC*KH个DDR→VTCM描述符,却没有检查dma_queue_push() 的返回值,随后又按IC*KH次弹出。

每线程DMA环形缓冲区容量为 256 条,推送进已满的环形缓冲区会返回false并丢弃传输,因此当IC*KH > 255 时,VTCM暂存缓冲区中剩余行未被写入,陈旧数据(常为NaN/inf)进入输出。

修复方式是环形缓冲区满时淘汰最旧的描述符,与同文件中blocked内核已有做法一致,并用dma_queue_flush() 等待完成。

提交同时加入exact-tiling测试用例,覆盖IC*KH > 256 的 2D 1x1、2D 2x2 patch embed与 1D场景,目标数据类型为F16和F32;提交者称这些用例在未修复的HTP上会失败。

llama.cpp发布b11516版本,合入PR #30189,修复Hexagon后端IM2COL patch-embed的DMA环形缓冲区溢出。该提交由Max Krasnyansky参与协作(Co-authored-by)。

IC*KH超过 255 时DMA传输被丢弃

提交说明称,exact-tiling(stride == kernel、无pad/dilation)的IM2COL DMA内核会对每个输出行提交IC*KH个DDR→VTCM描述符,但没有检查dma_queue_push() 的返回值,之后又弹出IC*KH次。

每线程DMA环形缓冲区容纳 256 条记录;向已满的环形缓冲区推送会返回false并丢弃该次传输。因此当IC*KH > 255 时,VTCM暂存缓冲区的剩余行从未被写入,陈旧数据(常为NaN/inf)泄漏到输出中。

修复方案是在环形缓冲区满时淘汰最旧的描述符,正如同一文件中blocked内核已有的做法,并使用dma_queue_flush() 等待。

  • 触发条件:exact-tiling(stride == kernel、无pad/dilation)且IC*KH > 255

新增测试覆盖IC*KH > 256

提交新增了exact-tiling测试用例,覆盖IC*KH > 256 的情形:2D 1x1、2D 2x2 patch embed以及 1D,目标数据类型为F16和F32。

提交说明称,这些用例在未包含该修复的HTP上会失败。PR中应用了 @max-krasnyansky的建议。

信息来源

llama.cpp Releases原始来源