OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)
在上篇文章中,我们学习了移植rk的npu驱动到OpenHarmony提供的内核。本文我们来学习如何在OpenHarmony标准系统rk系列芯片如何使用npu
OpenHarmony RK系列芯片运行npu测试用例
在移植npu驱动到OpenHarmony之后,来运行npu样例进行简单测试
1.O 测试准备
1.下载 rknpu2,下载地址:https://github.com/airockchip/rknn-toolkit2/tree/master
2.hdc工具:https://forums.openharmony.cn/forum.php?mod=viewthread&tid=1458
- 下载地址:http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist
1.1 编译npu样例
OpenHarmony采用musl作为C标准库,而不是glibc
- 详细介绍参考musl官方参考手册。
- musl与glibc的差异点请参考musl与glibc功能对比。
- OpenHarmony使用llvm开源项目的C++ 标准库libc++作为C++运行时库。
下载好rknpu2后,找到瑞芯微提供的librknnrt.so,它是一个板端的runtime库,npu运行需要该库。瑞芯微提供了两种,一种是安卓的so,一种是liunx的so。在OpenHarmony上使用linux的so。
librknnrt.so本文档采用linux aarch64位的,执行readelf -d librknnrt.so可知64位的so依赖以下库。
libpthread.so.0
libdl.so.2
libstdc++.so.6
libm.so.6
libgcc_s.so.1
rknpu2自带了一些测试用例,选择只依赖librknnrt.so库,不依赖其他库的。做最小化测试。所以编译rknn_matmul_api_demo测试样例,路径位于rknn-toolkit2-master/rknpu2/examples/rknn_matmul_api_demo。
1.编译工具链选择gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
- 自行下载:https://releases.linaro.org/components/toolchain/gcc-linaro/
- OpenHarmony源码也提供了,位于prebuilts/gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu
2.在rknn_matmul_api_demo目录下执行如下命令
export GCC_COMPILER=/xxx/xxx/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu
./build-linux.sh -t rk3568 -a aarch64 -b Release
3.编译好的二进制位于rknpu2/examples/rknn_matmul_api_demo/install
将gcc/linux-x86/aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib
下的所有so复制到rknpu2/examples/rknn_matmul_api_demo/install/rknn_matmul_api_demo_Linux/lib
目录
将rknn_matmul_api_demo二进制文件压缩为rknn_matmul_api_demo.tar.gz文件
cd rknn_matmul_api_demo
tar -czvf rknn_matmul_api_demo.tar.gz rknn_matmul_api_demo
1.2 运行编译好的npu样例
1.将rknn_matmul_api_demo.tar.gz发送至开发板data目录下面
hdc file send rknn_matmul_api_demo.tar.gz /data
2.解压文件并写将glibc的所有so复制到开发板的lib目录
hdc shell
# 进入开发板data目录
cd data
# 解压rknn_matmul_api_demo.tar.gz文件
tar -zxvf rknn_matmul_api_demo_Linux.tar.gz
# 将glibc的所有so复制到开发板的lib目录
mount -o remount,rw /
cp /data/rknn_matmul_api_demo_Linux/lib/* /lib
样例中的rknn_matmul_api_dynshape_demo默认依赖的库路径在开发板的lib目录下,所以需要将librknnrt.so依赖的glibc所有so复制到开发板的lib目录
3.执行样例
cd rknn_matmul_api_demo_Linux
./rknn_matmul_api_dynshape_demo 2 1,64,32#4,64,32#8,64,32 1 1
如果没有成功移植npu驱动,执行样例会出现如下显示