4.2. 重要概念
4.2.1. 工作模式
SOPHON BM168X系列产品涵盖了从末端到边缘到中枢的多种产品形态,可以支持两种不同的工作模式,分别对应不同的产品形态,具体信息如下:
SoC模式 |
PCIe模式 |
|
运行模式 |
独立主机,微服务器形态 |
附属硬件,PCIe加速卡形态 |
对外IO方式 |
千兆以太网 |
PCIe接口 |
对应产品 |
微服务器/模组 |
PCIe加速卡 |
目前,BM1688/CV186AH系列相关产品仅支持SoC模式
4.2.2. 硬件内存
内存是BM168X应用调试中经常会涉及的重要概念,特别地,有以下3个概念需要特别区分清楚:Global Memory、Host Memory、Device Memory。
对于BM1688/CV186AH的SoC工作模式,三种内存的解释如下
全局内存(Global Memory): 指处理器的片外存储DDR
设备内存(Device Memory) :划分给Tensor Computing Processor/VPSS的内存
系统内存(Host Memory) :划分给主控Cortex A53的内存
三者关系可以简单的理解为 全局内存 = 设备内存 + 系统内存.
内存同步问题是后续应用调试中经常会遇到的比较隐蔽的重要问题。我们在sophon-opencv和sophon-ffmpeg两个框架内都提供了内存同步操作的函数;而BMCV API只面向设备内存操作,因此不存在内存同步的问题,在调用BMCV API前,需要将输入数据在设备内存上准备好。
我们在BMLib中提供了接口,可以实现Host Memory和Global Memory之间、Global Memory内部以及不同设备的Global Memory之间的数据搬运。
更多详细信息请参考《 BMLib开发参考手册 》和《 多媒体开发参考手册 》。
4.2.3. BModel
BModel: 是一种面向算能智能视觉深度学习处理器的 神经网络模型文件格式,其中包含目标网络的权重(weight)、指令流等等。
Stage: 支持将同一个网络的不同batch size的模型combine为一个BModel;同一个网络的不同batch size的输入对应着不同的stage,推理时BMRuntime会根据输入shape的大小自动选择相应stage的模型。也支持将不同的网络combine为一个BModel,通过网络名称来获取不同的网络。
动态编译和静态编译: 支持模型的动态编译和静态编译,可在转换模型时通过参数设定。动态编译的BModel,在Runtime时支持任意小于编译时设置的shape的输入shape;静态编译的BModel,在Runtime时只支持编译时所设置的shape。
备注
优先使用静态编译的模型: 动态编译模型运行时需要BM168X内微控制器ARM9的参与,实时地根据实际输入shape,动态生成智能视觉深度学习处理器运行指令。因此,动态编译的模型执行效率要比静态编译的模型低。若可以,应当优先使用静态编译的模型或支持多种输入shape的静态编译模型。
4.2.4. bm_image
1typedef enum bm_image_format_ext_{
2 FORMAT_YUV420P,
3 FORMAT_YUV422P,
4 FORMAT_YUV444P,
5 FORMAT_NV12,
6 FORMAT_NV21,
7 FORMAT_NV16,
8 FORMAT_NV61,
9 FORMAT_RGB_PLANAR,
10 FORMAT_BGR_PLANAR,
11 FORMAT_RGB_PACKED,
12 FORMAT_BGR_PACKED,
13 PORMAT_RGBP_SEPARATE,
14 PORMAT_BGRP_SEPARATE,
15 FORMAT_GRAY,
16 FORMAT_COMPRESSED
17} bm_image_format_ext;
18
19typedef enum bm_image_data_format_ext_{
20 DATA_TYPE_EXT_FLOAT32,
21 DATA_TYPE_EXT_1N_BYTE,
22 DATA_TYPE_EXT_4N_BYTE,
23 DATA_TYPE_EXT_1N_BYTE_SIGNED,
24 DATA_TYPE_EXT_4N_BYTE_SIGNED,
25}bm_image_data_format_ext;
26
27// bm_image结构体定义如下
28struct bm_image {
29 int width;
30 int height;
31 bm_image_format_ext image_format;
32 bm_data_format_ext data_type;
33 bm_image_private* image_private;
34};
BMCV API均是围绕 bm_image 来进行的,一个 bm_image 对象对应于一张图片。
用户通过 bm_image_create 构建 bm_image 对象,attach到device memory;使用完需要调用 bm_image_destroy 销毁;手动attach到device memory的还需要手动释放。
不同BMCV API支持的image_format和data_type不同,注意格式要求,必要时需要进行格式转换。
更多详细信息请参考《算能边缘产品BMCV开发参考指南》。
另外,SAIL库中将bm_image封装为BMImage,相关信息请参考doc目录下的《sophon-sail_zh》。