Scaling LLM Test-Time Compute with Mobile NPU on Smartphones
围绕 Hexagon NPU 的结构、HMX/HVX 计算单元、量化布局做了详细分析,并结合 HMX 矩阵运算的特性,将推理扩展为 Test-Time Scaling。比如 Best-of-N、Beam Search,并行多个推理并选择最好的结果。
Motivation
手机小模型能力不足,而增大参数量会显著增加内存与带宽。
作者观察到,LLM Decode 时输入通常只有一个 Token,GEMM 退化为 GEMV;但 Hexagon HMX 按大 Tile 计算,例如 FP16 基本 Tile 为 32×32,因此:
实际只使用 Activation Tile 的 1/32 行,矩阵算力大量闲置。
作者因此把 Best-of-N、Beam Search 等方式作为“额外行”填入 HMX,填补算力空缺。
但难点是 QNN 的粗粒度量化(最细是 Per-Channel W4,每行量化)会大幅损失精度。所以提出了符合 HMX 结构的 Group 量化方式:每 N 个数据共享一个量化参数,粒度比一行更细。
Background
1. NPU 架构:为什么 HMX 很快、HVX 却容易成为瓶颈

Hexagon 是 Scalar + Vector + Matrix 架构。
Scalar Core
Scalar Core 负责逻辑控制调度,只有约 6–8 个 VLIW Hardware Threads,通过 4 个 VLIW Slot 发射指令。
VLIW(Very Long Instruction Word)表示一个 Cycle 内能同时发出多种不同操作(Instruction Packet)。如果没有依赖,大量指令可以同时执行,例如:
vector1 multiply
vector2 shift
load vector3
...
HVX
HVX 是 SIMD Vector Core,每个 Context 有 32 个 1024-bit(128B)Vector Registers。
例如,一个线程发出一条 Vector Instruction,一个 128B 寄存器就支持同时让 64 个 FP16 加法工作。
HMX
HMX 是专用 Matrix Core。
内存结构
内存侧有:
- 1MiB L2 Cache;
- 8MB TCM。
HVX 可以从 L2 Cache 或 TCM 读取。
HMX 以及 Vector Scatter/Gather(聚合分散,用于处理非连续内存操作)只能访问 TCM。
DDR → TCM 主要由约 60GB/s DMA 搬运,比 L2 Cache 快。
这与 GPU 的大量 SIMT Thread 不同:NPU 用少量控制线程,通过宽 SIMD、VLIW 和专用矩阵指令,以更少的逻辑、更高的并行度减小能效损耗。
实测 V75 单 HVX Thread 的 FP16 GEMM 仅 32.93 GFLOPS,而 HMX 达到 12032.54 GFLOPS,相差 300 倍以上。
所以应该:
防止 Dequantization、Softmax、Layout Transformation 等 HVX 工作饿死 HMX。
2. HMX Layout

HMX 的 FP16 基本单位是 32×32 矩阵,2KiB,称为 Tile。
但它在 TCM 中并不是正常的行主序。
Figure 4(a):Tile 内部排布
对每相邻两行进行转置,再顺序存储。
例如逻辑上:
a0 a1 a2 ... a31
b0 b1 b2 ... b31
先经过转置,物理内存变成:
a0 b0 a1 b1 a2 b2 ... a31 b31
然后处理第 2、3 行,以此类推。
合理推断:
两行数据恰好等于一个 HVX 1024-bit Register,因此这种布局天然适合 HVX 使用。
推测转置操作需要借用 HVX 单元中的指令。
Figure 4(b):Tile 之间的排布
Figure 4(b) 是从大矩阵切分成一个个 Tile 的角度来看。
大 Weight Matrix 先切成多个 32×32 Tile,再以 Tile 为粒度按列主序排列。
原因是 HMX 内部的累加器结构,会按照此顺序做 Tile 级乘加运算。例如:
因此:
W00
W10
W20
连续存储,可依次送入 HMX Accumulator。
Methods
1. 针对 HMX 优化的细粒度量化方式
传统的 Group 量化方式往往按行取连续 N 个 Weight。
经过上述 HMX 转置后,这 32 个值在 TCM 中被打散,因此量化时是昂贵的非连续内存运算。
作者反过来做:
FP16 Weight
↓
离线先变成 HMX Layout
↓
再每连续 32 个元素量化
由于 HMX Memory Order 是两行交错,连续 32 个元素逻辑上正好对应一个 2×16 的矩阵,因此得到 Tile-Group Quantization。
作者认为 Pretrained Weights 近似零均值分布,这种 Regrouping 不明显增加量化误差;实验也显示与普通 Group Quantization 精度接近。
但是 Group=32 的 INT4 权重只有 16B,远小于 HVX 的 128B SIMD Width。
Figure 7 因此再把 8 个 Group 合并:
正好一次填满一个 HVX Register,同时把相应量化参数保留在局部 Super-Block 中。
本质是三种粒度对齐:
32-element Quant Group
↓
128B HVX SIMD
↓
32×32 HMX Tile
与朴素方法最大的区别不是量化公式,而是把运行时 Layout Transformation 前移到离线模型布局设计。
2. LUT 查找表计算 Softmax
Softmax 的指数运算在 HVX 上没有专用单元,传统的多项式模拟又存在串行依赖,不利于 VLIW 的 Instruction-Level Parallelism。
查找表一共占用 64KiB,只占 8MiB TCM 的约 0.8%。
运行时直接把 FP16 输入的比特表示转换成表内偏移,然后使用 vgather 一次并行取回多项指数结果。
具体查找原理见论文。
Results
1. 实验平台
实验覆盖三代 Qualcomm 平台:
- OnePlus Ace3:Snapdragon 8 Gen2 / V73;
- OnePlus 12:Snapdragon 8 Gen3 / V75;
- OnePlus Ace5 Pro:Snapdragon 8 Elite / V79。
模型主要为:
- Qwen2.5-1.5B / 3B;
- Llama3.2-1B / 3B。
数学推理使用:
- MATH500;
- GSM8K。
Baseline:
- llama.cpp OpenCL 的 Adreno GPU 实现;
- QNN FP16 作为参考。
2. Figure 11:并行生成利用 HMX 空闲算力

并行生成确实把 HMX 原本闲置的计算能力利用起来。
主要原因是 HMX 原本空闲的 Tile 被更多生成路径填满,HMX 核心矩阵计算时间本身基本没有随 Batch 增长。
不过吞吐没有线性增长,因为 lm_head/logits 仍在 CPU 上执行;Batch=16 时,这部分甚至接近或超过总计算时间的 50%。
因此 Figure 11 同时证明了本文机会成立,也暴露出新的 CPU 瓶颈。
Figure 15:HMX-Friendly 量化布局消融

Figure 15 是验证第 5.1 节最关键的消融实验。
Baseline 使用普通 Group 布局:
普通 Group Layout
↓
运行时反量化
↓
Scatter 到 HMX 所需位置
仅加入 HMX-Friendly 权重布局 后,就因为消除了大量离散写入而明显降低延迟。
进一步加入 8-Group 合并等全部优化后,相比 Baseline 获得:
完整方案相比“完全不做反量化、只拷贝数据”的理论性能上界平均只慢约 27%,说明剩余反量化开销已经较小。