skills/arm-cpu-optimize/step2-analyze.md
目标:根据基线判断该优化该改哪里,避免盲目写汇编或盲目加 unroll。
| 类型 | 常见信号 | 优先方向 |
|---|---|---|
| memory bound | eff GB/s 接近 memcpy roofline | 减少字节、改善连续访问、减少 metadata |
| unpack/issue bound | eff GB/s 低但指令很多 | 减少 bit unpack、常量复用、调整 layout |
| compute bound | GFLOPS 接近指令峰值 | 更大 tile、更多 accumulator、ISA 指令 |
| postprocess bound | dot 快但 scale/minmax/store 慢 | 合并后处理、缩短 min/max live range |
| dispatch/pack 错配 | 质量错或某 ISA 独坏 | 检查 packer、unit、kernel pointer |
w2/w3 常见是 unpack/issue bound,不是单纯 bandwidth bound。
分析以下问题:
weightPtr 是否按真实 cell stride 前进?sdot/smmla 的 lane 分组和 pack layout 是否完全匹配?如果质量问题只出现在一个 ISA,优先查 dispatch/pack/register lifetime。 如果 no-thinking/greedy 正常但 mixed sampling 复读,先不要判定 kernel 错。
按风险从低到高选择:
ld1r replicate load、减少重复 unpack。## 方案
目标路径:
当前瓶颈:
不优化的路径:
Correctness guard:
- C++ oracle:
- op tests:
- model sanity:
实现计划:
1.
2.
3.
性能目标:
- metric:
- expected direction:
风险:
- register lifetime:
- pack/dispatch:
- tail/block:
性能目标可以是方向性的,例如减少 unpack 指令或提升 eff GB/s,不要编造未实测数字。