6. SDK使用指南
本文档旨在帮助用户快速了解RNE库的使用流程,以期达到快速上手的目的。
名称解释
术语 |
说明 |
|---|---|
Knight |
清微骑士工具链英文名称 |
CGRA |
粗粒度可重构阵列处理器 |
RNE |
可重构神经网络加速引擎 |
FSPM |
CGRA芯片内部数据缓存 |
WSPM |
CGRA芯片权重数据缓存 |
MSPM |
CGRA芯片量化参数缓存 |
DDR |
CGRA芯片外部数据缓存 |
DMA |
直接存储器访问功能 |
RCCN |
可重构矩阵计算功能 |
RCVT |
可重构向量计算功能 |
RDMA |
读DMA功能 |
WDMA |
写DMA功能 |
通用算子层 |
CPU中执行的算子操作层 |
高效算子层 |
NPU中执行的算子操作层 |
6.1. RNE库介绍
RNE库包含模拟库 RNE-SIM-Lib 和板端运行库 RNE-RT-Lib。
RNE模拟库提供在 linux pc 下模拟正常网络推理所需的API,方便用户在PC端 构建开发调试NN相关的算法原型,使用户在没有硬件环境的情况下也能进行快速的NN模型算法原型开发。以及模拟调试某些在板端发现的NN相关问题。
RNE板端运行库提供网络在板端推理所需的API,用户可以通过加载运行库,完成在板端的部署。
备注
下文提及的库,默认都为RNE库,以 TX5368AV200 平台示例,下文不再特殊说明。
6.1.1. 库结构
库结构图
6.1.2. RNE-SIM-Lib
RNE-SIM-Lib目录结构
如图 1‑2所示,RNE-SIM-Lib由samples、open_source、include、bin和libs和文件夹构成,五个文件夹下对应的内容如下表所示:
文件夹 |
描述 |
|---|---|
samples |
示例程序 |
include |
库对应的头文件 |
libs |
静态模拟库 |
open_source |
开源代码 |
bin |
动态模拟库 |
include和libs详细结构图
根据图 1‑3所示,模拟库(libs)共有librne_common.a、librne_pal_sim.a、librne_rt_g3.a和librne_vm.a四个库组成,include中是库对应的头文件,两者的对应关系描述如下表所示:
libs |
头文件 |
|---|---|
librne_common.a |
ts_type.h ts_rne_type.h ts_rne_log.h ts_rne_nn_input.h ts_rne_nn_output.h ts_rne_version.h ts_rne_time.h ts_rne_nn_thread.hpp ts_rne_thread_safe_queue.hpp |
librne_vm.a |
无 |
librne_rt_g3.a |
对应头文件为: ts_rne_c_api.h ts_rne_device.h |
librne_pal_sim.a |
ts_rne_plat_port.h |
备注
librne_rt_g3.a在不同产品有所差异:
TX510x对应的为librne_rt_g1.a。
TX5368x_TX5339x_TX5335x、TX5215x_TX5239x200_TX5239x220_TX5239x300和TX5112x_TX5239x201、TX5336x_TX5256x对应的为librne_rt_g3.a。
bin下动态库和libs静态库一一对应,此处不再做特殊说明。
Samples详细结构图
如图所示,samples共有compiled_model、scripts和rne_simple_foward等文件夹构成,各个文件夹描述如下表所示:
samples |
描述 |
|---|---|
compiled_model |
编译器编译生成的二进制部署资源 |
scripts |
bin2header实现二进制文件到头文件的转化。详细用法见FAQ |
rne_e2e_example.sh 执行典型sample的脚本,关联sample为rne_simple_forward |
|
rne_e2e_example_cm.sh 执行指定sample的脚本 |
|
rne_si mple_forward |
调用库实现典型网络推理的sample |
... |
其他sample参考第6章节 |
6.1.3. RNE-RT-Lib
RNE-RT-Lib目录结构图
如图所示,RNE-RT-Lib由samples、open_source、include、bin和libs等文件夹构成,九个文件夹下对应的内容如下表所示:
文件夹 |
描述 |
|---|---|
samples |
示例程序 |
include |
库对应的头文件 |
libs |
glibc静态运行时库 |
open_source |
开源code |
aarch64_ts_linux_uclibc_libs |
uclibc静态运行时库 |
opencv4.5.5 |
opencv4.5.5 libs与include |
bin |
glibc动态运行时库 |
aarch64_ts_linux_uclibc_bin |
uclibc动态运行时库 |
tools |
小工具 |
include和libs详细结构图
根据图所示,板端运行库(libs)共有librne_common.a、librne_pal_linux_a53.a和librne_rt_g3.a三个库组成,include中是库对应的头文件,两者的对应关系描述如下表所示:
libs |
头文件 |
|---|---|
librne_common.a |
ts_type.h ts_rne_type.h ts_rne_log.h ts_rne_nn_input.h ts_rne_nn_output.h ts_rne_version.h ts_rne_time.h ts_rne_nn_thread.hpp ts_rne_thread_safe_queue.hpp |
librne_rt_g3.a |
对应头文件为: ts_rne_c_api.h ts_rne_device.h |
librne_pal_linux_a53.a |
ts_rne_plat_port.h |
备注
librne_rt_g3.a在不同产品有所差异:
TX510x对应的为librne_rt_g1.a。
TX5368x_TX5339x_TX5335x、TX5336x_TX5256x、TX5215x_TX5239x200_TX5239x220_TX5239x300和TX5112x_TX5239x201对应的为librne_rt_g3.a。
librne_pal_linux_a53.a在不同产品有所差异:
TX510x对应的为linux_pal_ck805.a。
TX5368x_TX5339x_TX5335x对应的为librne_pal_linux_a53.a。
TX5336x_TX5256x、TX5215x_TX5239x200_TX5239x220_TX5239x300和TX5112x_TX5239x201对应的为librne_pal_linux_a7.a。
uclibc版本下库的名称与glibc版本下相同,此处不再做特殊说明。
*bin下动态库和*libs静态库一一对应,此处不再做特殊说明。
samples详细结构图
根据图所示,samples共有compiled_model、scripts和rne_simple_forward等文件夹构成,各个文件夹描述如下表所示:
samples |
描述 |
|---|---|
compiled_model |
编译器编译生成的二进制部署资源 |
scripts |
bin2header实现二进制文件到头文件的转化。 详细用法见 FAQ |
rne_e2e_example.sh 执行典型sample的脚本,关联sample为rne_simple_forward |
|
rne_e2e_example_cm.sh 执行指定sample的脚本 |
|
rne_simple_forward |
调用库实现典型网络推理的sample |
... |
其他sample参考 samples说明 |
6.2. API介绍
SDK提供了一些不同方面的API,包含基本接口、时间接口、日志接口、版本接口、VPE接口、输入输出接口、高级内存接口、通用算子接口、异步接口、多核相关接口等,涉及到以下头文件。
头文件 |
API说明 |
|---|---|
ts_rne_c_api.h |
包含了N N层的API,提供了与RNE相关的函数和结构体的声明。 |
ts_rne_device.h |
提供 了与RNE设备层相关的API,用于管理和控制RNE设备。 |
ts_rne_log.h |
包含 了与SDK日志相关的API,用于打印和管理日志信息。 |
ts_rne_version.h |
提供了获取SDK版本信息的API。 |
ts_rne_plat_port.h |
定义了SDK底层 数据结构,可能包含与平台相关的接口和类型定义。 |
ts_rne_time.h |
提供 了与SDK时间相关的API,用于获取和处理时间信息。 |
ts_rne_type.h |
定义了SDK中使用的一些类型和数据结构。 |
ts_rne_nn_input.h |
提供了 填充NN层输入blobs相关的API,用于准备输入数据。 |
ts_rne_nn_output.h |
提供 了填充NN层输出addr相关的API,用于获取输出数据。 |
ts _rne_nn_thread.hpp |
用于异步调用多个网络 时使用的头文件,提供了多线程相关的功能和接口。 |
ts_rne_thr ead_safe_queue.hpp |
用于异步调用多个 网络时使用的头文件,提供了线程安全队列的实现。 |
ts_rne_vpe.h |
包含了与图像处理 和视觉任务相关的函数、结构体或其他类型的声明。 |
ts_rne_type.h |
包 含了与神经网络推理相关的类型定义、枚举常量等。 |
ts_type.h |
包 含了与系统或库中使用的一些常见类型相关的定义。 |
备注
NN层是RNE设备层的上层,用户一般的使用只需要用到NN层的API,特殊情况下才需要用到底层的RNE设备层API。
6.2.1. 基础接口
6.2.1.1. TS_MPI_TRP_RNE_InitResourceByType
【描述】 初始化芯片资源。
【定义】
TS_S32 TS_MPI_TRP_RNE_InitResourceByType(RNE_TYPE_NAME_E type);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
type |
芯片类型 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_version.h
备注
此接口必须调用。
【举例】
参考samples。
6.2.1.2. TS_MPI_TRP_RNE_OpenDevice
【描述】
打开RNE设备并初始化RNE驱动。通过传入RNE_DRIVER_S结构体指针,可以设置相关的设备信息和配置参数。同时,需要传入一个函数指针,该函数用于注册所有的通用算子层。 该函数会根据传入的设备信息和配置进行设备的打开和初始化操作,并将相关的驱动句柄保存在RNE_DRIVER_S结构体中。在成功打开设备并初始化驱动后,可以进行后续的模型加载和推理操作。
【定义】
TS_S32 TS_MPI_TRP_RNE_OpenDevice(RNE_DRIVER *driver, TS_MPI_TRP_RNE_RegisterAllGpLayers registerGpLayers);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
driver |
RNE驱动结 构体指针,用于传递RNE设备的相关信息和配置。 如果参数为NULL,则调 用内部默认driver相关配置,此参数传NULL即可。 |
输入 |
registe rGpLayers |
函数指针,用于注册通用算子层。 如 果模型中不包含通用算子层,此参数可以为NULL。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_device.h
备注
此接口必须调用,且调用一次即可,多次调用无意义。此接口不支持线程互斥。
【举例】
参考samples。
6.2.1.3. TS_MPI_TRP_RNE_CloseDevice
【描述】
用于关闭RNE设备并释放相关资源。在完成模型加载、推理和卸载任务后,可以调用该函数来进行设备的关闭操作,以释放占用的资源。该函数会执行设备的关闭操作,并释放相关的驱动句柄和资源。
【定义】
TS_S32 TS_MPI_TRP_RNE_CloseDevice(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_device.h
备注
在调用该函数前,需要确保已经完成了所有的模型推理任务,并且不再需要使用RNE设备。调用一次即可,多次调用无意义。
【举例】
参考samples。
6.2.1.4. TS_MPI_TRP_RNE_DeviceIsOpened
【描述】
获取当前RNE设备的状态。
【定义】
TS_RNE_BOOL TS_MPI_TRP_RNE_DeviceIsOpened(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
TS_TRUE |
当前RNE设备为打开状态 |
TS_FALSE |
当前RNE设备为关闭状态 |
【所在头文件】
ts_rne_device.h
6.2.1.5. TS_MPI_TRP_RNE_LoadModel
【描述】
用于加载RNE模型。通过传入RNE_NET_S结构体指针,可以设置模型的相关信息和配置参数。
该函数会根据传入的模型信息和配置进行模型的加载操作。在成功加载模型后,可以进行后续的推理任务。
【定义】
TS_S32 TS_MPI_TRP_RNE_LoadModel(RNE_NET_S *net);
【参数】
参数 名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE _NET_S结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
备注
调用此函数之前,必需要先调用TS_MPI_TRP_RNE_OpenDevice。
【举例】
参考samples。
6.2.1.6. TS_MPI_TRP_RNE_UnloadModel
【描述】
用于卸载RNE模型。通过传入RNE_NET_S结构体指针,可以设置模型的相关信息和配置参数,如模型文件路径、输入输出节点名称、模型类型等。
该函数会根据传入的模型信息和配置进行模型的卸载操作。在完成模型推理任务后,调用该函数可以释放占用的模型资源。
【定义】
TS_S32 TS_MPI_TRP_RNE_UnloadModel(RNE_NET_S *net);
【参数】
参 数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
备注
在调用该函数前,需要确保已经完成了所有的模型推理任务,并且不再需要使用该模型。
【举例】
参考samples。
6.2.1.7. TS_MPI_TRP_RNE_Forward
【描述】
用于执行RNE模型的前向推理操作。通过传入RNE_NET_S结构体指针,可以设置模型的相关信息和配置参数。
该函数会根据传入的模型信息和配置进行模型的前向推理操作,并返回推理结果。推理结果以RNE_BLOBS_S结构体的形式返回,包含了模型输出的各个节点的数据。
【定义】
RNE_BLOBS_S *TS_MPI_TRP_RNE_Forward(RNE_NET_S *net);
【参数】
参数 名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_ NET_S结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
RNE_B LOBS_S* |
若返回为NULL,则前向推理出现异常; 若网络的cpDeb ugLayerName不为空且能找到该调试层,则返回该调试层的输出; 否则返回网络的 最后结果,等同于函数TS_MPI_TRP_RNE_GetResultBlobs的返回值 |
【所在头文件】
ts_rne_c_api.h
备注
在调用该函数前,需要确保已经成功打开设备,加载了模型,并且准备好输入数据、权重或者量化数据。
【举例】
参考samples。
6.2.1.8. TS_MPI_TRP_RNE_OnceLoad
【描述】
用于执行RNE模型的一次前向推理操作,实现权重或者量化数据一次性加载到RNE内部存储空间。
【定义】
TS_S32 TS_MPI_TRP_RNE_OnceLoad(RNE_NET_S *net);
【参数】
参数 名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_ NET_S结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
备注
只针对在编译器编译资源时,使用onceload方式编译的资源文件。在调用该函数前,需要确保已经成功打开设备,加载了模型,并且准备好权重或者量化数据。
【举例】
参考samples。
6.2.1.9. TS_MPI_TRP_RNE_GetBlobsBufSize
【描述】
获取网络blob数据缓存区大小。
【定义】
TS_U32 TS_MPI_TRP_RNE_GetBlobsBufSize(RNE_NET_S *net);
【参数】
参数 名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_ NET_S结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
1 ~ MAX |
blob缓存数据大小,MAX为TS_U32的最大值 |
0 |
获取blob缓存数据大小失败 |
【所在头文件】
ts_rne_c_api.h
6.2.1.10. TS_MPI_TRP_RNE_CStride
【描述】
计算内存中数据按通道方向对齐后的通道数c_stride, 一般计算出的c_stride大于等于输入的channel数。
【定义】
TS_S32 TS_MPI_TRP_RNE_CStride(TS_S32 chan, TS_S32 bitNum, TS_RNE_BOOL isJoined);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
chan |
通道数 |
输入 |
bitNum |
数据位宽 |
输入 |
isJoined |
是否是拼接的 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
1 ~ MAX |
返回对齐后的通道数,MAX为TS_U32的最大值。 |
小于等于0 |
传参存在错误。 |
【所在头文件】
ts_rne_c_api.h
备注
根据位宽、通道数以及是否拼接,计算内存中数据按通道方向向上对齐后的通道数。该接口即将废弃,后续该功能将被TS_MPI_TRP_RNE_GetBlobCStride代替。
6.2.1.11. TS_MPI_TRP_RNE_GetBlobCStride
【描述】
该函数用于计算 blob 数据在 C 维度上的跨度,以便进行数据操作和内存布局的处理。
【定义】
TS_S32 TS_MPI_TRP_RNE_GetBlobCStride(RNE_BLOB_S * blob);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
blob |
指向 RNE_BLOB_S 结构体的指针,表示要获取跨度的 Blob 数据。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
1 ~ MAX |
返回对齐后的通道数,MAX为TS_U32的最大值。 |
小于等于0 |
传参存在错误。 |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
【举例】
TS_S32 cStride = TS_MPI_TRP_RNE_GetBlobCStride(blobs->blob[idx]);
6.2.1.12. TS_MPI_TRP_RNE_GetResultBlobs
【描述】
获取网络推理结果或调试层的输出blobs。
【定义】
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetResultBlobs(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
RNE_ BLOBS_S* |
若网络init时的cpDebugLayerName不 为空,并且能找到该调试层,则返回该调试层的输出blobs指针; 否则返回网络的最后结果blobs指针 |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.13. TS_MPI_TRP_RNE_GetInputBlobs
【描述】
获取网络输入的blobs。
【定义】
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetInputBlobs(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
RNE_BLOBS_S* |
返回网络输入Blobs |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.14. TS_MPI_TRP_RNE_GetHideBlobs
【描述】
获取隐藏层的blobs。
【定义】
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetHideBlobs(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
RNE_BLOBS_S* |
返回网络隐藏层Blobs |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.15. TS_MPI_TRP_RNE_GetResVersion
【描述】
获取网络资源信息。
【定义】
const TS_CHAR *TS_MPI_TRP_RNE_GetResVersion(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
const TS_CHAR* |
网络资源信息 |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.16. TS_MPI_TRP_RNE_GetWeightSize
【描述】
获取权重数据和量化数据的总大小。
【定义】
TS_S64 TS_MPI_TRP_RNE_GetWeightSize(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_S64 |
权重数据和量化数据的总大小 |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.17. TS_MPI_TRP_RNE_GetCfgSize
【描述】
获取指令文件的大小。
【定义】
TS_S64 TS_MPI_TRP_RNE_GetCfgSize(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_S64 |
指令文件的大小 |
【所在头文件】
ts_rne_c_api.h
备注
需要在加载模型后调用。
6.2.1.18. TS_MPI_TRP_RNE_SetTimeout
【描述】
设置网络推理超时时间。
【定义】
TS_RNE_BOOL TS_MPI_TRP_RNE_SetTimeout(TS_S32 times);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
times |
网络推理超时时间,单位:毫秒 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_RNE_BOOL |
成功或者失败 |
【所在头文件】
ts_rne_c_api.h
备注
调用此函数之前,必需要先调用TS_MPI_TRP_RNE_OpenDevice。此接口不适用于TX510x系列。
6.2.2. 时间接口
6.2.2.1. TS_MPI_TRP_RNE_NetBindTimeState
【描述】
用于网络绑定时间结构状态信息。
【定义】
TS_S32 TS_MPI_TRP_RNE_NetBindTimeState(RNE_NET_S *net, RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
timeState |
RNE_TIME_STATES_S数据 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
【举例】
参考samples。
6.2.2.2. TS_MPI_TRP_RNE_StartSysTimer
【描述】
用于启动系统计时器。
【定义】
TS_S32 TS_MPI_TRP_RNE_StartSysTimer(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_time.h
【举例】
参考samples。
TS_MPI_TRP_RNE_InitTimeState
【描述】
用于初始化时间状态。
【定义】
TS_S32 TS_MPI_TRP_RNE_InitTimeState(const TS_S32 gpNum, RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
gpNum |
通用算子层总数,指定了要初始化的时间状态中 通用算子层的个数。 |
输入 |
timeState |
指向 RNE_TIME_STATES_S 结构体的指针,用于存储初始化后的时间 状态信息。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_time.h
备注
初始化时间状态前必须已经启动系统计时器。
【举例】
参考samples。
6.2.2.3. TS_MPI_TRP_RNE_ReleaseTimeState
【描述】
用于释放时间状态。
【定义】
TS_S32 TS_MPI_TRP_RNE_ReleaseTimeState(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
RNE_TIME_STATES_S数据 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_time.h
【举例】
参考samples。
6.2.2.4. TS_MPI_TRP_RNE_ResetTimeState
【描述】
用于重置时间状态。
【定义】
TS_S32 TS_MPI_TRP_RNE_ResetTimeState(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
指向 RNE_TIME_STATES_S 结构 体的指针,用于存储初始化后的时间状态信息。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_time.h
备注
重置时间状态前必须已经启动系统计时器,并且初始化时间状态。
【举例】
参考samples。
6.2.2.5. TS_MPI_TRP_RNE_GetSysTimeUs
【描述】
获取当前系统时间(微秒)。
【定义】
TS_U32 TS_MPI_TRP_RNE_GetSysTimeUs(TS_VOID);
【返回值】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
TS_U32 |
us时间计数 |
输入 |
【所在头文件】
ts_rne_time.h
备注
获取系统时间前必须已经启动系统计时器,并且初始化时间状态。
6.2.2.6. TS_MPI_TRP_RNE_GetSysTimeMs
【描述】
获取当前系统时间(毫秒)。
【定义】
TS_U32 TS_MPI_TRP_RNE_GetSysTimeMs(TS_VOID);
【返回值】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
TS_U32 |
ms时间计数 |
输入 |
【所在头文件】
ts_rne_time.h
备注
获取系统时间前必须已经启动系统计时器,并且初始化时间状态。
6.2.2.7. TS_MPI_TRP_RNE_GetTotalTime
【描述】
获取当前网络所有高效算子层和通用算子层的总耗时(微秒)。
【定义】
TS_U64 TS_MPI_TRP_RNE_GetTotalTime(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
指向 RNE_TIME_STATES_S 结构 体的指针,用于存储初始化后的时间状态信息。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_U64 |
总耗时 |
0 |
失败 |
【所在头文件】
ts_rne_time.h
备注
获取耗时前必须已经启动系统计时器,并且初始化时间状态。
【举例】
参考samples。
6.2.2.8. TS_MPI_TRP_RNE_GetTimeOfForward
【描述】
获取当前网络网络前向推理的总耗时(微秒)。
【定义】
TS_U64 TS_MPI_TRP_RNE_GetTimeOfForward(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
RNE_TIME_STATES_S数据 |
输入 |
【返回值】
返回值 |
描述 |
返回值 |
|---|---|---|
TS_U64 |
当前网络总耗时 |
TS_U32 |
0 |
失败 |
【所在头文件】
ts_rne_time.h
备注
获取耗时前必须已经启动系统计时器,并且初始化时间状态。
【举例】
参考samples。
6.2.2.9. TS_MPI_TRP_RNE_GetTimeAtGpLayer
【描述】
获取当前网络在指定通用算子层耗时(微秒)。
【定义】
TS_U64 TS_MPI_TRP_RNE_GetTimeAtGpLayer(RNE_TIME_STATES_S *timeState, TS_S32 layerType);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
RNE_TIME_STATES_S数据 |
输入 |
layerType |
通用算子层layer type id |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_U64 |
网络在指定通用算子层耗时 |
0 |
失败或者指定层是软件层 |
【所在头文件】
ts_rne_time.h
备注
获取耗时前必须已经启动系统计时器,并且初始化时间状态。
6.2.2.10. TS_MPI_TRP_RNE_GetTimeOfGpLayer
【描述】
获取当前网络在通用算子层耗时(微秒)。
【定义】
TS_U64 TS_MPI_TRP_RNE_GetTimeOfGpLayer(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
RNE_TIME_STATES_S数据 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_U64 |
通用算子层耗时 |
0 |
失败或者指定层是软件层 |
【所在头文件】
ts_rne_time.h
备注
获取耗时前必须已经启动系统计时器,并且初始化时间状态。
【举例】
参考samples。
6.2.2.11. TS_MPI_TRP_RNE_GetTimeOfHwLayer
【描述】
获取当前网络在高效算子层耗时(微秒)。
【定义】
TS_U64 TS_MPI_TRP_RNE_GetTimeOfHwLayer(RNE_TIME_STATES_S *timeState);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
timeState |
RNE_TIME_STATES_S数据 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_U64 |
高效算子层耗时 |
【所在头文件】
ts_rne_time.h
备注
获取耗时前必须已经启动系统计时器,并且初始化时间状态。
6.2.3. 日志接口
6.2.3.1. TS_MPI_TRP_RNE_SetLogLevel
【描述】
用于设置日志级别。
【定义】
TS_VOID TS_MPI_TRP_RNE_SetLogLevel(RNE_LOG_E logLevel);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
logLevel |
日志级别 |
输入 |
【所在头文件】
ts_rne_c_api.h
【举例】
参考samples。
6.2.3.2. TS_MPI_TRP_RNE_GetLogLevel
【描述】
用于获取当前日志级别。
【定义】
RNE_LOG_E TS_MPI_TRP_RNE_GetLogLevel(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
RNE_LOG_E |
log等级 |
【所在头文件】
ts_rne_c_api.h
6.2.3.3. TS_MPI_TRP_RNE_Debug
【描述】
Debug级别日志打印。
【定义】
TS_MPI_TRP_RNE_Debug(...)
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
... |
不定参数 |
输入 |
【所在头文件】
ts_rne_c_api.h
【举例】
TS_MPI_TRP_RNE_Debug("DEBUG\\n");
6.2.3.4. TS_MPI_TRP_RNE_Info
【描述】
Info级别日志打印。
【定义】
TS_MPI_TRP_RNE_Info(...)
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
... |
不定参数 |
输入 |
【所在头文件】
ts_rne_c_api.h
【举例】
TS_MPI_TRP_RNE_Info("INFO\\n");
6.2.3.5. TS_MPI_TRP_RNE_Warn
【描述】
Warn级别日志打印。
【定义】
TS_MPI_TRP_RNE_Warn(...)
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
... |
不定参数 |
输入 |
【所在头文件】
ts_rne_c_api.h
【举例】
TS_MPI_TRP_RNE_Warn("WARN\\n");
6.2.3.6. TS_MPI_TRP_RNE_Error
【描述】
Error级别打印宏定义。
【定义】
TS_MPI_TRP_RNE_Error(...)
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
... |
不定参数 |
输入 |
【所在头文件】
ts_rne_c_api.h
【举例】
TS_MPI_TRP_RNE_Error("ERROR\\n");
6.2.4. 版本接口
6.2.4.1. TS_MPI_TRP_RNE_GetSdkVersion
【描述】
获取当前SDK版本信息。
【定义】
const TS_CHAR *TS_MPI_TRP_RNE_GetSdkVersion(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
constTS_CHAR |
版本信息字符串指针 |
【所在头文件】
ts_rne_sdk_version.h
6.2.5. VPE接口
6.2.5.1. TS_MPI_TRP_RNE_VpeCreate
【描述】
创建图像格式转化所需要的指令集合。
【定义】
TS_RNE_VPE_HD * TS_MPI_TRP_RNE_VpeCreate(TS_S32 h, TS_S32 w, TS_S32, n_mode, RNE_IMG_CONVERT_MODE_E *mode);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
h |
图像高度 |
输入 |
w |
图像宽度 |
输入 |
n_mode |
转化次数 |
输入 |
mode |
转化格式的数组指针 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
NULL |
失败 |
非NULL |
成功初始化指令集合,返回指令集合的指针 |
【所在头文件】
ts_rne_vpe.h
【举例】
参考samples。
6.2.5.2. TS_MPI_TRP_RNE_VpeConvert
【描述】
对图像进行格式转化。
【定义】
TS_S32 TS_MPI_TRP_RNE_VpeConvert(TS_RNE_VPE_HD, vpe_hd, TS_VOID, dst, TS_VOID, src);
【参数】
参数名称 |
描述 |
输入输出 |
|---|---|---|
vpe_hd |
指令集合指针 |
输入 |
dst |
转化后的图像数据 |
输入 |
src |
转化前的图像数据 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_vpe.h
备注
需要先调用TS_MPI_TRP_RNE_VpeCreate生成指令集合。
【举例】
参考samples。
6.2.5.3. TS_MPI_TRP_RNE_VpeRelease
【描述】
释放指令集所占用的空间。
【定义】
TS_S32 TS_MPI_TRP_RNE_VpeRelease(TS_RNE_VPE_HD *vpe_hd);
【参数】
参数名称 |
描述 |
输入输出 |
|---|---|---|
vpe_hd |
指令集合指针 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_vpe.h
【举例】
参考samples。
备注
VPE相关函数只支持产品TX5336x_TX5256x_TX5256x系列。
6.2.6. 输入输出接口
TS_MPI_TRP_RNE_FillInputBlob
【描述】
填充网络输入blob。
【定义】
TS_S32 TS_MPI_TRP_RNE_FillInputBlob(RNE_NET_S *net, TS_S32 coreIdx, TS_VOID *input, TS_S32 blobIdx);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
coreIdx |
多核index,默认为0 |
输入 |
input |
输入input数据(数据未做cStride对齐) |
输入 |
blobIdx |
多blob index。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_nn_input.h
【举例】
参考samples。
6.2.6.1. TS_MPI_TRP_RNE_FillInputBlobs
【描述】
填充网络输入blobs。
【定义】
TS_S32 TS_MPI_TRP_RNE_FillInputBlobs(RNE_NET_S *net, TS_S32 coreIdx, TS_VOID *input);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
coreIdx |
多核index,默认为0 |
输入 |
input |
输入input数据(数据未做cStride对齐) |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_nn_input.h
【举例】
参考samples。
6.2.6.2. TS_MPI_TRP_RNE_DumpOutputBlob
【描述】
导出网络输出blob。
【定义】
TS_VOID *TS_MPI_TRP_RNE_DumpOutputBlobs(RNE_NET_S *net, TS_VOID *output);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
output |
输出 output地址(用户自行控制此空间的申请释放) |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_VOID |
输出output |
【所在头文件】
ts_rne_nn_output.h
备注
默认输出blobs格式为NHWC,当输出内存中格式需要NCHW格式时,此函数与RNE_NET_S结构体中的成员变量eOutputType一起使用,其中eOutputType赋值RNE_NET_OUTPUT_TYPE_FORMAT_NHWC_TO_NCHW。
【举例】
参考samples。
6.2.6.3. TS_MPI_TRP_RNE_DumpOutputBlobs
【描述】
导出网络输出blobs。
【定义】
TS_VOID *TS_MPI_TRP_RNE_DumpOutputBlobs(RNE_NET_S *net, TS_VOID *output,
TS_S32 blobIdx);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
output |
输出 output地址(用户自行控制此空间的申请释放) |
输入 |
blobIdx |
多blob index。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_VOID |
输出output |
【所在头文件】
ts_rne_nn_output.h
备注
默认输出blobs格式为NHWC,当输出内存中格式需要NCHW格式时,此函数与RNE_NET_S结构体中的成员变量eOutputType一起使用,其中eOutputType赋值RNE_NET_OUTPUT_TYPE_FORMAT_NHWC_TO_NCHW。
【举例】
参考samples。
6.2.6.4. TS_MPI_TRP_RNE_FormatConversion
【描述】
将源数据的RNE_BLOB_N_Cn_N_H_W_Cx格式转换为目标数据的RNE_BLOB_N_H_W_Cstride格式。
【定义】
TS_S32 *TS_MPI_TRP_RNE_FormatConversion(RNE_BLOBS_S *srcBlobs,
RNE_BLOBS_S *dstBlobs);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
srcBlobs |
指向 RNE_NET_S 结构体的指针,表示源数据的 Blob 数组。 |
输入 |
dstBlobs |
指向 RNE_NET_S 结构体的指针,表示目标数据的 Blob 数组。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_nn_output.h
【举例】
参考samples。
6.2.7. 高级内存接口
6.2.7.1. TS_MPI_TRP_RNE_SetCommonBlobsMemoryCache
【描述】
配置打开或关闭blobmemory 带cache属性的接口,1为打开,0为关闭。用户不调用该接口和调用该接口status设置为off时,效果一致,均为关闭cache功能,与Knight1.3版本不安装hwacc.ko时等价;用户调用该接口status设置为on时,开启cache功能,与Knight1.3版本安装hwacc.ko等价。
【定义】
TS_RNE_BOOL TS_MPI_TRP_RNE_SetCommonBlobsMemoryCache(RNE_CACHE_STATUS_S status);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
status |
1为打开cache,0为关闭 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
true |
缓存打开或关闭成功 |
false |
缓存打开或关闭失败 |
【所在头文件】
ts_rne_device.h
备注
此接口必须在TS_MPI_TRP_RNE_OpenDevice和TS_MPI_TRP_RNE_LoadModel之间调用;
6.2.7.2. TS_MPI_TRP_RNE_GetCommonBlobsMemoryCacheStatus
【描述】
获取带cache打开或关闭状态的接口,1为打开,0为关闭。
【定义】
TS_RNE_BOOL TS_MPI_TRP_RNE_GetCommonBlobsMemoryCacheStatus();
【返回值】
返回值 |
描述 |
|---|---|
true |
缓存打开或关闭成功 |
false |
缓存打开或关闭失败 |
【所在头文件】
ts_rne_device.h
6.2.7.3. TS_MPI_TRP_RNE_AllocLinearMemCached
【描述】
分配连续的物理内存空间,并且支持缓存控制,返回物理内存的虚拟地址。
【定义】
TS_VOID * TS_MPI_TRP_RNE_AllocLinearMemCached(TS_SIZE_T len, TS_U32
isNoCached);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
len |
要分配的内存空间的大小,单位为字节。 |
输入 |
isNoCached |
是否禁用缓存,如果为非 零值,则禁用缓存;如果为零值,则启用缓存。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
NULL |
内存分配失败。 |
非NULL |
指向分配的 连续物理内存空间的起始地址,此地址为虚拟地址。 |
【所在头文件】
ts_rne_device.h
【举例】
1. TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
2. TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0); TS_MPI_TRP_RNE_FreeLinearMemCached
【描述】
用于释放通过 TS_MPI_TRP_RNE_AllocLinearMemCached 函数分配的连续物理内存空间。
【定义】
TS_VOID TS_MPI_TRP_RNE_FreeLinearMemCached(TS_VOID *ptr);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
ptr |
需要被释放的通过TS_MPI_TRP_RNE_ AllocLinearMemCached申请的内存空间的指针。 |
输入 |
【所在头文件】
ts_rne_device.h
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_MPI_TRP_RNE_FreeLinearMemCached(addr);
TS_MPI_TRP_RNE_CleanLinearMemCached
【描述】
用于将cpu cache清除。
【定义】
TS_VOID TS_MPI_TRP_RNE_CleanLinearMemCached(TS_VOID *ptr, TS_SIZE_T len);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
ptr |
要清除的地址 |
输入 |
len |
需要清除的内存大小,单位为字节 |
输入 |
【所在头文件】
ts_rne_device.h
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_MPI_TRP_RNE_CleanLinearMemCached(addr, bufSize);
TS_MPI_TRP_RNE_FreeLinearMemCached(addr);
6.2.7.4. TS_MPI_TRP_RNE_InvalidateLinearMemCached
【描述】
用于将cpu cache的缓存置为无效。
【定义】
TS_VOID TS_MPI_TRP_RNE_InvalidateLinearMemCached(TS_VOID *ptr, TS_SIZE_T len);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
ptr |
指向需要被置为无效的内存 |
输入 |
len |
需要置为无效的内存大小,单位为字节 |
输入 |
【所在头文件】
ts_rne_device.h
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_MPI_TRP_RNE_CleanLinearMemCached(addr, bufSize);
TS_MPI_TRP_RNE_InvalidateLinearMemCached(addr, bufSize);
TS_MPI_TRP_RNE_FreeLinearMemCached(addr);
6.2.7.5. TS_MPI_TRP_RNE_VirtualToPhysicalAddress
【描述】
用于将TS_MPI_TRP_RNE_AllocLinearMemCached 函数分配的空间的虚拟地址转换为物理地址。
【定义】
TS_SIZE_T TS_MPI_TRP_RNE_VirtualToPhysicalAddress(TS_SIZE_T addrVir);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
addrVir |
要进行地址转换的虚拟地址。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
TS_SIZE_T |
转换后的物理地址。 |
【所在头文件】
ts_rne_device.h
备注
此函数只支持TS_MPI_TRP_RNE_AllocLinearMemCached申请的空间地址转换。
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_SIZE_T phyAddr = TS_MPI_TRP_RNE_VirtualToPhysicalAddress(addr);
TS_MPI_TRP_RNE_FreeLinearMemCached(addr);
6.2.7.6. TS_MPI_TRP_RNE_PhysicalToVirtualAddress
【描述】
用于将TS_MPI_TRP_RNE_AllocLinearMemCached 函数分配的空间的物理地址转换为虚拟地址。
【定义】
TS_SIZE_T TS_MPI_TRP_RNE_PhysicalToVirtualAddress(TS_SIZE_T addrPhy);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
addrPhy |
要进行地址转换的物理地址。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
0 ~ MAX |
转换后 的虚拟地址。MAX为TS_SIZE_T类型能表示的最大值。 |
【所在头文件】
ts_rne_device.h
备注
此函数只支持TS_MPI_TRP_RNE_AllocLinearMemCached申请的空间地址转换。
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_SIZE_T phyAddr = TS_MPI_TRP_RNE_VirtualToPhysicalAddress(addr);
TS_SIZE_T virAddr = TS_MPI_TRP_RNE_PhysicalToVirtualAddress(phyAddr);
TS_MPI_TRP_RNE_FreeLinearMemCached(addr);
6.2.7.7. TS_MPI_TRP_RNE_SetInputBlobsAddr
【描述】
赋值输入blobs地址。
【定义】
TS_S32 TS_MPI_TRP_RNE_SetInputBlobsAddr(RNE_NET_S *net, TS_VOID *virAddr, TS_VOID * phyAddr);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向 R NE_NET_S结构体的指针,表示神经网络的指针。 |
输入 |
virAddr |
第一个输入 Blob 地址的虚拟地址。 |
输入 |
phyAddr |
第一个输入 Blob 地址的物理地址。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
备注
当多输入的情况下,多个输入需要合并到一块连续输入空间,且每个输入的起始地址,需要4字节对齐。
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_SIZE_T phyAddr = TS_MPI_TRP_RNE_VirtualToPhysicalAddress(addr);
TS_SIZE_T virAddr = TS_MPI_TRP_RNE_PhysicalToVirtualAddress(phyAddr);
TS_MPI_TRP_RNE_SetInputBlobsAddr(net[i], (TS_VOID *)virAddr, (TS_VOID *)phyAddr);
6.2.7.8. TS_MPI_TRP_RNE_SetResultBlobsAddr
【描述】
赋值输出blobs地址。
【定义】
TS_S32 TS_MPI_TRP_RNE_SetResultBlobsAddr(RNE_NET_S *net, TS_VOID
*virAddr, TS_VOID * phyAddr);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向 RNE_NET_S 结构体的指针,表示神经网络的指针。 |
输入 |
virAddr |
第一个输出 Blob 地址的虚拟地址。 |
输入 |
phyAddr |
第一个输出 Blob 地址的物理地址。 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
【举例】
TS_S32 bufSize = TS_MPI_TRP_RNE_GetBlobsBufSize(net);
TS_VOID *addr = TS_MPI_TRP_RNE_AllocLinearMemCached(bufSize, 0);
TS_SIZE_T phyAddr = TS_MPI_TRP_RNE_VirtualToPhysicalAddress(addr);
TS_SIZE_T virAddr = TS_MPI_TRP_RNE_PhysicalToVirtualAddress(phyAddr);
TS_MPI_TRP_RNE_SetResultBlobsAddr(net[i], (TS_VOID *)virAddr, (TS_VOID *)phyAddr);
6.2.7.9. TS_MPI_TRP_RNE_SetWeightAddr
【描述】
赋值输入权重数据。
【定义】
TS_S32 TS_MPI_TRP_RNE_SetWeightAddr(RNE_NET_S *net, TS_VOID *addr, TS_RNE_BOOL isPhyAddr);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
网络指针 |
输入 |
addr |
权重数据地址 |
输入 |
isPhyAddr |
addr地址是否为物理地址 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
【举例】
6.2.8. 通用算子接口
6.2.8.1. TS_MPI_TRP_RNE_GetGpLayers
【描述】
获取通用算子层列表。
【定义】
RNE_GP_LAYER_S *TS_MPI_TRP_RNE_GetGpLayers(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
网络指针 |
输入 |
【返回值】
【所在头文件】
ts_rne_device.h
备注
需在网络初始化后调用。
【举例】
RNE_GP_LAYER_S *layersInfo = TS_MPI_TRP_RNE_GetGpLayers(net);
if (NULL == layersInfo) {
TS_MPI_TRP_RNE_Info("layersInfo is NULL\\n");
return ;
}
6.2.8.2. TS_MPI_TRP_RNE_RegisterGpUserData
【描述】
注册通用算子层自定义数据。
【定义】
TS_S32 TS_MPI_TRP_RNE_RegisterGpUserData(RNE_NET_S *net, TS_S32 layerId, TS_VOID *userData);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
网络指针 |
输入 |
layerId |
层唯一标识 |
输入 |
userData |
自定义数据指针 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
备注
此函数需要在网络初始化前调用。
【举例】
for (TS_S32 i = 0; i < layersInfo->u32LayersNum; ++i) {
TS_MPI_TRP_RNE_Info("layer id: %d layer name: %s layerType:%d typeName:%s\\n",
layersInfo->stpLayerInfo[i].s32LayerId,
layersInfo->stpLayerInfo[i].cpLayerName,
layersInfo->stpLayerInfo[i].s32LayerType,
layersInfo->stpLayerInfo[i].cpTypeName);
if (RNE_LAYER_TYPE_TEST_GP == layersInfo->stpLayerInfo[i].s32LayerType) {
TS_MPI_TRP_RNE_RegisterGpUserData(net, layersInfo->stpLayerInfo[i].s32LayerId, (**char** \*)TS_MPI_TRP_RNE_GetResVersion(net));
}
}
6.2.8.3. TS_MPI_TRP_RNE_InitGpLayerNum
【描述】
初始化通用算子层。
【定义】
TS_S32 TS_MPI_TRP_RNE_InitGpLayerNum(TS_S32 num);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
num |
通用算子层总数 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_device.h
【举例】
TS_S32 ret = TS_MPI_TRP_RNE_InitGpLayerNum(RNE_LAYER_TYPE_MAX_LAYER_TYPE - RNE_LAYER_TYPE_START_LAYER);
6.2.8.4. TS_MPI_TRP_RNE_RegisterAllGpLayers
【描述】
注册所有通用算子层处理函数的指针。
【定义】
typedef TS_S32 (\*TS_MPI_TRP_RNE_RegisterAllGpLayers)(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_device.h
6.2.8.5. TS_MPI_TRP_RNE_GpLayerHandler
【描述】
通用算子层处理函数的指针。
【定义】
typedef TS_VOID (\*TS_MPI_TRP_RNE_GpLayerHandler)(RNE_BLOBS_S *input, RNE_BLOBS_S *output, RNE_BIN_DATA_S *extraData,TS_VOID *userData);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
input |
通用算子层输入blobs指针 |
输入 |
output |
通用算子层输出blobs指针 |
输入 |
extraData |
编译器 编译网络后传给通用算子层的数据 |
输入 |
userData |
TS_MPI_TRP_RNE_RegisterGpUse rData函数调用时注册的数据 |
输入 |
【所在头文件】
ts_rne_device.h
【举例】
typedef struct tsRNE_GP_LAYERS_HD_S {
TS_MPI_TRP_RNE_GpLayerHandler *fnpGpLayerHd;
TS_S32 s32GpLayerTypeNum;
TS_S32 s32UserLayerTypeNum;
} RNE_GP_LAYERS_HD_S;
6.2.8.6. TS_MPI_TRP_RNE_GetGpLayersHd
【描述】
获取所有通用算子层对应的处理函数。
【定义】
TS_MPI_TRP_RNE_gpLayersHd *TS_MPI_TRP_RNE_GetGpLayersHd(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
RNE_GP_ LAYERS_HD_S* |
所有通用算子层处理函数所在结构体的数组 |
【所在头文件】
ts_rne_device.h
【举例】
static TS_VOID TS_MPI_TRP_RNE_PrintGpLayersList() {
RNE_GP_LAYERS_HD_S *layerHd = TS_MPI_TRP_RNE_GetGpLayersHd();
TS_MPI_TRP_RNE_Info("gpLayerTypeNum: %d\\n", layerHd->s32GpLayerTypeNum);
TS_MPI_TRP_RNE_Info("userLayerTypeNum: %d\\n", layerHd->s32UserLayerTypeNum);
for (TS_S32 i = 0; i < layerHd->s32UserLayerTypeNum; ++i) {
TS_MPI_TRP_RNE_Info("user gp layer func: %p\\n", layerHd->fnpGpLayerHd[i]);
}
}
6.2.8.7. TS_MPI_TRP_RNE_RegisterGpLayer
【描述】
注册前向推理的单个通用算子层。
【定义】
TS_S32 TS_MPI_TRP_RNE_RegisterGpLayer(TS_S32 layerType, TS_MPI_TRP_RNE_GpLayerHandler gpLayerCallback);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
layerType |
通用算子层类型 |
输入 |
gp LayerCallback |
通用算子层回调函数,详见定义2.8.5 `TS_MPI_TRP_RNE_GpLayerHandler
|
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_device.h
【举例】
ret \|= TS_MPI_TRP_RNE_RegisterGpLayer(RNE_LAYER_TYPE_CUSTOM_OPERATOR_LAYER, TS_MPI_TRP_RNE_GpLayerCustormOperator);
6.2.9. 异步相关接口
6.2.9.1. TS_MPI_TRP_RNE_AsyncExecutorBind
【描述】
用于将异步执行器绑定到指定的网络,并设置优先级。
【定义】
TS_S32 TS_MPI_TRP_RNE_AsyncExecutorBind(RNE_ASYNC_EXECUTOR *asyncEtr,
RNE_NET_S *net, TS_S32 priority);
【参数】
参数名称 |
描述 |
|---|---|
asyncEtr |
异步执行器指针 |
net |
指向RNE_N ET_S结构体的指针,用于传递模型的相关信息和配置 |
priority |
设置优先级 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
【举例】
RNE_ASYNC_EXECUTOR exe;
int ret = TS_MPI_TRP_RNE_AsyncExecutorBind(&exe, net, priority);
TS_MPI_TRP_RNE_AsyncExecutorUnbind
【描述】
解除指定异步执行器与其绑定的网络之间的绑定关系。
【定义】
TS_S32 TS_MPI_TRP_RNE_AsyncExecutorUnbind(RNE_ASYNC_EXECUTOR *asyncEtr);
【参数】
参数名称 |
描述 |
|---|---|
asyncEtr |
异步执行器指针 |
【返回值】
返回值 |
描述 |
|---|---|
非0 |
失败 |
0 |
成功 |
【所在头文件】
ts_rne_c_api.h
【举例】
RNE_ASYNC_EXECUTOR exe;
TS_S32 ret = TS_MPI_TRP_RNE_AsyncExecutorUnBind(&exe, net,
priority);
6.2.9.2. TS_MPI_TRP_RNE_ForwardAsync
【描述】
用于执行RNE模型的前向异步推理操作。
该函数会根据传入的模型信息和配置进行模型的前向异步推理操作,并返回前向异步推理结果。推理结果以RNE_BLOBS_S结构体的形式返回,包含了模型输出的各个节点的数据。
【定义】
RNE_BLOBS_S *TS_MPI_TRP_RNE_ForwardAsync(RNE_ASYNC_EXECUTOR
*asyncEtr);;
【参数】
参数名称 |
描述 |
|---|---|
asyncEtr |
异步执行器指针 |
【返回值】
返回值 |
描述 |
|---|---|
RNE_B LOBS_S* |
若返回为NU LL,则前向推理出现异常;当state的状态为done时,返回网络的 最后结果,等同于函数TS_MPI_TRP_RNE_GetResultBlobs的返回值 |
【所在头文件】
ts_rne_c_api.h
【举例】
RNE_ASYNC_EXECUTOR exe[num];
RNE_BLOBS_S *rst= TS_MPI_TRP_RNE_ForwardAsync(&exe[i]);
if (NULL == rst) {
TS_MPI_TRP_RNE_Error("net forward error!\\n");
goto releaseResult;
}
6.2.10. 多核相关接口
6.2.10.1. TS_MPI_TRP_RNE_GetCoreNum
【描述】
用于获取 NPU 设备的核心数。
【定义】
TS_S32 TS_MPI_TRP_RNE_GetCoreNum(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
1 ~ MAX |
有可用的核, MAX为TS_S32的最大值 |
小于等于0 |
无可用的核 |
【所在头文件】
ts_rne_device.h
【举例】
TS_S32 coreNum = TS_MPI_TRP_RNE_GetCoreNum();
6.2.10.2. TS_MPI_TRP_RNE_GetDeviceBufferSize
【描述】
用于获取所有网络在设备上的缓冲区大小。
【定义】
TS_SIZE_T TS_MPI_TRP_RNE_GetDeviceBufferSize(TS_VOID);
【返回值】
返回值 |
描述 |
|---|---|
1 ~ MAX |
所有网络在设备上的缓冲区大小,MAX为TS_SIZE_T的最大值。 |
0 |
获取设备的缓冲区大小失败。 |
【所在头文件】
ts_rne_c_api.h
备注
如果RNE_NET_S结构体成员vpSelfBuf赋值非NULL时,不使用此设备缓冲区。
【举例】
TS_SIZE_T size = TS_MPI_TRP_RNE_GetDeviceBufferSize();
6.2.10.3. TS_MPI_TRP_RNE_GetAvailableCore
【描述】
获取当前可用的核
【定义】
TS_MPI_TRP_RNE_GetAvailableCore(RNE_NET_S *net);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
0~ MAX-1 |
有可用的核, MAX为实际设备上的最大核数。 |
-1 |
无可用的核 |
【所在头文件】
ts_rne_c_api.h
备注
使用多进程时,要求板子上所有进程均调用此接口或者TS_MPI_TRP_RNE_GetExpectedCore接口。 当进程异常退出,无法正常使用时,需手动清理以下文件:”/tmp/ts_mpu_ipc”。 在未调用此函数时默认使用核心0,而在调用后则按顺序使用核心 MAX-1、MAX-2。 调用此函数获取的核心一直被占用,仅当TS_MPI_TRP_RNE_Forward推理后才会被释放,且此接口必须与TS_MPI_TRP_RNE_Forward接口在同一线程内。
【举例】
TS_MPI_TRP_RNE_GetAvailableCore(&nn_test);
6.2.10.4. TS_MPI_TRP_RNE_GetExpectedCore
【描述】
获取期望的核
【定义】
TS_MPI_TRP_RNE_GetExpectedCore(RNE_NET_S *net, TS_SIZE_T coreIdx);
【参数】
参数名称 |
描述 |
输入/输出 |
|---|---|---|
net |
指向RNE_NET_S 结构体的指针,用于传递模型的相关信息和配置 |
输入 |
coreIdx |
期望的核 |
输入 |
【返回值】
返回值 |
描述 |
|---|---|
0~ MAX-1 |
有可用的核, MAX为实际设备上的最大核数。 |
-1 |
无可用的核 |
【所在头文件】
ts_rne_c_api.h
备注
使用多进程时,要求板子上所有进程均调用此接口或者TS_MPI_TRP_RNE_GetAvailableCore接口。 当进程异常退出,无法正常使用时,需手动清理以下文件:”/tmp/ts_mpu_ipc”。 在未调用此函数时默认使用核心0,而在调用后则按顺序使用核心 MAX-1、MAX-2
调用此函数获取的核心一直被占用,仅当TS_MPI_TRP_RNE_Forward推理后才会被释放,且此接口必须与 TS_MPI_TRP_RNE_Forward接口在同一线程内。
【举例】
TS_MPI_TRP_RNE_GetExpectedCore(&nn_test, 0);
6.3. 数据结构
【说明】
输入数据的排列及类型的枚举。
【定义】
typedef enum tsRNE_NET_INPUT_TYPE_E {
RNE_NET_INPUT_TYPE_FLOAT_HWC=0,
RNE_NET_INPUT_TYPE_FLOAT_CHW=1,
RNE_NET_INPUT_TYPE_INT_HWC=2,
RNE_NET_INPUT_TYPE_INT_CHW=3,
RNE_NET_INPUT_TYPE_FORMAT_RGB0=4,
RNE_NET_INPUT_TYPE_FORMAT_BGR0=5,
RNE_NET_INPUT_TYPE_HWC_GREY=6,
RNE_NET_INPUT_TYPE_INT_HWCSTRIDE=7,
} RNE_NET_INPUT_TYPE_E;
【成员】
成员名称 |
描述 |
|---|---|
RNE_ NET_INPUT_TYPE_FLOAT_HWC |
输入是数据32bit浮点型,形状:[n:h:w:c] |
RNE_ NET_INPUT_TYPE_FLOAT_CHW |
输入是数据32bit浮点型,形状:[n:c:h:w] |
RN E_NET_INPUT_TYPE_INT_HWC |
输入是数据任意bit整形,形状:[n:h:w:c] |
RN E_NET_INPUT_TYPE_INT_CHW |
输入是数据任意bit整形,形状:[n:c:h:w] |
RNE_NE T_INPUT_TYPE_FORMAT_BGR0 |
输入是数据是 BGRA格式,形状:[n:h:w:4] |
RNE_NE T_INPUT_TYPE_FORMAT_RGB0 |
输入是数据是 RGBA格式,形状:[n:h:w:4] |
RNE _NET_INPUT_TYPE_HWC_GREY |
输入是数据是 GREY格式,形状:[n:h:w:1] |
RNE_NET_ INPUT_TYPE_INT_HWCSTRIDE |
输入 是数据任意bit整形,形状:[n:h:w:c_stride] |
【相关数据类型及接口】
RNE_NET_S;
【说明】
输出数据的排列类型的枚举。
【定义】
1. typedef enum tsRNE_NET_OUTPUT_TYPE_E {
2. RNE_NET_OUTPUT_TYPE_FORMAT_NONE,
3. RNE_NET_OUTPUT_TYPE_FORMAT_NHWC_TO_NCHW
4. } RNE_NET_OUTPUT_TYPE_E;
【成员】
成员名称 |
描述 |
|---|---|
RNE_NET_OUTPUT_TYPE_FORMAT_NONE |
输出blobs内存保持NHWC排列格式 |
RNE_NET _OUTPUT_TYPE_FORMAT_NHWC_TO_NCHW |
输出blobs内存转换成NCHW排列格式 |
【相关数据类型及接口】
RNE_NET_S;
【说明】
RNE_NET_S结构体。
【定义】
1. typedef struct tsRNE_NET_S {
2. RNE_NET_INPUT_TYPE_E eInputType;
3. RNE_NET_OUTPUT_TYPE_E eOutputType;
4. TS_U8 *u8pParams;
5. TS_U8 *u8pWeight;
6. TS_S32 s32GraphLen;
7. TS_U8 *u8pGraph;
8. TS_CHAR *cpDebugLayerName;
9. TS_VOID *vpGpUserData;
10. TS_VOID *vpInnerNd;
11. TS_VOID *vpSelfBuf;
12. TS_S32 s32NTask;
13. TS_S32 s32HoldCore;
14. } RNE_NET_S;
【成员】
成员名称 |
描述 |
|---|---|
eInputType |
输入数据的类型,参考RNE_NET_INPUT_TYPE_E |
eOutputType |
输出数据的类型,参考RNE_NET_OUTPUT_TYPE_E |
u8pParams |
网络参数指针,包括量化参数 |
u8pWeight |
网络参数指针,包括权重参数 |
s32GraphLen |
net config数据大小 |
u8pGraph |
net config数据指针 |
cp DebugLayerName |
调试层名字,调式中间层用,只有编译出来 的debug版本的网络可以用。若不需要此参数可以置为NULL |
vpGpUserData |
通用算子层用户数据列表,只需初始化为NULL即可 |
vpInnerNd |
内部网络描述,只需初始化为NULL即可 |
vpSelfBuf |
自定义缓存,若为NULL则使用内部共享缓存;否则使用 用户在调用网络init前自己分配的缓存,可以通过接口TS_ MPI_TRP_RNE_GetInputBlobs获取每个网络的数据缓存大小 |
s32NTask |
多核npu(将可拆分的并行指令部署到多核npu) |
s32HoldCore |
占用npu(0表示未占用,1表示占用npu进行推理) |
【相关数据类型及接口】
RNE_GP_LAYER_S *TS_MPI_TRP_RNE_GetGpLayers(RNE_NET_S *net);
TS_S32 TS_MPI_TRP_RNE_LoadModel(RNE_NET_S *net);
TS_VOID TS_MPI_TRP_RNE_UnloadModel(RNE_NET_S *net);
TS_S32 TS_MPI_TRP_RNE_OnceLoad(RNE_NET_S *net);
RNE_BLOBS_S *TS_MPI_TRP_RNE_Forward(RNE_NET_S *net);
TS_U32 TS_MPI_TRP_RNE_GetInputBlobs(RNE_NET_S *net);
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetResultBlobs(RNE_NET_S *net);
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetInputBlobs(RNE_NET_S *net);
RNE_BLOBS_S *TS_MPI_TRP_RNE_GetHideBlobs(RNE_NET_S *net);
TS_S32 TS_MPI_TRP_RNE_RegisterGpUserData(RNE_NET_S *net, TS_S32 layerId, TS_VOID *userData);
const TS_CHAR *TS_MPI_TRP_RNE_GetResVersion(RNE_NET_S *net);
TS_S64 TS_MPI_TRP_RNE_GetWeightSize(RNE_NET_S *net);
TS_S64 TS_MPI_TRP_RNE_GetCfgSize(RNE_NET_S *net);
TS_S32 TS_MPI_TRP_RNE_FillInputBlobs(RNE_NET_S *net, TS_S32 coreIdx, TS_U8 *input);
【说明】
RNE_BLOB_FORMA_E枚举
【定义】
typedef enum tsRNE_BLOB_FORMAT_E {
RNE_BLOB_N_H_W_Cstride,
RNE_BLOB_N_Cn_N_H_W_Cx,
RNE_BLOB_N_H_W_C,
} RNE_BLOB_FORMAT_E;
【成员】
成员名称 |
描述 |
|---|---|
RNE_BL OB_N_H_W_Cstride |
数据存储按照批次、高度 、宽度、通道存储,通道对齐到4、8、16、32、32+4等 |
RNE_BL OB_N_Cn_N_H_W_Cx |
此方式为硬件存 储的方式,数据存储按照批次、高度、宽度、通道存储 |
RNE_BLOB_N_H_W_C |
数据存储按照批次、高度、宽度、通道存储,无对齐 |
【说明】
RNE_BLOB_S 结构体
【定义】
typedef struct tsRNE_BLOB_S {
TS_S32 s32N;
TS_S32 s32H;
TS_S32 s32W;
TS_S32 s32C;
TS_CHAR *cpName;
TS_VOID *vpAddr;
TS_S32 s32Offs;
TS_S32 s32BitNum;
TS_RNE_BOOL bIsUnsigned;
TS_RNE_BOOL bIsJoined;
TS_S32 *s32pQ;
TS_FLOAT *fCoeff;
RNE_BLOB_FORMAT_E eFormat;
TS_U32 u32Size;
} RNE_BLOB_S;
【成员】
成员名称 |
描述 |
|---|---|
s32N |
批数 |
s32H |
高度 |
s32W |
宽度 |
s32C |
通道数 |
cpName |
名称 |
vpAddr |
数据基址 |
s32Offs |
偏移量 |
s32BitNum |
位宽 |
bIsUnsigned |
是否是无符号的 |
bIsJoined |
是否是拼接的 |
s32pQ |
*q = -1为浮点数,其他整数 |
fCoeff |
数据系数 |
eFormat |
数据格式 |
u32Size |
数据长度 |
【注意事项】
所有blob数据形状是[n:h:w:c_stride], 包括结果。
【相关数据类型及接口】
RNE_BLOBS_S;
【说明】
RNE_BLOBS_S结构体。
【定义】
typedef struct tsRNE_BLOBS_S
TS_U32 u32NBlob;
RNE_BLOB_S *stpBlob;
} RNE_BLOBS_S;
【成员】
成员名称 |
描述 |
|---|---|
u32NBlob |
blob数组个数 |
stpBlob |
指向RNE_BLOB_S结构体数组的指针 |
【相关数据类型及接口】
1. RNE_BLOBS_S *TS_MPI_TRP_RNE_Forward(RNE_NET_S *net);
2. RNE_BLOBS_S *TS_MPI_TRP_RNE_GetResultBlobs(RNE_NET_S *net);
3. RNE_BLOBS_S *TS_MPI_TRP_RNE_GetInputBlobs(RNE_NET_S *net);
4. RNE_BLOBS_S *TS_MPI_TRP_RNE_GetHideBlobs(RNE_NET_S *net);
5. TS_S32 TS_MPI_TRP_RNE_FillInputBlobs(RNE_NET_S *net, TS_S32 coreIdx, TS_U8 *input);
【说明】
RNE_BIN_DATA_S结构体。
【定义】
【成员】
成员名称 |
描述 |
|---|---|
szLen |
描述data数据的字节个数 |
u8pData |
TS_U8型data的起始地址 |
【相关数据类型及接口】
typedef TS_VOID (*TS_MPI_TRP_RNE_GpLayerHandler)(RNE_BLOBS_S *input, RNE_BLOBS_S *output, RNE_BIN_DATA_S *extraData, TS_VOID *userData);
【说明】
所有通用算子层处理函数的结构体。
【定义】
1. typedef struct tsRNE_GP_LAYERS_HD_S {
2. TS_MPI_TRP_RNE_GpLayerHandler *fnpGpLayerHd;
3. TS_S32 s32GpLayerTypeNum;
4. TS_S32 s32UserLayerTypeNum;
5. } RNE_GP_LAYERS_HD_S;
【成员】
成员名称 |
描述 |
|---|---|
fnpGpLayerHd |
通用算子层处理函数的数组 |
s32GpLayerTypeNum |
通用算子层处理函数的数组的大小 |
s32UserLayerTypeNum |
自定义的已注册的通用算子层处理函数个数 |
【相关数据类型及接口】
RNE_GP_LAYERS_HD_S *TS_MPI_TRP_RNE_GetGpLayersHd(TS_VOID);
RNE_GP_LAYER_S
【说明】
单个通用算子层数据结构体。
【定义】
1. typedef struct tsRNE_GP_LAYER_S {
2. TS_S32 s32LayerId;
3. TS_CHAR *cpLayerName;
4. TS_S32 s32LayerType;
5. TS_CHAR *cpTypeName;
6. } RNE_GP_LAYER_S;
【成员】
成员名称 |
描述 |
|---|---|
s32LayerId |
通用算子层唯一标识 |
cpLayerName |
通用算子层名称 |
s32LayerType |
通用算子层类型唯一标识 |
cpTypeName |
通用算子层类型名称 |
【相关数据类型及接口】
RNE_GP_LAYERS_S;
【说明】
通用算子层数据结构体。
【定义】
1. typedef struct tsRNE_GP_LAYERS_S {
2. TS_U32 u32LayersNum;
3. RNE_GP_LAYER_S *stpLayerInfo;
4. } RNE_GP_LAYERS_S;
【成员】
成员名称 |
描述 |
|---|---|
u32LayersNum |
通用算子层总数 |
stpLayerInfo |
通用算子层信息 |
【相关数据类型及接口】
RNE_GP_LAYERS_S *TS_MPI_TRP_RNE_GetGpLayers(RNE_NET_S *net);
【说明】
log打印等级。
【定义】
1. typedef enum tsRNE_LOG_E {
2. RNE_LOG_DEBUG,
3. RNE_LOG_INFO,
4. RNE_LOG_WARN,
5. RNE_LOG_ERROR,
6. RNE_LOG_NONE
7. } RNE_LOG_E;
【成员】
成员名称 |
描述 |
|---|---|
RNE_LOG_DEBUG |
log等级为debug |
RNE_LOG_INFO |
log等级为info |
RNE_LOG_WARN |
log等级为warn |
RNE_LOG_ERROR |
log等级为error |
RNE_LOG_NONE |
log等级设置必须小于此值 |
【相关数据类型及接口】
TS_VOID TS_MPI_TRP_RNE_SetLogLevel(RNE_LOG_E logLevel);
RNE_LOG_E TS_MPI_TRP_RNE_GetLogLevel(TS_VOID);
【说明】
端口地址结构体。
【定义】
typedef struct tsRNE_PORT_ADDR_S {
TS_SIZE_T szBaseAddr;
TS_SIZE_T szNNpu;
TS_SIZE_T szMemPhyAddr;
TS_SIZE_T szMemVirAddr;
TS_U32 u32MemSize;
} RNE_PORT_ADDR_S;
【成员】
成员名称 |
描述 |
|---|---|
szBaseAddr |
RNE base地址 |
szNNpu |
NPU总数 |
szMemPhyAddr |
RNE物理内存地址 |
szMemVirAddr |
RNE虚拟内存地址 |
u32MemSize |
RNE内存大小 |
【相关数据类型及接口】
RNE_DRIVER_S;
【说明】
驱动结构体。
【定义】
typedef struct tsRNE_DRIVER_S {
TS_S32 (*fnpRneInit)(RNE_PORT_ADDR_S *port);
TS_VOID (*fnpRneFree)();
TS_VOID (*fnpRneProcOpt)(TS_VOID *optional);
TS_U32 (*fnpRneIsForwardDone)(TS_S32 npuIdx, TS_S32 timeOutMs);
TS_VOID (*fnpRneClearForwardDone)(TS_S32 npuIdx);
} RNE_DRIVER_S;
【成员】
成员名称 |
描述 |
|---|---|
fnpRneInit |
加载驱动函数指针 |
fnpRneFree |
卸载驱动函数指针 |
fnpRneProcOpt |
可选参预处理函数指针 |
fnpRneIsForwardDone |
RNE前向推理完成判断函数指针 |
fnpRneClearForwardDone |
RNE清除前向推理完成标志位函数指针 |
【相关数据类型及接口】
TS_S32 TS_MPI_TRP_RNE_OpenDevice(RNE_DRIVER_S *driver, TS_MPI_TRP_RNE_RegisterAllGpLayers registerGpLayers);
RNE_TIME_STATE_S
【说明】
单对象时间统计结构体。
【定义】
【成员】
成员名称 |
描述 |
|---|---|
cpObjName |
对象名称 |
s32ObjID |
对象ID |
u32Calls |
被调用总次数 |
u64TempTime |
临时时间统计变量 |
u64TotalTime |
被调用总耗时 |
【相关数据类型及接口】
RNE_TIME_STATES_S;
【说明】
时间统计结构体。
【定义】
1. typedef struct tsRNE_TIME_STATES_S {
2. RNE_TIME_STATE_S* stpSta;
3. TS_S32 s32Num;
4. } RNE_TIME_STATES_S;
【成员】
成员名称 |
描述 |
|---|---|
stpSta |
对象指针 |
s32Num |
对象总数 |
【相关数据类型及接口】
1. TS_U32 TS_MPI_TRP_RNE_GetTotalTime(RNE_TIME_STATES_S *timeState);
2. TS_U32 TS_MPI_TRP_RNE_GetTimeOfForward(RNE_TIME_STATES_S *timeState);
3. TS_U32 TS_MPI_TRP_RNE_GetTimeOfGpLayar(RNE_TIME_STATES_S *timeState);
4. TS_U32 TS_MPI_TRP_RNE_GetTimeOfHwLayar(RNE_TIME_STATES_S *timeState);
5. TS_U32 TS_MPI_TRP_RNE_GetTimeAtGpLayar(RNE_TIME_STATES_S *timeState, TS_S32 layerType);
6. TS_VOID TS_MPI_TRP_RNE_InitTimeState(const TS_S32 gpStartId, const TS_S32 gpNum, RNE_TIME_STATES_S *timeState);
7. TS_VOID TS_MPI_TRP_RNE_ResetTimeState(RNE_TIME_STATES_S *timeState);
8. TS_VOID TS_MPI_TRP_RNE_ReleaseTimeState(RNE_TIME_STATES_S *timeState);
9. TS_S32 TS_MPI_TRP_RNE_NetBindTimeState(RNE_NET_S *net, RNE_TIME_STATES_S *timeState);
【说明】
芯片类型枚举。
【定义】
1. typedef enum tsRNE_TYPE_NAME_E {
2. RNE_TYPE_NAME_TX5105C = 0,
3. RNE_TYPE_NAME_TX5103C,
4. RNE_TYPE_NAME_TX5105CV100,
5. RNE_TYPE_NAME_TX5103CV100,
6. RNE_TYPE_NAME_TX5101C,
7. RNE_TYPE_NAME_TX5101D,
8. RNE_TYPE_NAME_TX5101E,
9. RNE_TYPE_NAME_TX5368AV200 = 10,
10. RNE_TYPE_NAME_TX5339AV200,
11. RNE_TYPE_NAME_TX5335AV200,
12. RNE_TYPE_NAME_TX5215CV200,
13. RNE_TYPE_NAME_TX5215DV200,
14. RNE_TYPE_NAME_TX5215DV300,
15. RNE_TYPE_NAME_TX5215EV300,
16. RNE_TYPE_NAME_TX5239DV200,
17. RNE_TYPE_NAME_TX5239DV220,
18. RNE_TYPE_NAME_TX5239DV300,
19. RNE_TYPE_NAME_TX5112CV201,
20. RNE_TYPE_NAME_TX5112DV201,
21. RNE_TYPE_NAME_TX5112CV300,
22. RNE_TYPE_NAME_TX5112DV300,
23. RNE_TYPE_NAME_TX5239CV201,
24. RNE_TYPE_NAME_TX5239DV201,
25. RNE_TYPE_NAME_TX5336AV200,
26. RNE_TYPE_NAME_TX5256AV200,
27. RNE_TYPE_NAME_MAX
28. } RNE_TYPE_NAME_E;
【成员】
成员名称 |
描述 |
|---|---|
RNE_TYPE_NAME_TX5105C |
芯片TX5105C |
RNE_TYPE_NAME_TX5103C |
芯片TX5103C |
RN E_TYPE_NAME_TX5105CV100 |
芯片TX5105CV100 |
RN E_TYPE_NAME_TX5103CV100 |
芯片TX5103CV100 |
RNE_TYPE_NAME_TX5101C |
芯片TX5101C |
RNE_TYPE_NAME_TX5101D |
芯片TX5101D |
RNE_TYPE_NAME_TX5101E |
芯片TX5101E |
RN E_TYPE_NAME_TX5368AV200 |
芯片TX5368AV200 |
RN E_TYPE_NAME_TX5339AV200 |
芯片TX5339AV200 |
RN E_TYPE_NAME_TX5335AV200 |
芯片TX5335AV200 |
RN E_TYPE_NAME_TX5215CV200 |
芯片TX5215CV200 |
RN E_TYPE_NAME_TX5215DV200 |
芯片TX5215DV200 |
RN E_TYPE_NAME_TX5215DV300 |
芯片TX5215DV300 |
RN E_TYPE_NAME_TX5215EV300 |
芯片TX5215EV300 |
RN E_TYPE_NAME_TX5239DV200 |
芯片TX5239DV200 |
RN E_TYPE_NAME_TX5239DV220 |
芯片TX5239DV220 |
RN E_TYPE_NAME_TX5239DV300 |
芯片TX5239DV300 |
RN E_TYPE_NAME_TX5112CV201 |
芯片TX5112CV201 |
RN E_TYPE_NAME_TX5112DV201 |
芯片TX5112DV201 |
RN E_TYPE_NAME_TX5112CV300 |
芯片TX5112CV300 |
RN E_TYPE_NAME_TX5112DV300 |
芯片TX5112DV300 |
RN E_TYPE_NAME_TX5239CV201 |
芯片TX5239CV201 |
RN E_TYPE_NAME_TX5239DV201 |
芯片TX5239DV201 |
RN E_TYPE_NAME_TX5336AV200 |
芯片TX5336AV200 |
RN E_TYPE_NAME_TX5256AV200 |
芯片TX5256AV200 |
RNE_TYPE_NAME_MAX |
枚举最大值 |
【相关数据类型及接口】
TS_S32 TS_MPI_TRP_RNE_InitResourceByType(RNE_TYPE_NAME_E type);
【说明】
所有支持的图片格式转化的枚举。
【定义】
1. typedef enum tsRNE_IMG_CONVERT_MODE{
2. ARGB8888_RGBA8888 0,
3. RGBA8888_ARGB8888 = 1,
4. ARGB8888_ABGR8888 = 2,
5. ABGR8888_ARGB8888 = 3,
6. ABGR8888_BGRA8888 = 4,
7. BGRA8888_ABGR8888 = 5,
8. ARGB8888_RGB888 = 6,
9. RGB888_ARGB8888 = 7,
10. ABGR8888_BGR888 = 8,
11. BGR888_ABGR8888 = 9,
12. ARGB8888_RGB565 = 10,
13. RGB565_ARGB8888 = 11,
14. ABGR8888_BGR565 = 12,
15. BGR565_ABGR8888 = 13,
16. RGB565_BGR565 = 14,
17. BGR565_RGB565 = 15,
18. RGB565_ARGB4444 = 16,
19. ARGB4444_RGB565 = 17,
20. RGB565_ABGR4444 = 18,
21. ABGR4444_RGB565 = 19,
22. ARGB4444_ABGR4444 = 20,
23. ABGR4444_ARGB4444 = 21,
24. BGR565_ARGB1555 = 22,
25. ARGB1555_BGR565 = 23,
26. BGR565_ABGR1555 = 24,
27. ABGR1555_BGR565 = 25,
28. ARGB1555_ABGR1555 = 26,
29. ABGR1555_ARGB1555 = 27,
30. ARGB4444_ARGB1555 = 28,
31. ARGB1555_ARGB4444 = 29,
32. ARGB8888_YUV444 = 30,
33. ARGB8888_YUV422 = 31,
34. ARGB8888_YUV420 = 32
35. YUV444_ARGB8888 = 33,
36. YUV422_ARGB8888 = 34,
37. YUV420_ARGB8888 = 35,
38. YUV444_3P_YUV422_3P = 36,
39. YUV422_3P_YUV444_3P = 37,
40. YUV422_3P_YUV422_NV12 = 38,
41. YUV422_NV12_YUV422_3P = 39,
42. YUV422_3P_YUV422_NV21 = 40,
43. YUV422_NV21_YUV422_3P = 41,
44. YUV422_NV12_YUV422_NV21 = 42,
45. YUV422_NV21_YUV422_NV12 = 43
46. YUV422_3P_YUV422_YUYV = 44,
47. YUV422_YUYV_YUV422_3P = 45,
48. YUV422_3P_YUV422_YVYU = 46,
49. YUV422_YVYU_YUV422_3P = 47,
50. YUV422_3P_YUV422_UYVY = 48,
51. YUV422_UYVY_YUV422_3P = 49,
52. YUV422_3P_YUV422_VYUY = 50,
53. YUV422_VYUY_YUV422_3P = 51,
54. YUV422_3P_YUV420_3P = 52,
55. YUV420_3P_YUV422_3P = 53,
56. YUV420_3P_YUV420_NV12 = 54,
57. YUV420_NV12_YUV420_3P = 55,
58. YUV420_3P_YUV420_NV21 = 56,
59. YUV420_NV21_YUV420_3P = 57,
60. YUV420_NV12_YUV420_NV21 = 58,
61. YUV420_NV21_YUV420_NV12 = 59,
62. IMAGE_METHOD_MAX = 6
63. } RNE_IMG_CONVERT_MODE_E;
【成员】
成员名称 |
描述 |
|---|---|
ARGB8888_RGBA8888 |
ARGB8888格式转RGBA8888格式 |
RGBA8888_ARGB8888 |
RGBA8888格式转ARGB8888格式 |
ARGB8888_ABGR8888 |
ARGB8888格式转ABGR8888格式 |
ABGR8888_ARGB8888 |
ABGR8888格式转ARGB8888格式 |
ABGR8888_BGRA8888 |
ABGR8888格式转BGRA8888格式 |
BGRA8888_ABGR8888 |
BGRA8888格式转ABGR8888格式 |
ARGB8888_RGB888 |
ARGB8888格式转RGB888格式 |
RGB888_ARGB8888 |
RGB888格式转ARGB8888格式 |
ABGR8888_BGR888 |
ABGR8888格式转BGR888格式 |
BGR888_ABGR8888 |
BGR888格式转ABGR8888格式 |
ARGB8888_RGB565 |
ARGB8888格式转RGB565格式 |
RGB565_ARGB8888 |
RGB565格式转ARGB8888格式 |
ABGR8888_BGR565 |
ABGR8888格式转BGR565格式 |
BGR565_ABGR8888 |
BGR565格式转ABGR8888格式 |
RGB565_BGR565 |
RGB565格式转BGR565格式 |
BGR565_RGB565 |
BGR565格式转RGB565格式 |
RGB565_ARGB4444 |
RGB565格式转ARGB4444格式 |
ARGB4444_RGB565 |
ARGB4444格式转RGB565格式 |
RGB565_ABGR4444 |
RGB565格式转ABGR4444格式 |
ARGB4444_RGB565 |
ARGB4444格式转RGB565格式 |
ARGB4444_ABGR4444 |
ARGB4444格式转ABGR4444格式 |
ABGR4444_ARGB4444 |
ABGR4444格式转ARGB4444格式 |
BGR565_ARGB1555 |
BGR565格式转ARGB1555格式 |
ARGB1555_BGR565 |
ARGB1555格式转BGR565格式 |
BGR565_ABGR1555 |
BGR565格式转ABGR1555格式 |
ABGR1555_BGR565 |
ABGR1555格式转BGR565格式 |
ARGB1555_ABGR1555 |
ARGB1555格式转ABGR1555格式 |
ABGR1555_ARGB1555 |
ABGR1555格式转ARGB1555格式 |
ARGB4444_ARGB1555 |
ARGB4444格式转ARGB1555格式 |
ARGB1555_ARGB4444 |
ARGB1555格式转ARGB4444格式 |
ARGB8888_YUV444 |
ARGB8888格式转YUV444格式 |
ARGB8888_YUV422 |
ARGB8888格式转YUV422格式 |
ARGB8888_YUV420 |
ARGB8888格式转YUV420格式 |
YUV444_ARGB8888 |
YUV444格式转ARGB8888格式 |
YUV422_ARGB8888 |
YUV422格式转ARGB8888格式 |
YUV420_ARGB8888 |
YUV420格式转ARGB8888格式 |
YUV444_3P_YUV422_3P |
YUV444_3P格式转YUV422_3P格式 |
YUV422_3P_YUV444_3P |
YUV422_3P格式转YUV444_3P格式 |
YUV422_3P_YUV422_NV12 |
YUV422_3P格式转YUV422_NV12格式 |
YUV422_NV12_YUV422_3P |
YUV422_NV12格式转YUV422_3P格式 |
YUV422_3P_YUV422_NV21 |
YUV422_3P格式转YUV422_NV21格式 |
YUV422_NV21_YUV422_3P |
YUV422_NV21格式转YUV422_3P格式 |
YUV422_NV12_YUV422_NV21 |
YUV422_NV12格式转YUV422_NV21格式 |
YUV422_NV21_YUV422_NV12 |
YUV422_NV21格式转YUV422_NV12格式 |
YUV422_3P_YUV422_YUYV |
YUV422_3P格式转YUV422_YUYV格式 |
YUV422_YUYV_YUV422_3P |
YUV422_YUYV格式转YUV422_3P格式 |
YUV422_3P_YUV422_YVYU |
YUV422_3P格式转YUV422_YVYU格式 |
YUV422_YVYU_YUV422_3P |
YUV422_YVYU格式转YUV422_3P格式 |
YUV422_3P_YUV422_UYVY |
YUV422_3P格式转YUV422_UYVY格式 |
YUV422_UYVY_YUV422_3P |
YUV422_UYVY格式转YUV422_3P格式 |
YUV422_3P_YUV422_VYUY |
YUV422_3P格式转YUV422_VYUY格式 |
YUV422_VYUY_YUV422_3P |
YUV422_VYUY格式转YUV422_3P格式 |
YUV422_3P_YUV420_3P |
YUV422_3P格式转YUV420_3P格式 |
YUV420_3P_YUV422_3P |
YUV420_3P格式转YUV422_3P格式 |
YUV420_3P_YUV420_NV12 |
YUV420_3P格式转YUV420_NV12格式 |
YUV420_NV12_YUV420_3P |
YUV420_NV12格式转YUV420_3P格式 |
YUV420_3P_YUV420_NV21 |
YUV420_3P格式转YUV420_NV21格式 |
YUV420_NV21_YUV420_3P |
YUV420_NV21格式转YUV420_3P格式 |
YUV420_NV12_YUV420_NV21 |
YUV420_NV12格式转YUV420_NV21格式 |
YUV420_NV21_YUV420_NV12 |
YUV420_NV21格式转YUV420_NV12格式 |
IMAGE_METHOD_MAX |
枚举最大值 |
【相关数据类型及接口】
【说明】
异步执行器状态枚举。
【定义】
1. typedef struct tsRNE_ASYNC_EXE_STATE {
2. RNE_NN_FORWARD_INIT,
3. RNE_NN_FORWARD_FEED,
4. RNE_NN_FORWARD_READY,
5. RNE_NN_FORWARD_RUNNING,
6. RNE_NN_FORWARD_DONE,
7. RNE_NN_FORWARD_SUSPEND,
8. RNE_NN_FORWARD_RESUME,
9. RNE_NN_FORWARD_WAIT,
10. RNE_NN_FORWARD_IDLE,
11. RNE_NN_FORWARD_EXCEPTION
12. } RNE_ASYNC_EXE_STATE;
【成员】
成员名称 |
描述 |
|---|---|
RNE_NN_FORWARD_INIT |
初始化状态。 |
RNE_NN_FORWARD_FEED |
输入数据准备就绪,等待进行前向推理。 |
RNE_NN_FORWARD_READY |
前向推理准备就绪,可以开始执行前向推理。 |
RNE_NN_FORWARD_RUNNING |
正在执行前向推理。 |
RNE_NN_FORWARD_DONE |
前向推理完成。 |
RNE_NN_FORWARD_SUSPEND |
暂停状态。 |
RNE_NN_FORWARD_RESUME |
恢复执行状态。 |
RNE_NN_FORWARD_WAIT |
等待状态。 |
RNE_NN_FORWARD_IDLE |
空闲状态。 |
R NE_NN_FORWARD_EXCEPTION |
异常状态。 |
RNE_ASYNC_EXECUTOR
【说明】
异步执行器状态枚举。
【定义】
【成员】
成员名称 |
描述 |
|---|---|
eState |
异步执行器的状态。 |
s32NTaskDone; |
已完成的任务数。 |
s32CoreIdx |
核心索引的整型指针。 |
pNet |
神经网路结构体指针。 |
u8pNetIn |
输入数据的指针。 |
u8pNetOut |
输出数据的指针。 |
s32Priority |
优先级值,取值(0 ~ 255)。 |
vpContext |
上下文指针,用于存储任意用户自定义的数据。 |
【相关数据类型及接口】
1. TS_S32 TS_MPI_TRP_RNE_AsyncExecutorBind(RNE_ASYNC_EXECUTOR *asyncEtr,
2. RNE_NET_S *net, TS_S32 priority);
3. TS_S32 TS_MPI_TRP_RNE_AsyncExecutorUnbind(RNE_ASYNC_EXECUTOR *asyncEtr);
4. RNE_BLOBS_S *TS_MPI_TRP_RNE_ForwardAsync(RNE_ASYNC_EXECUTOR
*asyncEtr);
6.4. 典型调用流程图
6.4.1. 典型调用流程图
典型调用流程图
6.4.2. 典型流程
6.4.2.1. 设置芯片型号
1. /* 1 设置芯片型号
2. \*/
3. TS_MPI_TRP_RNE_InitResourceByType(RNE_TYPE_NAME_TX5368AV200);
6.4.2.2. 设置log等级
1. /* 2 设置log等级 (可选,默认RNE_LOG_ERROR)
2. \*/
3. TS_MPI_TRP_RNE_SetLogLevel(RNE_LOG_INFO);
6.4.2.3. 初始化数据结构
1. /* 3 初始化数据结构
2. \*/
3. RNE_NET_S nnModel;
4. memset(&nnModel, 0, sizeof (RNE_NET_S));
5. nnModel.u8pGraph = (TS_U8 *)modelData;
6. nnModel.s32GraphLen = getFileSize(modelFile);
7. nnModel.eInputType = RNE_NET_INPUT_TYPE_INT_CHW;
8. nnModel.eOutputType = RNE_NET_OUTPUT_TYPE_FORMAT_NONE;
9. RNE_NET_S *net[] = {&nnModel};
6.4.2.4. 打开RNE设备
1. /* 4 打开RNE设备
2. \*/
3. TS_S32 ret = TS_MPI_TRP_RNE_OpenDevice(NULL, TS_MPI_TRP_RNE_RegisterGpLayers);
4. if (ret) {
5. TS_MPI_TRP_RNE_Error("open device error!\\n");
6. return ret;
7. }
6.4.2.5. 初始化网络模型
1. /* 5 初始化多网络模型,并在每次初始化网络配置后,进行网络OnceLoad
2. \*/
3. for (TS_S32 n = 0; n < num; ++n) {
4. /* 初始化单个网路
5. \*/
6. ret = TS_MPI_TRP_RNE_LoadModel(net[n]);
7. if (ret) {
8. TS_MPI_TRP_RNE_Error("load model error!\\n");
9. goto releaseResult;
10. }
11. /* net once load
12. * 仅有网络模型配置为once load情况下,内部才真正执行once load
13. \*/
14. ret = TS_MPI_TRP_RNE_OnceLoad(net[n]);
15. if (ret) {
16. TS_MPI_TRP_RNE_Error("once load error!\\n");
17. goto releaseResult;
18. }
19. }
6.4.2.6. 填充网络输入数据
1. /* 6 填充输入数据
2. \*/
3. if (0 != TS_MPI_TRP_RNE_FillInputBlobs(net[n], 0, modelInput)) {
4. TS_MPI_TRP_RNE_Error("fill inputBlobs error!\\n");
5. goto releaseResult;
6. }
6.4.2.7. 网络推理
1. /* 7 网络推理
2. \*/
3. RNE_BLOBS_S *outputBlobs = TS_MPI_TRP_RNE_Forward(net[n]);
4. if (outputBlobs == NULL) {
5. TS_MPI_TRP_RNE_Error("net forward error!\\n");
6. goto releaseResult;
7. }
6.4.2.8. dump输出数据
1. sLen=0;
2. for(TS_S32 i = 0; i < outputBlobs->u32NBlob; ++i){
3. sLen += outputBlobs->stpBlob[i].u32Size;
4. }
5. TS_VOID *cpAddr = TS_MPI_TRP_RNE_Alloc(sLen);
6. if (NULL == cpAddr) {
7. TS_MPI_TRP_RNE_Error("insufficient memory!\\n");
8. goto releaseResult;
9. }
10. /* 8 dump输出数据
11. \*/
12. TS_MPI_TRP_RNE_DumpOutputBlobs(net[n], cpAddr);
13.
14. RNE_RecordFile(outputBlobs, "./", NULL, 0, 1);
15. TS_MPI_TRP_RNE_Info("net %d forward done\\n", n);
16.
17. TS_MPI_TRP_RNE_Free(cpAddr);
6.4.2.9. 释放网络
1. /* 9 释放网络
2. \*/
3. for (TS_S32 n = 0; n < num; ++n) {
4. TS_MPI_TRP_RNE_UnloadModel(net[n]);
5. }
6.4.2.10. 关闭RNE设备
1. /* 10 关闭RNE设备
2. \*/
3. TS_MPI_TRP_RNE_CloseDevice();
6.5. 重点问题说明
6.5.1. 存储格式介绍
6.5.1.1. BLOB_N_H_W_Cstride格式
BLOB_N_H_W_Cstride存储格式
如图,假设输入shape为[N:H:W:C],箭头1为C方向, 箭头2为W方向,箭头3为H方向,浅灰色表示pad补0。数据存储在c方向上做stride对齐,c_stride需要调用TS_MPI_TRP_RNE_CStride获得。
备注
文档中提到的[N:H:W:C_Stride]格式为BLOB_N_H_W_Cstride格式。
6.5.1.2. BLOB_N_H_W_C格式
BLOB_N_H_W_C存储格式
如图,数据存储在n方向上做stride对齐,c_stride需要调用TS_MPI_TRP_RNE_CStride获得(c_stride=c+c_pad)。内存存储时先存放h*w*c的数据, 再存放h*w*c_pad, 即n = x时的地址偏移为 x * h * w * c_stride。
假设输入shape为[N:H:W:C],箭头1为C方向, 箭头2为W方向,箭头3为H方向,浅灰色表示pad补0。
6.5.1.3. INT_NHWC格式
INT_NHWC格式存储
如图,数据存储在所有方向上无stride对齐,即n = x时的地址偏移为 x *h * w * c。
假设输入shape为[N:H:W:C] [1:2:3:2],箭头1为C方向, 箭头2为W方向,箭头3为H方向,则NHWC:
{0000} {0001} {0010} {0011} {0020} {0021}
{0100} {0101} {0110} {0111} {0120} {0121}
6.5.2. 如何设置输入数据
6.5.2.1. 设置输入数据的方式
RNE硬件要求输入数据为[N:H:W:C_Stride]格式的定点数据。
当用户的图片数据C维度为1(即灰度图模式),且是8bit或者16bit数据时,C_Stride为1;
其他情况,C_Stride都需要通过接口TS_MPI_TRP_RNE_CStride获取或通过编译器log查看。
用户有两种方式可以将输入数据转换为[N:H:W:C_stride]格式的定点数据:
方式一:用户指定输入数据类型,调用TS_MPI_TRP_RNE_FillInputBlobs接口,内部自动转换为[N:H:W:C_Stride]定点格式,输入数据类型与eInputType对应关系参见5.2.2章节。
方式二:用户根据输入数据的特点自己编程转换为[N:H:W:C_Stride]格式的定点数据。
可根据open_source/fill_input_blobs/ts_rne_fill_input_blobs.c进行改写,实现更高效的输入数据转换。
6.5.2.2. 输入数据类型与eInputType对应关系
eInputType对应关系
如果用户的图片是RGBA格式(定点数据),则SDK的RNE_NET_S结构体的eInputType设置为0RGB模式;
如果用户的图片是灰度图格式(定点数据),则SDK的RNE_NET_S结构体的eInputType设置为GREY模式;
如果用户的图片是RGB格式或BGR格式(定点数据),则SDK的RNE_NET_S结构体的eInputType设置为INT_HWC/INT_CHW模式(由图片数据读入顺序来确定,参见下图);
如果用户的图片是RGB格式或BGR格式(浮点数据),则SDK的RNE_NET_S结构体的eInputType设置为FLOAT_HWC/FLOAT_CHW模式(由图片数据读入顺序来确定,参见下图);
其他格式,用户需要自行编程实现。
NCHW和NHWC的差异
由于硬件对浮点不友好,产品部署时,不推荐用户设置FLOAT_HWC/FLOAT_CHW模式,如果网络是浮点输入,可以在量化时,将减均值除方差作为BN层量化进网络,参考《TS.Knight-量化工具FAQ》。
由于ARGB格式和灰度图格式的图片是[N:H:W:C_stride]定点数据(浮点须先转换为定点), 推荐用户使用ARGB格式或者灰度图格式的图片。此时,SDK中设置为0RGB或者GREY模式,SDK只做memcpy操作,效率更高。
FLOAT_HWC/FLOAT_CHW/INT_CHW 三种模式一般用于和量化的结果进行比较时使用。例如:用户使用caffe量化模型,caffe默认输入数据为CHW格式,此时,SDK与其做对比,也要设置CHW格式。
SDK内0RGB模式对应的是每个通道占8bit,前三个通道有效,最后一个通道在网络中不参与计算。
SDK内GREY模式要求数据是单通道8bit或16bit,注意某些芯片不支持16bit GREY模式。
备注
TX510x系列不支持16bit灰度图模式。
6.5.3. 如何解析输出数据
eOutputType对应关系图
如果用户期望的输出是定点NCHW格式的数据,则用户在量化时无需指定“-od”参数,则SDK的RNE_NET_S结构体的eOutputType设置为FORMAT_HWC_TO_CHW模式;
如果用户期望的输出是定点NHWC格式的数据,则用户在量化时无需指定“-od”参数,则SDK的RNE_NET_S结构体的eOutputType设置为FORMAT_NONE模式;
如果用户期望的输出是浮点NCHW格式的数据,则用户在量化时需要指定“-od”参数,SDK的RNE_NET_S结构体的eOutputType设置为FORMAT_HWC_TO_CHW模式;
如果用户期望的输出是浮点NCHW格式的数据,则用户在量化时需要指定“-od”参数,SDK的RNE_NET_S结构体的eOutputType设置为FORMAT_NONE模式。
备注
编码解析推理结果可参考open_source/record_file/ts_rne_record_file.c。
6.5.4. SDK中的BLOBS mem
数据流图
RNE_ NET_S 成员 vpSe lfBuf |
特点 |
||
|---|---|---|---|
方式1(参 见5.2.1章节方式1) |
方式 2(参见5.2.1章节方式2) |
||
--inp ut-indep 0(Input blobs me m在blobs mem内) |
NULL |
blobs mem包含input blobs mem, blobs mem由RNE SDK分配控制, input data调用接口直接赋值 |
blobs mem包含input blobs mem, blobs mem由RNE SDK分配控制, input data调用RNE_BLOB_ S的vpAddr指针赋值方式赋值 |
!NULL |
blobs mem包含input blobs mem, blobs mem由用户分配控制, input data调用接口直接赋值 |
blobs mem包含input blobs mem, blobs mem由用户分配控制, input data调用RNE_BLOB_ S的vpAddr指针赋值方式赋值 |
|
--inp ut-indep 1(Input blobs me m在blobs mem外) |
NULL |
input blobs mem由用户分配控制, blobs mem由RNE SDK分配控制, input data调用接口直接赋值 |
input blobs mem由用户分配控制, blobs mem由RNE SDK分配控制, input data调用RNE_BLOB_ S的vpAddr指针赋值方式赋值 |
!NULL |
input blobs mem由用户分配控制, blobs mem由用户分配控制, input data调用接口直接赋值 |
input blobs mem由用户分配控制, blobs mem由用户分配控制, input data调用RNE_BLOB_ S的vpAddr指针赋值方式赋值 |
6.5.5. 网络权重对齐方式
常用权重对齐的方式为申请内存方式对齐,也可以头文件方式对齐。
【典型代码】
权重对齐的方式:
1. #define RNE_W_ALIGN_BYTES_NUM
2. #ifdef RNE_W_ALIGN_BYTES_NUM
3. if (((TS_SIZE_T)net[i]->u8pParams& (TS_MPI_TRP_RNE_W_ALIGN_BYTES_NUM - 1)) != 0) {
4. paramStride[i] = (TS_U8 \*)TS_MPI_TRP_RNE_Alloc(paramSize[i] +
5.
6. TS_MPI_TRP_RNE_W_ALIGN_BYTES_NUM);
7. if (NULL == paramStride[i]) {
8. TS_MPI_TRP_RNE_Error("insufficient memory!\\n");
9. return ret;
10. }
11. TS_SIZE_T addr = (TS_SIZE_T)paramStride[i];
12. addr += TS_MPI_TRP_RNE_W_ALIGN_BYTES_NUM - 1;
13. addr &= ~(TS_MPI_TRP_RNE_W_ALIGN_BYTES_NUM - 1);
14. memcpy((TS_VOID \*)addr, net[i]->u8pParams, paramSize[i]);
15. net[i]->params = (TS_U8 \*)addr;
16. }
17. #endif
数组方式对齐:
备注
TX510x型号产品,用户在赋值RNE_NET_T成员u8pParams时,需要做权重对齐。 在linux平台下,sdk内部对权重做了对齐,不需要再对齐,如果使用TS_MPI_TRP_RNE_SetWeightAddr函数设置权重时,所有型号都需要做权重对齐。
6.5.6. 设置网络blobs和权重地址为物理地址
linux为了实现内存隔离,存在物理地址和虚拟地址,RNE硬件无法直接访问虚拟地址,允许用户出于性能或者内存的考虑,直接设置网络blobs地址和网络权重地址为物理地址。
其中设置网络输入blobs地址为物理地址时,用户需要自己保证输入数据C_Stride对齐。
设置输入blobs地址为物理地址
其中设置网络权重地址为物理地址时,SDK内部将不对权重对齐做保证,需要用户自行保证。
设置输入权重地址为物理地址
6.5.7. onceload网络推理的注意点
onceload网络是在网络初始化时,一次性将网络权重或者网络量化系数导入到RNE内部存储空间,由于在推理时不需要导入,会节省推理时间。
而非onceload网络,是在推理过程中,根据需要导入网络权重或者网络量化系数。
上述就可能导致有onceload模型的多网络推理中,会发生RNE内部存储空间覆盖,为此:
当所有网络都是onceload网络时,需要用户根据权重和量化系数的大小,自行保证不覆盖;当部分网络为onceload时,需要保证onceload的导入bank与pingpong的bank不覆盖。
onceload 功能参见 编译仿真性能分析使用指南 Knight编译器章节说明 。
6.6. samples说明
序 | 名称 号 | |
说明 |
|
|---|---|---|
1 |
rne _simple_forward |
演示一般网络基本推理的流程。 |
2 |
rne_y olov5_detection |
演示yolov5的前处理、推理、后处理的完整流程。 |
3 |
rne_vpe |
演示图片格式转换的流程。 |
4 |
rn e_async_forward |
演示多网络异步推理的流程。 |
5 |
rne_set_i nput_blobs_addr |
演 示用户通过物理地址的方式加载输入数据的流程。 |
6 |
rne_yo lov8s_detection |
演示yolov8s的前处理、推理、后处理的完整流程。 |
7 |
rne_resnet18 _classification |
演 示resnet18的前处理、推理、后处理的完整流程。 |
芯片型号 |
SIM-Lib支持的sample |
RT-Lib支持的sample |
|---|---|---|
TX510x |
1 |
1 |
TX 5368x_TX5339x_TX5335x |
1, 5 |
1, 2,5,6,7 |
TX5215x_TX5239x200_ TX5239x220_TX5239x300 |
1, 5 |
1,2, 5,6,7 |
TX5112x_TX5239x201 |
1, 5 |
1,2, 5,6,7 |
TX5336x_TX5256x-Lib |
1, 3,4,5 |
1, 2,3,4,5,6,7 |
6.7. 部署
6.7.1. PC模拟
6.7.1.1. 相关文件说明
RNE-SIM-Lib/samples目录下有关文件如下:
文件夹或文件 |
说明 |
|---|---|
compiled_model |
如果无指定路径,脚本默 认此文件夹下test_net文件夹为模拟器输入文件夹。 test_gp: 简单的包含自定义算子层的网络。 model_r.cfg:网络指令文件。 model_r.weight:网络权重文件。 model_input.bin:网络输入文件。 model_r.tsmodel:网络指令与权重合一文件。 |
scripts |
用例运行脚本及依赖的工具。 bin2header:二进制文件转头文件脚本。 run_e2e_example.sh: 支持Makefile编译并可指定模型路径的脚本。 run_e2e_example_cm.sh: 支持cmake方式编译并指定模型路径的脚本。 |
open_source |
示例调用的部分源码。 |
rne_simple_forward |
简单的网络推理示例程序。 |
... |
其他示例参考 samples说明 。 |
6.7.1.2. 重要步骤说明
配置main.c和Makefile文件
配置samples/rne_simple_forward/目录下的Makefile和samples/rne_simple_forward/src/main.c文件:
Makefile
1. ################################################################################
2. # makefile
3. ################################################################################
4. ifeq ($(strip $(ARCH)),linux_a53)
5. CC_PREFIX := aarch64-none-linux-gnu-
6. CPU_FLAGS := -march=armv8-a -mcpu=cortex-a53
7. X_LIB_L_FLAGS := -lrne_pal_linux_a53,-lgcc,-lc,-lm,-lpthread
8. LIBS_DIR := $(if $(filter 1,$(USE_DYNAMIC_LIB)),bin,libs)
9. else ifeq ($(strip $(ARCH)),linux_a53_uclibc)
10. CC_PREFIX := aarch64-ts-linux-uclibc-
11. CPU_FLAGS := -march=armv8-a -mcpu=cortex-a53
12. X_LIB_L_FLAGS := -lrne_pal_linux_a53,-lgcc,-lc,-lm,-lpthread
13. LIBS_DIR := $(if $(filter
1,$(USE_DYNAMIC_LIB)),aarch64_ts_linux_uclibc_bin,aarch64_ts_linux_uclibc_libs)
14. else
15. CC_PREFIX :=
16. CPU_FLAGS :=
17. X_LIB_L_FLAGS := -lrne_pal_sim,-lrne_vm,-lgcc,-lc,-lm,-lpthread
18. LIBS_DIR := $(if $(filter 1,$(USE_DYNAMIC_LIB)),bin,libs)
19. endif
根据实际输入的测试数据排布格式修改input_type,可以为INT_HWC、INT_CHW或其他格式,示例中测试数据为INT_HWC格式,具体如下图所示:
1. RNE_NET_S nnModel;
2. memset(&nnModel, 0, sizeof(RNE_NET_S));
3. nnModel.u8pGraph = (TS_U8 \*)modelData;
4. nnModel.u8pGraphLen = getFileSize(modelFile);
5. nnModel.eInputType = RNE_NET_INPUT_TYPE_INT_HWC;
执行make命令进行编译、运行
在samples下执行make指令进行编译,会在rne_simple_forward/build_sim/Release目录下生成一个仿真elf文件,该文件可以直接在终端执行,同时我们也支持cmake编译方式,并提供CmakeList.txt文件。
1. # 工作目录:./rne_simle_forward
2. # make 命令
3. make
1. # 工作目录:./rne_simple_forward
2. # 运行命令(具体命令见samples/README.md)
6.7.1.3. samples运行说明
执行如下命令:
1. #工作路径:samples/scripts
2. #无参数情况,默认模型路径为../compiled_model/test_gp
3. ./run_e2e_example.sh
4. #若需要执行其他模型,请在入口脚本后增加模型文件路径,路径下必须包含\*.cfg、\*.weight
5. #和\*.bin(三个文件均仅支持一个;多输入网络的输入文件须合并成一个bin。)
执行成功后,会看到以下信息提示,表示编译成功,生成PC端资源:samples/rne_simple_forward/build_sim/Release/rne_simple_forward.elf。
6.7.2. TX5368x_TX5339x_TX5335x系列板端部署
6.7.2.1. 配置交叉编译环境
在RNE-RT-Lib目录下,有settings_path_linux.sh脚本。编辑该脚本将tools_dir设置成gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz 解压后的存放路径(最好是绝对路径),之后source一下就可以。
6.7.2.2. 编写应用程序main.c
参见 重要步骤说明 。
6.7.2.3. 交叉编译生成板端部署资源
参见 samples运行说明 。
执行成功后,会看到以下信息提示,表示交叉编译成功,生成板端资源:samples/rne_simple_forward/build_linux_a53/Release/rne_simple_forward.elf。
6.7.2.4. 打开部署工具
板端环境搭建参考《TX5368AV200 Linux SDK安装及升级使用说明》和《TX5368AV200开发板使用手册》。
确保IPOP工具TFTP已配置好服务器路径,确保打开对应的调试串口,确保板端已经进入linux系统。
6.7.2.5. 拷贝部署资源到板端部署
把elf文件rne_simple_forward.elf拷贝到windows系统下IPOP工具配置TFTP服务器目录下,然后执行如下命令:
部署模型:
1. # 命令
2. tftp -g -r rne_simple_forward.elf 192.168.1.20
3. insmod /usr/lib/modules/rne_driver.ko
4. chmod +x rne_simple_forward.elf
5. ./rne_simple_forward.elf
可以看到模型运行结果如下图,其结果与PC模拟输出结果一致。
至此,模型部署完毕!
6.7.3. TX510x系列板端部署
6.7.3.1. 环境准备
开发板环境的配置及与板端的初始化请参考《IntelliX TX510 SDK开发使用指南》及《TX5105C开发板使用手册》第6节。
6.7.3.2. 配置交叉编译环境
在RNE-RT-Lib目录下,有settings_path_linux.sh脚本。编辑该脚本将tools_dir设置成csky_tools_linux.tar.gz 解压后的存放路径(最好是绝对路径),之后source一下就可以。
6.7.3.3. 编写应用程序main.c
参见`重要步骤说明`_ 。
6.7.3.4. 交叉编译生成板端部署资源
参见 samples运行说明 。
执行成功后,会看到以下信息提示,表示交叉编译成功,生成板端资源:samples/rne_simple_forward/build_ck805/Release/rne_simple_forward.elf。
6.7.3.5. 打开串口调试工具
确定microusb线是否连接好,然后打开串口调试工具,可以使用SSCOM、SecureCRT或者其他的软件,本示例使用的是SecureCRT。
6.7.3.6. 拷贝部署资源到板端部署
把elf文件rne_simple_forward.elf拷贝到windows系统下的tx510_deploy目录下,然后执行如下命令:
初始化804的DDR:
1. # 命令
2. csky-abiv2-elf-gdb -x ck804_ddr_init.gdbinit tx5103_a2_ddrinit_CPU266_AIE204_2f5c31a5.elf
备注
默认情况下ck804的端口为1025,ck805的端口为1026,请注意核对一下是否与ck804_ddr_init.gdbinit、ck805_load.gdbinit初始化文件中的端口号一致,若不一致则需要修改初始化文件,板端的连接配置请参考《IntelliX TX510 SDK开发使用指南》。 tx5103_a2_ddrinit_CPU266_AIE204_2f5c31a5.elf名称可能不同,以发布包的为准。
部署模型:
然后通过串口调试助手中可以看到模型运行结果如下图,其结果与模拟器输出结果一致。
至此,模型部署完毕!
6.7.4. TX5215x_TX5239x200_TX5239x220_TX5239x300系列板端部署
6.7.5. TX5112x_TX5239x201系列板端部署
6.7.6. TX5336x_TX5256x 板端部署
6.8. FAQ
6.8.1. bin2header如何使用?
如图,单执行脚本,会打印帮助提示信息。
bin2header提示帮助信息
# bin2header bin_file header_file
bin_file为需要转换成头文件的二进制文件,header_file为被转换成的头文件。
# bin2header txt_file bin_file -r
bin_file为被转换成的二进制文件,txt_file为需要被转换的头文件,去掉首行和尾行。
示例操作如图 bin2header转换示例。
带首行和尾行的头文件
去掉首行和尾行的头文件
bin2header转换示例
6.8.2. 驱动rne_driver.ko如何加载?
rne_driver.ko目前只适用TX5368x_TX5339x_TX5335x、TX5215x_TX5239x200_TX5239x220_TX5239x300和TX5112x_TX5239x201系列。
在板端执行insmod /usr/lib/modules/rne_driver.ko
卸载驱动:rmmod rne_driver
6.8.3. rne_simple_forward示例中输出结果的宏开关如何使用?
为了便于用户参考模拟器输出文件的实现,在RNE库、RT库增加以下4个编译宏开关供用户在Makefile中选择指定:
-DRESULT_HWC_P
-DRESULT_CHW_P
-DRESULT_ALL
-DDISABLE_PRINT_DEBUG_LAYER
Makefile中如果指定了RESULT_ALL、RESULT_HWC_P、RESULT_CHW_P三个个中的一个,RNE库/RT库会进行相应的屏幕打印。如果指定多个,有效宏定义会根据RESULT_ALL、RESULT_HWC_P、RESULT_CHW_P的顺序确定。
如果用户不希望屏幕输出,则在Makefile中指定DISABLE_PRINT_DEBUG_LAYER宏,则RNE库\RT库均会关闭屏幕打印。
RNE模拟库中run_e2e_example.sh脚本执行时,输出的文件默认在 samples/rne_simple_forward 路径下。
备注
RT库目前只有TX5368x_TX5339x_TX5335x、TX5215x_TX5239x200_TX5239x220_TX5239x300、TX5336x_TX5256x和TX5112x_TX5239x201支持存储文件。
6.8.4. CMakeList与Makefile中连接库有哪些注意事项?
以TX5368AV200为例,由于librne_pal_linux_a53.a与librne_rt_g3.a中部分定义的符号相互引用,建议在连接的时候用“–start-group”和“–end-group”将库括起来。
Makefile:
Makefile注意事项
CMakeList:
CmakeList.txt注意事项
6.8.5. SDK接口调用性能优化建议?
网络输入数据类型为定点,不要为浮点。如果是浮点输入,可以将减均值除方差在量化完成。
TS_MPI_TRP_RNE_FillInputBlobs存在copy操作,用户在Linux平台接口可以选择TS_MPI_TRP_RNE_SetInputBlobsAddr直接进行网络blobs地址赋值,在其他平台接口,可以根据开源代码,自行优化实现。
Linux平台下的接口,SDK在初始化时,会根据权重在内部开辟空间,用户可以选择TS_MPI_TRP_RNE_SetWeightAddr直接进行网络权重地址赋值。
如果网络可以onceload, 初始化时将权重或者量化系数一次性加载进网络,可以优化推理性能。onceload 功能参见 编译仿真性能分析使用指南 Knight编译器使用说明章节。
TS_MPI_TRP_RNE_DumpOutputBlobs存在copy操作,用户可以根据开源代码,自行优化实现。
编译时使用“--input-indep 1”参数,模型每个input blob所需内存由用户分配控制,SDK调用时将RNE_BLOB_S的vpAddr指针指向该内存(用户通过TS_MPI_TRP_RNE_GetInputBlobs获取vpAddr指针直接赋值实现;或通过TS_MPI_TRP_RNE_SetInputBlobsAddr接口实现)。用户将前处理后的定点input data按HWCStride格式直接放入此内存,此时可以提高整个应用的性能。
6.8.6. 板端常见问题如何解决?
板端内存不够
上述问题需要放大rne_driver.ko的空间。
未注册RNE驱动
上述问题需要注册RNE驱动。
交叉编译工具链与板端不对应
上述问题需要确认SDK与板端是否对应。
存在未注册的软件层
上述问题需要确认软件层是否存在,或者是否注册。
芯片型号与cfg资源中的型号类型不一致
上述问题需要确认SDK目标型号与编译后的资源的型号是否正确。
驱动与内核不匹配
上述问题需要确认RNE的SDK与底层包是否匹配。
6.8.7. RNE运行时内存查看工具?
在RNE-RT-Lib/tools目录下,使用不同子目录来区分uclibc 和glibc, 工具名称为show_memory_size。
RNE-RT-Lib/tools/uclibc/show_memory_size
RNE-RT-Lib/tools/glibc/show_memory_size
打印输出信息格式如下
输出信息
此小工具是sdk维护内存申请释放计数,为了解决中途意外退出导致内存申请释放计数错乱的问题,建议在程序启动时检查特定文件(例如 /tmp/ts_npu_mem_ipc )的存在。如果文件存在,可以执行相应的处理操作,比如重启板子或者删除文件,以恢复内存申请释放计数的正确状态。
6.8.8. SDK使用注意事项?
在使用RNE_NET_S结构体之前,确保对其进行初始化操作,memset即可。
在多进程环境下,使用接口前必须通过调用
TS_MPI_TRP_RNE_GetAvailableCore或TS_MPI_TRP_RNE_GetExpectedCore函数来获取核心,其返回值需为非负数(即≥0)。确保线程一致性,
TS_MPI_TRP_RNE_GetAvailableCore的调用必须与TS_MPI_TRP_RNE_Forward的调用在同一个线程中。确保线程一致性,
TS_MPI_TRP_RNE_GetExpectedCore的调用必须与TS_MPI_TRP_RNE_Forward的调用在同一个线程中。单网络双核方式,每个队列有独立的地址空间,需要指定RNE_NET_S中的s32NTask=2。 若编译器实际未对模型分块,SDK实际是单核运行,因此会有Warning日志提醒:
Themodel actually runs on a single core.
对于绑定核操作,首先应将s32HoldCore置为1,表示占用npu,再调用
TS_MPI_TRP_RNE_GetExpectedCore去获取期望绑定的核,当占用当前核时,推理完成后,不会释放此核。