新增pnna接口升级说明文档
本仓库 pnna2 是基于 pnna lite v2.1.6 驱动,对原 pnna lite v1.15.0 接口封装的升级版本。在保持原有部署流程(参考 yolov5s_demo.c)不变的前提下,对网络创建、Buffer 管理、多核调度及示例程序调用进行了系统性重构。
pnna lite v2.1.6
pnna lite v1.15.0
yolov5s_demo.c
v2.1.6 驱动支持多核 NPU 调度,旧接口未提供 core 选择能力,导致:
// 原接口 int app(app_ctx_t *model, void **output, buffer_t *input); // 新接口 int app(app_ctx_t *model, void **output, buffer_t *input, uint32_t core_index);
pnna_status_e ret = pnna_set_network( ctx->network, PNNA_NETWORK_PROP_SET_CORE_INDEX, core_index); if (ret != PNNA_SUCCESS) { log_error("Set core index fail, index = %d ", core_index); return -1; }
yolov4_tiny_demo.c
yolov8s_demo.c
统一增加:
uint32_t core_index = 0; // 默认单核
并透传至 app() → create_network() → pnna_set_network()。
app()
create_network()
pnna_set_network()
v2.1.6 pnna_create_network() 改为结构体参数方式,旧接口不兼容。
pnna_create_network()
pnna_create_network(nbg_addr, nbg_size, PNNA_CREATE_NETWORK_FROM_MEMORY, &ctx->network);
pnna_create_network_param_t net_param; net_param.nbg.type = PNNA_NETWORK_FROM_MEMORY; net_param.nbg.mem.addr = nbg_addr; net_param.nbg.mem.size = nbg_size; pnna_create_network(&net_param, sizeof(net_param), &ctx->network);
驱动 v2.1.6 修改 Buffer 参数结构体与内存要求。
pnna_buffer_create_params_t → pnna_buffer_param_t
isz = get_data_size(iqp->sizes, iqp->num_of_dims, iqp->data_format); param.src.alloc_mem.size = isz; param.src.alloc_mem.align = 64; param.device_index = 0; param.type = PNNA_BUFFER_CREATE_ALLOC_MEM; pnna_create_buffer(¶m, sizeof(param), &ctx->input_buffers[i]);
新驱动统一使用标准整数类型,旧接口存在编译警告。
int / unsigned int → uint32_t
zeroPoint → zero_point
sizes[6] → sizes[8]
uint32_t → unsigned long
-Wformat
-Wconversion
所有 Demo 程序已同步修改对以下文件的调用:
src/nn_api.c src/preprocess.c src/quantize.c
core_index
示例:
ret = app(&ctx, output, input, core_index);
新版 SDK 统一量化函数参数类型。
// 原 int quantize_input(float *src, int size, int8_t *dst); // 新 int quantize_input(float *src, uint32_t size, int8_t *dst);
Demo 修改:
quantize_input(input, (uint32_t)input_size, qbuf);
图像尺寸与 tensor size 类型统一。
// 原 int preprocess_image(uint8_t *img, int w, int h); // 新 int preprocess_image(uint8_t *img, uint32_t w, uint32_t h);
pnna_close()
pnna_destroy()
if (isz < 0) { log_error("get input %d tensor data size failed", i); return -1; }
examples/yolov5s_demo.c examples/yolov4_tiny_demo.c examples/yolov8s_demo.c src/nn_api.c src/preprocess.c src/quantize.c
从 v1.15.0 迁移至 pnna2 需要:
pnna_create_network_param_t
pnna_buffer_param_t
作者 {{xunyingya}}
基于pnna驱动v2.1.6版本的API及其应用示例
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号 京公网安备 11010802032778号
PNNA2 接口升级说明(pnna lite v1.15.0 → v2.1.6)
本仓库 pnna2 是基于
pnna lite v2.1.6驱动,对原pnna lite v1.15.0接口封装的升级版本。在保持原有部署流程(参考
yolov5s_demo.c)不变的前提下,对网络创建、Buffer 管理、多核调度及示例程序调用进行了系统性重构。1. 核心功能变更
1.1 新增多核 NPU 调度支持
问题原因
v2.1.6 驱动支持多核 NPU 调度,旧接口未提供 core 选择能力,导致:
修改内容
接口变更
推理前设置 core
示例程序修改
yolov5s_demo.cyolov4_tiny_demo.cyolov8s_demo.c统一增加:
并透传至
app()→create_network()→pnna_set_network()。1.2 网络创建流程重构
问题原因
v2.1.6
pnna_create_network()改为结构体参数方式,旧接口不兼容。修改内容
旧方式
新方式
效果
1.3 Buffer 管理优化
问题原因
驱动 v2.1.6 修改 Buffer 参数结构体与内存要求。
修改内容
结构体替换
新 Buffer 创建流程
效果
1.4 数据类型与命名规范统一
问题原因
新驱动统一使用标准整数类型,旧接口存在编译警告。
修改内容
int / unsigned int → uint32_tzeroPoint → zero_pointsizes[6] → sizes[8]uint32_t → unsigned long效果
-Wformat/-Wconversion编译警告2. 示例程序同步修改
所有 Demo 程序已同步修改对以下文件的调用:
2.1 nn_api.c 调用更新
core_index参数create_network()参数结构体示例:
2.2 quantize.c 调用更新
修改原因
新版 SDK 统一量化函数参数类型。
修改示例
Demo 修改:
2.3 preprocess.c 调用更新
修改原因
图像尺寸与 tensor size 类型统一。
修改示例
3. 错误处理与资源管理改进
修改内容
pnna_close()检查pnna_destroy()返回值示例:
4. 影响文件列表
5. 用户迁移指南
从 v1.15.0 迁移至 pnna2 需要:
app()增加core_indexpnna_create_network_param_tpnna_buffer_param_t