本文へ移動
cccskills
無料GitHub で公開

cpu-optimize

MNN CPU 后端性能归因分支(`skills/cpu/` 下,另一分支是 `cpu/kernel` kernel 开发)。按五层(Runtime 线程 / Executor 调度 / Layout 内存 / Dispatch 函数表 / Kernel ISA)定位瓶颈,含 bound 类型判定、op 级实验回路、跨框架 op 对 op 对比、跨层不一致的事后定位,以及 ARM / x86_64 / RISC-V 三侧「我到底跑在哪条 ISA 路径上」的诊断面。CPU 上算子或 LLM prefill/decode 慢、线程数或内存占用异常、出现性能回归、要与外部推理框架逐算子对比时使用。

インストール方法を見る

含まれるファイル(8)

  • SKILL.md6.9 KB
  • arch/arm.md14.7 KB
  • arch/riscv.md11.0 KB
  • arch/x86_64.md12.5 KB
  • bugfix.md21.5 KB
  • diagnose-and-route.md17.7 KB
  • layout-and-memory.md15.0 KB
  • runtime-and-scheduling.md18.5 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

MNN CPU 后端性能优化

触发条件:优化或评审 CPU 上的 MNN 算子、低 bit GEMM/GEMV、LLM prefill/decode 性能; 排查 CPU 侧线程 / 调度 / 布局 / 内存 / dispatch 的性能回归。ARM、x86_64、RISC-V 均适用。

本分册回答什么

「为什么慢,该改哪一层」。

本分册是 skills/cpu/ 的性能优化分支。ISA 路径的诊断面在本分册内 (arch/arm.md / arch/x86_64.md / arch/riscv.md);构建测试与 env 开关是两个分支 共用的工具,在 cpu/shared/。

不回答「这个 kernel 怎么写」——那是 cpu/kernel。 不回答「这个 op 框架里有没有」——那是 add-new-op。

你的问题去哪
慢,不知道原因本分册,从 diagnose-and-route.md 开始
已定位到某个 kernel,要动 SIMD/asmcpu/kernel(必须先有性能数据)
结果不对(不是慢)bugfix.md,或框架级 general-debug
这个 op MNN 里还没有add-new-op
RISC-V / RVV / 厂商矩阵扩展(IME2)在哪条路径上arch/riscv.md
要在 RISC-V 开发板上交叉编译、跑正确性与性能cpu/shared/riscv-remote-validation.md
要跑 CI / 加测试阶段test-ci

前置纪律

三条各侧共用的纪律(先确认路径再谈性能 / 先正确再加速 / 数字必须带维度标签)在 cpu/SKILL.md「三条共用的前置纪律」,全树只有那一份,本文不复述。

本分册只补一条落地方式:「先确认路径」在性能归因里是第一个动作,不是背景知识。 开跑之前先用 arch/arm.md / arch/x86_64.md / arch/riscv.md 的自证方法确认 这次到底跑在哪条 ISA 路径、哪张函数表上——走错路径不报错,而基于错路径测出的数字全部作废。

起点

先读 diagnose-and-route.md,它做三件事:排除「路径不对 / 数字不可复现」这两个最廉价的解释;把实验回路从端到端缩到 op 级(按「时间占比 ÷ 工作量占比」挑最不划算的 op,为它建贴场景的用例,跨框架对比时两边都建同一个 op 的用例);然后按 bound 类型把你路由到下面某一层。

分层文档

五层坐标系(每层管什么、典型改动是什么、去读哪份文档,含 L4/L5 的诊断面与实现面两个去处) 在 diagnose-and-route.md §三——那张表全树唯一一份,本文不复述。 本分支自己的文档就是它「去哪读」一列里的 runtime-and-scheduling.md(L1/L2)、 layout-and-memory.md(L3)、arch/(L4 诊断面)。

跨层交界处(L2↔L3 的 stride、L3↔L4 的 pack 与 tile、L4↔L5 的 ABI)是最贵的坑集中地, 表现多为「不崩、结果略差」,统一收在 bugfix.md。

工具文档(父级共享)

文档用途
cpu/shared/build-test-and-benchmark.md构建开关、run_test.out 使用规则、真实测试名注册表、llm_demo / llm_bench、验证矩阵模板、实验纪律、结果记录规范
cpu/shared/env-registry.md环境变量 / 编译宏 / backend flag / constexpr 四种机制的区分与逐项语义。用任何开关做 A/B 前先查这里

CoreFunctions 复用清单

优化的第一选择是复用而不是新写。每处复用都要验证精确语义(参数含义、layout、转置、归一化方式、 in-place 安全性、tail 行为、量化后处理),不能只看函数名。

这张表全树唯一一份,两个分支共用:kernel 的「该不该写 kernel」门禁 (kernel/SKILL.md 铁律 2)直接引用它,不再另抄一份。

函数优先用途注意点
gcore->MNNPackedMatMul大规模 GEMMPack 开销要能摊薄
gcore->MNNPackedMatMulRemainGEMM tail和主 kernel layout 一致
gcore->MNNComputeMatMulForE_1E=1 GEMV/decodeLLM decode 优先看这里
gcore->MNNComputeMatMulForH_1H=1 VecMat确认矩阵方向
gcore->MNNScaleAndAddBias / MNNScaleAndAddBiasScalarscale+bias检查 in-place
MNNSoftmaxsoftmax确认 axis/layout
MNNNormLayerNorm/RMSNorm确认 mean/rms 语义
gcore->MNNNormPackedNC4/NC8 LayerNorm/RMSNorm确认 pack、batch stride、residual fusion、tail 和线程分片
MNNExp / MNNSiLu激活部分函数不支持 in-place
gcore->MNNPackCUnit / MNNUnpackCUnitNC4/NC8 重排pack size 由 runtime 决定
gcore->MNNPackC4ForMatMul_A / MNNPackForMatMul_BMatMul pack和 kernel pack mode 配套
MNN_CONCURRENCY_BEGIN/END多线程注意 per-thread pointer 偏移

两条反向提醒:小 shape 上重型 pack+matmul 可能比朴素循环慢;为了复用现成 kernel 把融合算子 拆成多遍访存是净亏,优先扩展现有 CoreFunctions 入口以保留融合语义。

参考文件

文件用途
source/backend/cpu/compute/CommonOptFunction.hCoreFunctions / MatmulRelatedFunctions 定义与签名
source/backend/cpu/CPUAttention.cppMatMul/Softmax/Norm/多线程复用参考
source/backend/cpu/compute/DenseConvolutionTiledExecutor.cpppack、tiling、线程拆分参考
source/backend/cpu/compute/ConvInt8TiledExecutor.cpp低 bit int8 的 tile / 分片 / kernel 选择主战场
source/backend/cpu/arm/arm64/MNNPackedMatMul.SAArch64 asm 风格参考
test/speed/MatMulSpeed.cppspeed test 组织方式参考

复盘

非平凡任务结束后,如果产生了可复用的教训,走 retrospective: 把可复用的结论上提到对应层文档或 bugfix.md,实验过程与原始数字不进本仓。

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

为 MNN 框架新增算子。包含 Schema 定义、形状计算、几何计算、后端实现、单元测试的完整 TDD 流程。分 5 步执行,每步有独立测试标准。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

bugfix

無料

MNN 各类正确性/回归 bug 的排查入口,按 bug 类别分册组织,本文件只做症状分流。分册:内存别名与生命周期(arena reuse、`MemChunk`、融合引入的别名竞争)、量化误差与导出侧权重损坏(低 bit 打包、导出分块、PyTorch MPS/CUDA 大张量静默错误)、host 侧并发/线程竞争(共享所有权的引用计数被写坏、析构链崩溃、TSAN A/B 与编译期哨兵)、fp16 表示能力不足(长序列复读、position 塌缩,以及「实时计算→预计算查表」重构的三类陷阱)、GPU shader 越界与 command buffer 故障、后端 kernel 隐式假设违反(causal mask、layout 约定)、持久化缓存误信(weight-mmap sync 自我污染、跨模型缓存复用)、逐 run 不同的非确定性(未初始化内存/堆垃圾依赖、多线程动态分发×异构 kernel)。用户报告 MNN 输出乱码/退化、单测或 golden 对不上、改动后回归、换后端结果不同、开某开关才错、结果每次跑都不一样、或崩在析构链上且只在后台线程异步释放时偶现时使用。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

cpu

無料

MNN CPU 后端(ARM / x86_64 / RISC-V 三侧)的总入口,只做分流不承载技术内容。下分 `optimize/`(为什么慢、该改哪一层)与 `kernel/`(这条 kernel 怎么写对、怎么被选中)两个分支,`shared/` 放两者共用的构建测试跑分命令、env 开关注册表与 RISC-V 开发板远端验证纪律。做 CPU 侧的工作但还不确定该进哪个分支,或需要三侧结构差异对照(第二张函数表按什么分、二级表怎么构造、`Precision_Low` 语义、ISA A/B 怎么做——「三侧不同构对照表」全树唯一一份,就在本文件)时读这里。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

MNN CPU 后端 kernel 开发分支(`skills/cpu/` 下,另一分支是 `cpu/optimize` 性能归因)。覆盖标量 oracle → C++ SIMD → intrinsic → 汇编的四级实现阶梯、pack/kernel ABI 契约(tile、cell stride、后处理参数)、CoreFunctions 派发表注册与二级表安全构造、跨 ISA × 精度的正确性门禁,以及 AArch64 / x86_64 / RISC-V 三份实现参考。为 CPU 后端新写或移植 kernel(NEON / SSE / AVX / RVV intrinsic 或 .S 汇编)、新增一层 ISA、改 pack mode 或 tile 参数、把 kernel 挂进函数表时使用。已定位到 kernel 才进本分支。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

MNN Hexagon/HVX/HMX DSP 后端(`source/backend/hexagon`)的优化、重构、构建与回归验证。覆盖设备实测的相位分解、测量纪律、v79/v81 双架构差异、常见瓶颈模式、已否证方向与 cDSP crash 诊断。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

MNN Metal 后端 op/kernel 开发与优化入口。索引各份 sub-doc:性能问题诊断流程(op 单测 + 对手基准定位真瓶颈,优化任务第一站)、kernel 开发规范与优化知识库(命名/写法/GEMV/GEMM/attention + 手段方法论)、算子融合全链路(导出图→converter→Metal 单 dispatch + 融合方法论)、运行时调度(fence/content-cache/H2D/replay + 调度方法论)、构建测试基线、env 开关注册表。根据当前任务选择性阅读对应 sub-doc。

日本語の概要は準備中です。原文の説明を表示しています。

alibaba/MNN1.6万2026年10月10日 更新

alibaba のスキルをすべて見る

このスキルの問題を報告する