llama.cpp发布b11070:Hexagon后端重构DMA与缓冲区,支持 64 位映射
该版本由PR #29197 驱动,把六边形DSP的缓冲区管理和DMA搬进 64 位地址空间,同时为多个算子改用DMA路径。
AI解读:这条发布是给高通Hexagon DSP后端做的一次底层管道翻修。此前llama.cpp在Hexagon上跑模型时,DMA和缓冲区映射按较窄的地址处理,显存/内存布局被限制,扩展缓冲和部分算子只能走效率较低的老路径。
PR #29197 把缓冲区映射和DMA改为支持 64 位地址,并让大部分二元算子、SSM_CONV、转置、拼接、flash-atten with sinks、GDN循环、softmax等改用DMA。对在骁龙设备上通过Hexagon加速跑推理的人来说,这直接决定大模型能不能被完整映射,以及长序列或较大权重时会不会因为地址空间不够被拒绝。
代价和边界同样明确:hex-buffs现在会拒绝无法内存映射的超大缓冲区分配,mmap次数上限被提到 64 以减少大模型中的换出,引入dma_addr_t也让旧目标需要走v73回退路径。改动幅度大、涉及算子广,实际收益取决于具体芯片和模型,发布内容没有给出速度或内存的量化对比。
llama.cpp发布版本b11070,核心改动为PR #29197:对Hexagon后端的缓冲区和DMA处理进行重构,以支持 64 位映射并带来一系列改进。
根据发布说明,改动引入hex-dma64分支,扩展DMA可处理的二元算子场景,新增binary-ops.h,并在run.py中加入 --hex-dma64开关。
SSM_CONV改用支持 64 位地址的DMA路径;hex-ops中针对 % 128 的用于二元算子的过时门控被移除。
权重张量不再与dirty范围比对;DMA层改用dma_addr_t替代普通uint64_t,以避免在较老目标上的额外开销。
算子迁移与内核选择调整
发布说明列出了多项算子与内核层面的调整:hex-binary重新设计内核选择、按类型和运算特化,并修复了MOE上的回归;同时引入vtcm布局和每源DMA队列。
hex-dma64重构了二元算子的DMA循环,将一元算子中的DMA管线也做了重构;softmax被重写为使用DMA,GDN的DMA循环被重写并改善HVX寄存器占用,且将GDN与CPY融合。
hex-binary还修复了标量运算中错误的取模与回绕,并确保在支持性检查中调用precompute kparams;hex-dma64更新了mm、concat、binary的地址处理。
hex-cpy更新了CPY以使用安全的DMA行/大小限制;hex-mm移除了hvx-flat内核,理由是分块版本现在能更好地处理vtcm限制,并表示减少了HVX prompt内核的寄存器溢出。
- hex-mm抽出HVX solver,并减少HVX prompt内核的寄存器溢出
- hex-dma将matmul的DDR内核全部改接到新的分块DMA/VTCM内核
- hex-dma64为带sinks的flash-atten增加DMA/VTCM支持
- hex-mm-add修复扩展缓冲区中带bias.weights的MUL_MAT+ADD融合
- hex-add-id为src1(exp表)增加DMA支持
缓冲区、映射与回退路径
在缓冲区管理方面,hex-bufs对mmapping逻辑做了小幅清理,简化缓冲区克隆;hex-dma64简化了惰性缓冲映射与克隆;hex-fusion抽出try_fuse_common以检查dma64缓冲区。
发布说明提到将mmap数量提升到 64,以便在较大模型中避免换出;同时hex-bufs不再在va碎片整理期间丢弃扩展映射,并避免重复计算同一算子中来自张量的缓冲区。
hex-bufs会拒绝无法进行内存映射的超大缓冲区分配;hex-dma增加了对次级ring的支持,作为交易过大时的回退方案。
hex-dma将dma_push更新为透明处理 64 位/扩展地址,并审计所有算子对 64 位地址的正确使用或保护;hex-rope修复了 64 位DMA下freq_factors的访问。
- hex-dma:所有DMA使用者改用dma_data(取代裸指针)
- hex-dma64:清理dma_addr_t强制转换及转换遗留问题
- hex-dma64:避免因 64 位地址运算导致的寄存器压力,取消glu-compute函数的内联
- hex-dma:改善v73回退路径
- hex-softmax:修复gpt-oss的维度问题
- hex-ssm-conv:收紧门控检查并在kparams中检查vtcm大小
调试工具与文档
发布说明称新增hex-devel inspect脚本,用于辅助调试和分析;hex-inspect增加了查找浮点提升(float promo)调用的逻辑。
开发者文档被更新,加入寄存器溢出和浮点提升的检查说明。此外还修复了脚本的flake8警告、editor-config警告、inspect的ty警告、合并冲突等问题。
- 发布说明列出同一版本的多平台预编译产物,覆盖macOS/iOS、Linux(含Vulkan、CUDA 12/13、ROCm 10.0、OpenVINO、SYCL FP32/FP16)、Android arm64、Windows(含CUDA、Vulkan、OpenVINO、SYCL、ROCm、OpenCL Adreno)以及UI
- openEuler构建在本版本中标记为DISABLED
- macOS Apple Silicon的KleidiAI启用版本同样标记为DISABLED