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。

📝 换句话说:notes 解释"为什么/怎么编",rocket + librocketnpu 提供"调用的

手"。两者是参考层与接口层的关系,缺一不可。

3. 它不提供什么

  • 不是驱动:kernel 侧是 mainline rocket(DRM accel)或厂商 BSP rknpu, 不在这个仓库里;
  • 不是运行时库:发射 regcmd 的是 rocket-userspace 里的 librocketnpu;
  • 不是编译器 / 图优化器:图转换、量化、算子融合是厂商 rknn-toolkit2 的活;
  • 不是权威规格:作者声明文档由 AI(主要是 Claude)撰写、不保证准确性, 所以关键结论应以实机 [HW sweep] 或开源代码 [source-confirmed] 为准。

4. 完整软件栈与本仓库的位置

flowchart TD Notes["rockchip-npu-notes

硬件参考(本专题来源)"] 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

results matching ""

    No results matching ""