llama.cpp b12094优化Hexagon后端采样器的TOP_K计算
该版本将Hexagon后端采样器中TOP_K的整块双调排序改为跳过无效块、再逐块扫描,改动覆盖k在 2 到 64 之间、行宽超过 1024 的单行与多行路径。
AI解读:改动思路是先跳过最大值无法触及当前第k名阈值的tile,再用top_k_scan() 替换tile排序:以一次HVX max-reduce拒绝整块 256 个float,只把通过筛选的元素插入有序的k项列表。
适用条件:k在 2 到 64 之间,且行宽大于 1024,单行路径与多行路径均覆盖。
行为细节:出现并列时保留首次出现的索引;NaN被当作 -INF处理。另有提交移除vtcm的标量读取,PR共同作者为Max Krasnyansky。
发布页同时列出各平台预编译包,包括macOS、iOS、Linux、Android、Windows及openEuler;其中macOS启用KleidiAI的版本与openEuler相关包标注为DISABLED。来源未给出加速比等性能数据。
llama.cpp发布构建b12094,合入PR #31279,改动了Hexagon后端采样器中TOP_K的实现方式。发布说明称目标是让该后端采样器中的TOP_K更快。
TOP_K改了什么
按发布说明,新的做法先跳过那些最大值无法达到当前第k名阈值的tile,不再对它们执行双调排序;随后用top_k_scan() 取代tile排序:先用一次HVX max-reduce拒绝整块 256 个float,只把存活的元素插入一个有序的k项列表。
同一PR还包含一项提交,用于消除vtcm的标量读取。PR共同作者为Max Krasnyansky。
- 跳过最大达不到当前第k名阈值的tile
- 用HVX max-reduce整块拒绝 256 个float
- 仅将存活元素插入有序的k项列表
- 移除vtcm的标量读取
适用范围与行为边界
代码说明给出的适用范围是k取 2 到 64、行宽大于 1024,单行和多行路径都使用这一实现。并列值保留首次出现的索引;NaN按 -INF处理。
- k范围:2 到 64
- 行宽条件:大于 1024
- 覆盖单行路径与多行路径
- 并列取首次出现的索引
- NaN视为 -INF
随版本发布的预编译包
b12094发布页按平台列出预编译产物,涵盖macOS arm64与x64、iOS XCFramework、多个Ubuntu与Linux变体(含CPU、Vulkan、CUDA 12/13、ROCm 10.0、OpenVINO、SYCL,以及面向Snapdragon的CPU/Adreno GPU/Hexagon NPU包)、Android arm64、Windows各类后端包和UI包。
部分条目在发布页标注为DISABLED:macOS Apple Silicon上启用KleidiAI的版本,以及openEuler的 310p与 910b等条目。本次发布说明未提供该优化在Hexagon上的实测加速数据。
- Linux arm64 Snapdragon包包含CPU、Adreno GPU、Hexagon NPU
- macOS KleidiAI启用版标注DISABLED
- openEuler多个包标注DISABLED
- 未公布性能测量结果