skills/arm-cpu-optimize/step0-decompose.md
目标:在写代码前确认优化入口、数据布局、已有函数可复用性和必须覆盖的正确性路径。
适用场景:普通 ARM CPU 算子优化、低 bit GEMM/GEMV kernel、dispatch/pack review。
记录这次任务实际覆盖的路径,不要默认所有 ISA 和所有 shape 都相关。
| 项目 | 需要写清楚 |
|---|---|
| 入口 | executor、CoreFunctions 指针、asm symbol、packer |
| 数据 | FP32/FP16/INT8/w2/w3/w4,per-channel/per-block |
| shape | E=1 decode、E>1 prefill、block32、block64、tail、OC split |
| ISA | NEON、SDOT、I8MM、SME2、fallback、runtime disable flag |
| 后处理 | bias、scale、zero point、add-dst、fp32 min/max、ReLU/ReLU6 |
| 验收 | op test、模型 prompt、roofline/speed test |
低 bit LLM kernel 尤其要明确:权重 pack layout、cell stride、metadata stride、block size、是否有 padding。
优先读取和当前入口直接相关的文件:
source/backend/cpu/compute/CommonOptFunction.h:函数指针、参数结构、pack mode。source/backend/cpu/CPUAttention.cpp:仅在需要 CoreFunctions 复用范式时参考。不要读取或依赖 schema/private/、source/internal/。
普通算子优先复用 CoreFunctions;低 bit kernel 则先确认已有 kernel/packer 是否只需修正或特化。
| 代码模式 | 优先考虑 |
|---|---|
| 大规模 GEMM | MNNPackedMatMul / MNNPackedMatMulRemain |
| E=1 GEMV / decode | MNNComputeMatMulForE_1 |
| scale + bias | MNNScaleAndAddBias / MNNScaleAndAddBiasScalar |
| softmax / norm / activation | MNNSoftmax / MNNNorm / MNNExp / MNNSiLu |
| NC4/NC8 或 MatMul pack | MNNPackCUnit / MNNUnpackCUnit / MatMul pack helpers |
| 没有函数覆盖的核心热点 | C++ oracle -> C++ SIMD 模拟 -> asm |
替换前必须确认:
dst == src 时该函数是否 in-place 安全;不确定就读实现或写小测试。复杂 kernel 不要直接写 asm。先决定 oracle 怎么做:
| 层级 | 用途 |
|---|---|
| C++ 标量 oracle | 固定数学语义、pack 解码、metadata 读取 |
| C++ SIMD/寄存器模拟 | 固定 sdot/smmla lane 分组、unpack 顺序、tail |
| asm kernel | 只迁移已经验证过的语义 |
低 bit kernel 的 oracle 至少覆盖:
tId>0 的 OC chunk。用短表即可,不需要长报告。
## 路径结论
入口:
ISA:
shape:
pack/cell stride:
后处理:
## 复用判断
| 逻辑 | 复用现有函数/保留/新增 kernel | 原因 |
|------|-------------------------------|------|
## correctness oracle
| 对比点 | 方法 | 覆盖 case |
|--------|------|-----------|