RKNPU 软件栈与 rockchip-npu-notes 的定位
本页回答一个定位问题:gregordinary/rockchip-npu-notes 这个仓库到底是干什么的? 它提供的是"编程视角"吗? 并把它放进 RKNPU 的完整软件栈里。
1. 结论:它是"面向编程的硬件参考",不是编程接口
rockchip-npu-notes[1] 是作者对 RK3588 / RK3576 NPU 逆向工程出来的硬件参考
笔记。它提供的是 programming-facing hardware reference(面向编程的硬件视角):
把"要自己发射寄存器程序、把模型算子落到芯片上,必须知道的硬件事实"整理成文,
但它不是编程接口本身——不是驱动、不是运行时库、也不是编译器/SDK。
一句话对照:
| 层次 | 由谁提供 | 形态 |
|---|---|---|
| 硬件事实 / 寄存器语义 / 编码 / 陷阱 | rockchip-npu-notes | 文档(本专题的来源) |
| 编程接口(提交 regcmd) | mainline rocket uAPI + librocketnpu |
内核驱动 + 用户态库 |
| 模型前端 | ggml / TFLite / ONNX Runtime 的 rocket 后端 | 可加载的算子库 |
| 图级 SDK(另一条路) | Rockchip rknn-toolkit2 / librknnrt |
厂商闭源工具链 |
2. 为什么说它是"编程视角"
从仓库的组织就能看出来——它按硬件块 / 寄存器 / 编码 / 提交路径编排,而不是按 数学或模型编排:
- 按块分文档:
hardware-overview、matmul-as-conv、depthwise-conv,以及encodings/下逐块的精度字段、tile 布局、DPU 流水、CNA 解压、RDMA 陷阱等; - 按驱动程序分文档:
encodings/regcmd-task-model(task / delta / 连续链)、perf/iova-and-multicore(每 fd 4 GB IOVA、一核一 fd); - 给出可操作的"坑":MRDMA trap、CBUF bank over-read、
FC_DATA_BANK、 LUT 的q=0、int16 输出饱和、13-bit 立方体上限——都是"配错就静默错/挂"的点; - 给出证据等级:每条结论标注
[HW sweep](实机扫描)、[source-confirmed](开源源码印证)、[TRM](手册)、[expected]、[hypothesis]、[live]、[host-computed],把"测出来的"与"推出来的"分开; - 附一份 start-to-finish 指南(
guide/):从构建用户态库、升频、选前端, 到跑通一次 matmul,串起整条链; - 开源代码引用精确到行,且 pin 到具体 commit。
仓库 README 自己的定位就是:"写给那些想通过 rocket 或任何别的裸寄存器命令
路径,在 NPU 上跑自己 compute 的人"[1]。这正是"编程视角",只不过停在硬件参考
层:它告诉你寄存器怎么放、命令怎么编、哪里会挂,而不是给你一个 matmul() API。
rocket + librocketnpu 提供"调用的手"。两者是参考层与接口层的关系,缺一不可。
3. 它不提供什么
- 不是驱动:kernel 侧是 mainline
rocket(DRM accel)或厂商 BSPrknpu, 不在这个仓库里; - 不是运行时库:发射 regcmd 的是
rocket-userspace里的librocketnpu; - 不是编译器 / 图优化器:图转换、量化、算子融合是厂商
rknn-toolkit2的活; - 不是权威规格:作者声明文档由 AI(主要是 Claude)撰写、不保证准确性,
所以关键结论应以实机
[HW sweep]或开源代码[source-confirmed]为准。
4. 完整软件栈与本仓库的位置
硬件参考(本专题来源)"] subgraph FOSS["mainline FOSS 路线(rocket)"] Lib["rocket-userspace
librocketnpu:用户态驱动 + matmul/算子库"] FE["ggml-rocket / tflite-rocket / ort-rocket
前端(LLM / 检测 / 编码器)"] Patches["patches/rocket
内核补丁:升频、perf 计数器"] end Vendor["rknpu-submit
厂商 BSP rknpu 驱动的提交适配"] subgraph BSP["厂商路线"] Tool["rknn-toolkit2 图编译/量化"] RT["librknnrt 运行时"] end Notes -.参考.-> Lib Notes -.参考.-> Patches FE --> Lib --> Rocket["rocket (kernel DRM accel)"] Patches -.-> Rocket Rocket --> HW["RKNPU 硬件"] Vendor --> RN["rknpu (厂商内核驱动)"] RN --> HW Tool --> RT --> RN
| 仓库 | 作用 | 语言 / 层次 |
|---|---|---|
rockchip-npu-notes[1] |
硬件参考:块、寄存器、regcmd、tile、陷阱、性能 | 文档 |
rocket-userspace[2] |
librocketnpu:用户态驱动 + matmul / 算子库 |
C,寄存器级 |
ggml-rocket / tflite-rocket / ort-rocket |
前端:把 ggml / TFLite / ONNX 的算子落到库上 | 多语言,算子级 |
rknpu-submit |
厂商 BSP rknpu 驱动的提交 provider |
C |
patches/rocket |
内核补丁:NPU 升频、只读 DDMA 探针 | 内核 C |
rknn-toolkit2 / librknnrt |
厂商图级 SDK:转换 / 量化 / 图编译 + 运行时 | 闭源,图级 |
5. 两条路线的差异
| 维度 | FOSS rocket 路线 |
厂商 RKNN 路线 |
|---|---|---|
| 编程粒度 | 寄存器命令(regcmd),自己发程序 | 图 / 算子,交给工具链 |
| 可控性 | 可以控制 tile、CBUF 复用、精度字段、K 累加 | 受工具链调度与算子覆盖面约束 |
| 资料 | rockchip-npu-notes 这类逆向笔记 / 开源源码 |
官方文档、闭源二进制 |
| 典型入口 | /dev/accel/accelN + rocket uAPI |
/dev/rknpu + librknnrt |
两套栈可以并存:rknpu-submit 让同一个 librocketnpu 与各前端在厂商内核上也能跑[1]。
6. 按目标选入口
- 想弄清硬件结构 → 硬件架构 → 块内部结构;
- 想自己编程 / 发 regcmd → 编程架构,再读上游
guide/; - 想调性能 → 上游
perf/(not-mac-bound、clock、iova-and-multicore、weight-residency-fusion等); - 想核对细节 → 直接读上游
encodings/与SOURCES.md,并按 commit pin 引用。
参考文献
[1] GREGORDINARY. Rockchip NPU reverse-engineering notes[EB/OL]. (2026)[2026-10-09]. https://github.com/gregordinary/rockchip-npu-notes/tree/81b0d17da0b8a472c1a1e6f7d2ddba6b34d10111
[2] GREGORDINARY. rocket-userspace: include/npu_hw.h[EB/OL]. (2026)[2026-10-09]. https://github.com/gregordinary/rocket-userspace/blob/f86cf52c666b4eddadc17d80d6c558b4067c0d6b/include/npu_hw.h#L25-L33
© 2026 Yang Huan · yanghuan9812@qq.com