# 1.3 基本概念介绍

### 1.3.1 工作模式

算丰BM1684系列芯片产品涵盖了从末端到边缘到中枢的多种产品形态，可以支持两种不同的工作模式，分别对应不同的产品形态，具体信息如下：

| BM1684     | **SoC模式**                   | **PCIE模式**                  |
| ---------- | --------------------------- | --------------------------- |
| **独立运行**   | 是，BM1684即为独立主机，算法运行在BM1684上 | 否，算法部署在X86或ARM主机，推理运行在PCIE卡 |
| **对外IO方式** | 千兆以太网                       | PCIE接口                      |
| **对应产品**   | SE5/SM5                     | SC5/SC5H/SC5+               |

​ BM1684的软件接口在两种工作模式下是基本相同的，BMNNSDK2同时支持两种模式，此外还提供了CModel模式作为芯片的软件模拟器，支持在没有相关硬件设备的情况下实现模型转换、部分算法验证等功能。本文在进行实例演示的时候，会进行相应的标注。

### 1.3.2 硬件内存

内存是BM1684应用调试中经常会涉及的重要概念，特别地，有以下3个概念需要特别区分清楚：Global Memory、Host Memory、Device Memory。

* **全局内存（Global Memory）**：指BM1684的片外存储DDR，通常为12GB，最大支持定制为16GB。
* **设备内存（Device Memory）和系统内存（Host Memory）**：根据BM168x产品类型或工作模式的不同，设备内存和系统内存具有不同的含义：

|                   | **Soc模式**                                                 | **PCIE模式**                                                 |
| ----------------- | --------------------------------------------------------- | ---------------------------------------------------------- |
| **产品**            | SM5/SE5                                                   | SC5/SC5H/SC5+                                              |
| **Global Memory** | <p>4GB A53专用 +</p><p>4GB TPU专用 + </p><p>4GB VPP/VPU专用</p> | <p>4GB TPU专用 + </p><p>4GB VPU专用 + </p><p>4GB VPP/A53专用</p> |
| **Host Memory**   | 芯片上主控Cortex A53的内存                                        | 主机内存                                                       |
| **Device Memory** | 划分给TPU/VPP/VPU的设备内存                                       | PCIE板卡上的物理内存（Global Memory）                                |

内存同步问题是后续应用调试中经常会遇到的比较隐蔽的重要问题。我们在BM-OpenCV和BM-FFmpeg两个框架内都提供了内存同步操作的函数；而BMCV API只面向设备内存操作，因此不存在内存同步的问题，在调用BMCV API前，需要将输入数据在设备内存上准备好；我们在BMLib中提供了接口，可以实现Host Memory和Global Memory之间、Global Memory内部以及不同设备的Global Memory之间的数据搬运。更多详细信息请参考[《BMLib用户开发手册》](https://doc.sophgo.com/docs/2.7.0/docs_latest_release/bmlib/html/index.html)和[《多媒体用户开发手册》](https://doc.sophgo.com/docs/2.7.0/docs_latest_release/multimedia_guide/html/index.html)。

### 1.3.3 BModel

**BModel：**&#x662F;一种面向算能TPU处理器的深度神经网络模型文件格式，其中包含目标网络的权重（weight）、TPU指令流等等。

**Stage：**&#x652F;持将同一个网络的不同batch size的模型combine为一个BModel；同一个网络的不同batch size的输入对应着不同的stage，推理时BMRuntime会根据输入shape 的大小自动选择相应stage的模型。也支持将不同的网络combine为一个BModel，通过网络名称来获取不同的网络。

**动态编译和静态编译：**&#x652F;持模型的动态编译和静态编译，可在转换模型时通过参数设定。动态编译的BModel，在Runtime时支持任意小于编译时设置的shape的输入shape；静态编译的BModel，在Runtime时只支持编译时所设置的shape。

{% hint style="info" %}
**优先使用静态编译的模型：**

动态编译模型运行时需要BM1684内微控制器ARM9的参与，实时地根据实际输入shape，动态生成TPU运行指令。因此，动态编译的模型执行效率要比静态编译的模型低。若可以，应当优先使用静态编译的模型或支持多种输入shape的静态编译模型。
{% endhint %}

### 1.3.4 bm\_image

```cpp
typedef enum bm_image_format_ext_{
    FORMAT_YUV420P,
    FORMAT_YUV422P,
    FORMAT_YUV444P,
    FORMAT_NV12,
    FORMAT_NV21,
    FORMAT_NV16,
    FORMAT_NV61,
    FORMAT_RGB_PLANAR,
    FORMAT_BGR_PLANAR,
    FORMAT_RGB_PACKED,
    FORMAT_BGR_PACKED,
    PORMAT_RGBP_SEPARATE,
    PORMAT_BGRP_SEPARATE,
    FORMAT_GRAY,
    FORMAT_COMPRESSED
} bm_image_format_ext;

typedef enum bm_image_data_format_ext_{
    DATA_TYPE_EXT_FLOAT32,
    DATA_TYPE_EXT_1N_BYTE,
    DATA_TYPE_EXT_4N_BYTE,
    DATA_TYPE_EXT_1N_BYTE_SIGNED,
    DATA_TYPE_EXT_4N_BYTE_SIGNED,
}bm_image_data_format_ext;

// bm_image结构体定义如下
struct bm_image {
    int width;
    int height;
    bm_image_format_ext image_format;
    bm_data_format_ext data_type;
    bm_image_private* image_private;
};
```

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用户开发手册》](https://doc.sophgo.com/docs/2.7.0/docs_latest_release/bmcv/html/index.html)*。*

*SAIL库中将bm\_image封装为了BMImage，*&#x76F8;关信息请参考[《*SAIL用户开发手册*》](https://doc.sophgo.com/docs/2.7.0/docs_latest_release/sophon-inference/html/index.html)。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://sophgo-doc.gitbook.io/bmnnsdk2-bm1684/bmnnsdk2/important.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
