skills/arm-cpu-optimize/step1-benchmark.md
目标:在优化前拿到可复现的正确性和性能基线,避免靠模型输出或单次耗时猜测。
不要默认新建 speed test。先查当前仓库已有测试是否覆盖目标路径:
rg -n "LinearRoofline|MatMul|lowMemory|HybridConv|blockConv" test source/backend/cpu
常用低 bit LLM kernel 基线:
cd build
./run_test.out op/lowMemory/blockConv 0 1 4
./run_test.out op/lowMemory/HybridConv 0 1 4
./run_test.out op/lowMemory/blockConv 0 1 4 # 在 SDOT 目标设备/构建配置上复跑
./run_test.out op/lowMemory/HybridConv 0 1 4 # 在 SDOT 目标设备/构建配置上复跑
./run_test.out speed/GemvBW 0 2
如果已有测试不能覆盖目标 shape,再新增 focused test。
普通算子至少记录:
低 bit LLM kernel 额外记录:
| 维度 | 必测组合 |
|---|---|
| bit | w2、w3,如任务只涉及一个 bit 则只测该 bit |
| ISA | I8MM、SDOT、SME2 等目标路径 |
| block | block32、block64、per-channel 中任务涉及的组合 |
| 后处理 | fp32 min/max、bias/scale/zp、add-dst 如存在 |
| 模型 | 一个短 prompt 的 no-thinking/greedy sanity |
模型输出异常时,先固定采样变量,再判断 kernel 是否错误。
记录可解释的指标,不只记录耗时:
| 指标 | 说明 |
|---|---|
us/iter | 端到端 kernel 或 test 平均耗时 |
| bytes/elem | 包括权重和 metadata 的真实字节 |
| eff GB/s | 用真实读取字节估算 |
%peak | 对比 streaming bandwidth |
| GFLOPS / AI | 判断 compute/issue/memory 倾向 |
| threads | 线程数必须固定 |
w2/w3 的 eff GB/s 低时,不要直接判定内存带宽不足。先看 unpack 指令数、寄存器压力、metadata load 和 postprocess。
只有已有测试不能回答问题时才新增。新增测试要小而准:
低 bit GEMV 可优先写 roofline 风格测试,而不是完整模型 benchmark。
## Baseline
commit:
platform:
build options:
threads:
ISA path:
shape/block:
| test | bit | ISA | us/iter | bytes/elem | eff GB/s | GFLOPS | note |
|------|-----|-----|---------|------------|----------|--------|------|
Correctness:
- op test:
- model sanity: