README

RK3588 NPU Research — Orange Pi 5 Plus

CI

Open-source reverse engineering of the Rockchip RK3588 Neural Processing Unit. This project includes a standalone NPU driver (librocketnpu), Mesa Gallium optimization patches, a QEMU emulator for the NPU hardware, and research into the proprietary RKNN register programming model.

Project Components

librocketnpu — Standalone Open-Source NPU Driver

A zero-dependency C library that drives the RK3588 NPU directly via DRM IOCTLs, without Mesa or the proprietary RKNN stack.

librocketnpu/
  src/
    rnpu_tflite.c    # TFLite FlatBuffer parser (zero deps)
    rnpu_onnx.c      # ONNX protobuf parser (protobuf-c)
    rnpu_model.c     # Graph analysis, per-channel grouping, scheduling
    rnpu_task.c      # CBUF bank allocation, spatial tiling
    rnpu_coefs.c     # Weight/bias quantization formatting
    rnpu_regcmd.c    # Hardware register command generation
    rnpu_drm.c       # DRM IOCTL submission (CREATE_BO, SUBMIT)
    rnpu_rknn.c      # RKNN binary parser (BRDMA extraction)
    rnpu_sw_ops.c    # CPU fallback: concat, maxpool, pad, resize, sigmoid, softmax
    rnpu_convert.c   # NPU tensor format conversion (NHWC <-> NCHW interleaved)
  include/
    rocketnpu.h      # Public C API
  tests/
    test_sw_ops.c    # 27 unit tests (CPU-only, no hardware)
    test_rknpu_abi.c # 29 ABI regression tests (CPU-only)
    test_onnx_parse.c # ONNX parser validation
  docs/
    compiler_architecture.md  # Research: open-source NPU compiler design

Features:

  • Loads TFLite INT8 models directly — no conversion step
  • ONNX frontend (protobuf-c) for RKNN-toolkit graph consumption
  • Dual-driver: supports both Rocket (mainline) and RKNPU (vendor) kernel drivers
  • Per-channel quantization via scale-sorted grouping + BRDMA DMA
  • Multi-task batching for cross-operation chaining
  • 56 unit tests, CI on GitHub Actions

Build:

# On board (aarch64, Armbian)
apt install libdrm-dev
cd librocketnpu && make

# With ONNX support
apt install libprotobuf-c-dev
make test_onnx_parse

# Run tests (no hardware needed)
make test

Mesa Optimization Patches

Performance patches for the upstream Rocket Gallium driver:

PatchDescriptionImpact
0003BO pool, cache sync reduction, NEON I/O conversion, cached submit12% avg latency reduction
0004SW ops: concat, maxpool, pad, resize, logisticYOLO mixed HW/SW execution
0005Fix INT8 regression: batch tasks per operationCorrectness fix for upstream

QEMU NPU Emulator

Full-system emulation of the RK3588 NPU for development without hardware:

  • Boots unmodified Armbian disk images
  • Emulates CRU (Clock Reset Unit) for kernel driver probe
  • NPU MMIO register model (PC, CNA, Core units)
  • IOMMU stub for DMA address translation

Benchmark Results

MobileNetV1 224x224 INT8 (single core)

StackLatencyStatus
RKNN proprietary (vendor kernel)2.6msBit-exact
librocketnpu (vendor kernel, BRDMA)10.2msBit-exact (max_diff=0)
Mesa Rocket + patches (mainline kernel)10.2msBit-exact
Mesa Rocket stock (mainline kernel)11.6msBit-exact

YOLOv5s-relu 640x640 INT8

StackLatencyAccuracy vs RKNN golden
RKNN proprietary (3 cores)9.5msReference
RKNN simulator (x86, ONNX Runtime)N/A~0.2 mean diff
librocketnpu (vendor, per-channel groups)292ms~18-25 mean diff

The accuracy gap is due to per-channel quantization hardware limitations — the NVDLA-derived CNA applies one requantization scale per operation, while YOLO's per-axis weights need per-channel scaling. librocketnpu approximates this with scale-sorted channel grouping and BRDMA MUL correction.

NPU Hardware Architecture

The RK3588 NPU has 3 independent cores (6 TOPS total), each with:

OffsetUnitFunction
+0x0000PC (Frontend)DMA engine: reads register command buffers, writes to CNA
+0x1000CNAConvolution Neural Accelerator (INT8 MAC array)
+0x2000DPU + RDMAData Processing: bias, batch norm, element-wise, output quantization
+0x3000CorePower, clock, interrupt control

The NPU is register-programmed — no instruction set. Each "instruction" is a (register_address, value) pair packed into 64-bit entries, DMA'd from memory by the PC unit. A typical convolution requires ~130 register writes across CNA, DPU, and RDMA units.

Research Documents

DocumentDescription
librocketnpu/docs/compiler_architecture.mdOpen-source NPU compiler design (ONNC, TVM, MLIR comparison)
optimization_report.mdMesa Rocket driver optimizations (12% latency reduction)
rocket_ioctl_analysis.mdDecoded IOCTL protocols for Rocket and RKNPU drivers
npu_research_report.mdFull research report: architecture, ftrace, driver comparison
per_axis_quantization_research.mdPer-channel quantization hardware investigation

Board Setup

BoardOrange Pi 5 Plus (RK3588, 16GB LPDDR4X, 233GB eMMC)
OSArmbian 25.11.1 Noble (Ubuntu 24.04)
Kernels6.18.10-current-rockchip64 (mainline) / 6.1.115-vendor-rk35xx (vendor)

License

librocketnpu: MIT. Research documents and patches: as noted per file.