OpenHarmony开发者论坛
标题:
OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)
[打印本页]
作者:
离北况归
时间:
2024-9-28 20:32
标题:
OpenHarmony标准系统上实现对rk系列芯片NPU的支持(npu使用)
[md]在上篇文章中,我们学习了[移植rk的npu驱动到OpenHarmony提供的内核](
https://ost.51cto.com/posts/29962
)。本文我们来学习如何在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/fo ... thread&tid=1458
- 下载地址:
http://ci.openharmony.cn/workbench/cicd/dailybuild/dailylist
### 1.1 编译npu样例
OpenHarmony采用musl作为C标准库,而不是glibc
- 详细介绍参考[musl官方参考手册](
http://musl.libc.org/manual.html
)。
- musl与glibc的差异点请参考[musl与glibc功能对比](
https://wiki.musl-libc.org/functional-differences-from-glibc.html
)。
- OpenHarmony使用llvm开源项目的C++ 标准库[libc++](
https://libcxx.llvm.org/
)作为C++运行时库。
下载好rknpu2后,找到瑞芯微提供的librknnrt.so,它是一个板端的runtime库,npu运行需要该库。瑞芯微提供了两种,一种是安卓的so,一种是liunx的so。在OpenHarmony上使用linux的so。
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_720,h_472)
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
```
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_304)
rknpu2自带了一些测试用例,选择只依赖librknnrt.so库,不依赖其他库的。做最小化测试。所以编译rknn_matmul_api_demo测试样例,路径位于rknn-toolkit2-master/rknpu2/examples/rknn_matmul_api_demo。
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_304)
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
```
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_808)
3.编译好的二进制位于rknpu2/examples/rknn_matmul_api_demo/install
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_502,h_465)
将 `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`目录
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_646,h_945)
将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
```
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_804)
> 样例中的rknn_matmul_api_dynshape_demo默认依赖的库路径在开发板的lib目录下,**所以需要将librknnrt.so依赖的glibc所有so复制到开发板的lib目录**
> ![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_804)
3.执行样例
```
cd rknn_matmul_api_demo_Linux
./rknn_matmul_api_dynshape_demo 2 1,64,32#4,64,32#8,64,32 1 1
```
![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_706)
> 如果没有成功移植npu驱动,执行样例会出现如下显示
> ![image.png](
https://dl-harmonyos.51cto.com/i ... rocess=image/resize
,w_820,h_169)
>
[/md]
欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/)
Powered by Discuz! X3.5