1# RK3588 NPU SRAM使用说明 2 3* RK3588 SOC内部含有1MB的SRAM,其中有956KB可供给SOC上各个IP所使用,已支持为RKNPU指定分配使用 4* SRAM可以帮助RKNPU应用减轻DDR带宽压力,目前支持为Internal和Weight两种类型内存指定分配SRAM 5 6--- 7一、板端环境要求 8--- 91、内核环境要求 10* RKNPU驱动版本>=0.8.0 11* 内核config需要开启CONFIG_ROCKCHIP_RKNPU_SRAM=y 12 * Android系统config路径如下: 13 ```shell 14 <path-to-your-kernel>/arch/arm64/configs/rockchip_defconfig 15 ``` 16 * Linux系统config路径如下: 17 ``` 18 <path-to-your-kernel>/arch/arm64/configs/rockchip_linux_defconfig 19 ``` 20* 内核相应DTS需要从系统SRAM中分配给RKNPU使用 21 * 从系统分配需求大小的SRAM给RKNPU,最大可分配956KB,且大小需要4K对齐 22 * 注意:默认系统中可能已为其他IP分配SRAM,比如编解码模块,各IP分配的SRAM区域不能重叠,否则会存在同时读写出现数据错乱现象 23 * 如下为956KB全部分配给RKNPU的例子: 24 ```dts 25 syssram: sram@ff001000 { 26 compatible = "mmio-sram"; 27 reg = <0x0 0xff001000 0x0 0xef000>; 28 29 #address-cells = <1>; 30 #size-cells = <1>; 31 ranges = <0x0 0x0 0xff001000 0xef000>; 32 /* 分配RKNPU SRAM */ 33 /* start address and size should be 4k algin */ 34 rknpu_sram: rknpu_sram@0 { 35 reg = <0x0 0xef000>; // 956KB 36 }; 37 }; 38 ``` 39 * 把分配的SRAM挂到RKNPU节点,修改如下所示的dtsi文件: 40 ```shell 41 <path-to-your-kernel>/arch/arm64/boot/dts/rockchip/rk3588s.dtsi 42 ``` 43 ```dts 44 rknpu: npu@fdab0000 { 45 compatible = "rockchip,rk3588-rknpu"; 46 /* ... */ 47 /* 增加RKNPU sram的引用 */ 48 rockchip,sram = <&rknpu_sram>; 49 status = "disabled"; 50 }; 51 ``` 52 532、RKNN SDK版本要求 54* RKNPU Runtime库(librknnrt.so)版本>=1.3.4b14 55 56--- 57二、使用方法 58--- 591、指定Internal使用SRAM: 60* 自动大小方式,将尝试从系统分配剩余足够的SRAM给Internal使用 61 * **export RKNN_INTERNAL_MEM_TYPE=sram** 62* 指定大小方式,将尝试从系统分配指定256KB大小的SRAM给Internal使用 63 * **export RKNN_INTERNAL_MEM_TYPE=sram#256** 64 652、指定Weight使用SRAM: 66* 自动大小方式,将尝试从系统分配剩余足够的SRAM给Weight使用 67 * **export RKNN_SEPARATE_WEIGHT_MEM=1** 68 * **export RKNN_WEIGHT_MEM_TYPE=sram** 69* 指定大小方式,将尝试从系统分配指定128KB大小的SRAM给Weight使用 70 * **export RKNN_SEPARATE_WEIGHT_MEM=1** 71 * **export RKNN_WEIGHT_MEM_TYPE=sram#128** 72 733、混合指定 74* RKNPU驱动支持对SRAM内存管理,支持同时指定SRAM给Internal和Weight同时使用,如下: 75 * **export RKNN_INTERNAL_MEM_TYPE=sram#256** 76 * **export RKNN_SEPARATE_WEIGHT_MEM=1** 77 * **export RKNN_WEIGHT_MEM_TYPE=sram#128** 78 79--- 80三、调试方法 81--- 821、SRAM是否启用查询 83* 通过开机串口日志查看SRAM是否启用,包含为RKNPU指定SRAM的地址范围和大小信息,如下所示: 84```shell 85rk3588_s:/ # dmesg | grep rknpu -i 86RKNPU fdab0000.npu: RKNPU: sram region: [0x00000000ff001000, 0x00000000ff0f0000), sram size: 0xef000 87``` 88 892、SRAM使用情况查询 90* 可通过节点查询SRAM的使用情况 91* 如下为未使用SRAM的位图表,每个点表示4K大小 92```shell 93rk3588_s:/ # cat /sys/kernel/debug/rknpu/mm 94SRAM bitmap: "*" - used, "." - free (1bit = 4KB) 95[000] [................................] 96[001] [................................] 97[002] [................................] 98[003] [................................] 99[004] [................................] 100[005] [................................] 101[006] [................................] 102[007] [...............] 103SRAM total size: 978944, used: 0, free: 978944 104``` 105* 如下为分配使用512KB后的SRAM位图表 106```shell 107rk3588_s:/ # cat /sys/kernel/debug/rknpu/mm 108SRAM bitmap: "*" - used, "." - free (1bit = 4KB) 109[000] [********************************] 110[001] [********************************] 111[002] [********************************] 112[003] [********************************] 113[004] [................................] 114[005] [................................] 115[006] [................................] 116[007] [...............] 117SRAM total size: 978944, used: 524288, free: 454656 118``` 119 1203、通过RKNN API查询SRAM大小 121* 通过rknn_query的RKNN_QUERY_MEM_SIZE接口查询SRAM大小信息 122```C++ 123typedef struct _rknn_mem_size { 124 uint32_t total_weight_size; 125 uint32_t total_internal_size; 126 uint64_t total_dma_allocated_size; 127 uint32_t total_sram_size; 128 uint32_t free_sram_size; 129 uint32_t reserved[10]; 130} rknn_mem_size; 131``` 132* 其中,total_sram_size表示:系统给RKNPU分配的SRAM总大小 133* free_sram_size表示:剩余RKNPU能使用的SRAM大小 134 1354、查看网络SRAM的占用情况 136* 板端环境中,RKNN应用运行前设置如下环境变量,可打印SRAM使用预测情况: 137```shell 138export RKNN_LOG_LEVEL=3 139``` 140* Internal分配SRAM的逐层占用情况,如下日志所示: 141```shell 142--------------------------------------------------------------------------- 143Total allocated Internal SRAM Size: 524288, Addr: [0xff3e0000, 0xff460000) 144--------------------------------------------------------------------------- 145---------------------------------------------------------------------+----------------------------------+----------- 146ID User Tensor DataType OrigShape NativeShape | [Start End) Size | SramHit 147---------------------------------------------------------------------+----------------------------------+----------- 1481 ConvRelu input0 INT8 (1,3,224,224) (1,1,224,224,3) | 0xff3b0000 0xff3d4c00 0x00024c00 | \ 1492 ConvRelu output2 INT8 (1,32,112,112) (1,2,112,112,16) | 0xff404c00 0xff466c00 0x00062000 | 0x0005b400 1503 ConvRelu output4 INT8 (1,32,112,112) (1,4,112,112,16) | 0xff466c00 0xff52ac00 0x000c4000 | 0x00000000 1514 ConvRelu output6 INT8 (1,64,112,112) (1,4,112,112,16) | 0xff52ac00*0xff5eec00 0x000c4000 | 0x00000000 1525 ConvRelu output8 INT8 (1,64,56,56) (1,4,56,56,16) | 0xff3e0000 0xff411000 0x00031000 | 0x00031000 1536 ConvRelu output10 INT8 (1,128,56,56) (1,8,56,56,16) | 0xff411000 0xff473000 0x00062000 | 0x0004f000 1547 ConvRelu output12 INT8 (1,128,56,56) (1,8,56,56,16) | 0xff473000 0xff4d5000 0x00062000 | 0x00000000 1558 ConvRelu output14 INT8 (1,128,56,56) (1,8,56,56,16) | 0xff3e0000 0xff442000 0x00062000 | 0x00062000 1569 ConvRelu output16 INT8 (1,128,28,28) (1,8,28,28,16) | 0xff442000 0xff45a800 0x00018800 | 0x00018800 15710 ConvRelu output18 INT8 (1,256,28,28) (1,16,28,28,16) | 0xff3e0000 0xff411000 0x00031000 | 0x00031000 15811 ConvRelu output20 INT8 (1,256,28,28) (1,16,28,28,16) | 0xff411000 0xff442000 0x00031000 | 0x00031000 15912 ConvRelu output22 INT8 (1,256,28,28) (1,16,28,28,16) | 0xff3e0000 0xff411000 0x00031000 | 0x00031000 16013 ConvRelu output24 INT8 (1,256,14,14) (1,16,14,14,16) | 0xff411000 0xff41d400 0x0000c400 | 0x0000c400 16114 ConvRelu output26 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 16215 ConvRelu output28 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3f8800 0xff411000 0x00018800 | 0x00018800 16316 ConvRelu output30 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 16417 ConvRelu output32 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3f8800 0xff411000 0x00018800 | 0x00018800 16518 ConvRelu output34 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 16619 ConvRelu output36 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3f8800 0xff411000 0x00018800 | 0x00018800 16720 ConvRelu output38 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 16821 ConvRelu output40 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3f8800 0xff411000 0x00018800 | 0x00018800 16922 ConvRelu output42 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 17023 ConvRelu output44 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3f8800 0xff411000 0x00018800 | 0x00018800 17124 ConvRelu output46 INT8 (1,512,14,14) (1,32,14,14,16) | 0xff3e0000 0xff3f8800 0x00018800 | 0x00018800 17225 ConvRelu output48 INT8 (1,512,7,7) (1,33,7,7,16) | 0xff3f8800 0xff3ff000 0x00006800 | 0x00006800 17326 ConvRelu output50 INT8 (1,1024,7,7) (1,67,7,7,16) | 0xff3e0000 0xff3ed000 0x0000d000 | 0x0000d000 17427 ConvRelu output52 INT8 (1,1024,7,7) (1,67,7,7,16) | 0xff3ed000 0xff3fa000 0x0000d000 | 0x0000d000 17528 AveragePool output54 INT8 (1,1024,7,7) (1,67,7,7,16) | 0xff3e0000 0xff3ed000 0x0000d000 | 0x0000d000 17629 Conv output55 INT8 (1,1024,1,1) (1,64,1,1,16) | 0xff3ed000 0xff3ed400 0x00000400 | 0x00000400 17730 Softmax output56 INT8 (1,1000,1,1) (1,64,1,1,16) | 0xff3e0000 0xff3e0400 0x00000400 | 0x00000400 17831 OutputOperator output57 FLOAT (1,1000,1,1) (1,1000,1,1) | 0xff3ae000 0xff3aefa0 0x00000fa0 | \ 179---------------------------------------------------------------------+----------------------------------+----------- 180---------------------------------------- 181Total Weight Memory Size: 4260864 182Total Internal Memory Size: 2157568 183Predict Internal Memory RW Amount: 11068320 184Predict Weight Memory RW Amount: 4260832 185Predict SRAM Hit RW Amount: 6688768 186---------------------------------------- 187``` 188* 其中上面文本图表中的SramHit为当前层Tensor所占用的SRAM大小,一般情况下将会节省当前大小的读+写的带宽 189* Predict SRAM Hit RW Amount表示整个网络SRAM的读写预测情况,可近似估计每帧节省的带宽 190* 注意:Linux环境日志重定向到终端,Android环境日志重定向到logcat 191