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