# 算法移植概述

#### **用户在基于1684进行算法编写的时候，一般会将流程划分为如下几个步骤：**

1. 视频/图片解码
2. 输入预处理
3. 模型推理
4. 输出后处理

而且，因为算法往往会包含多个不同模型的推理，所以，步骤2-4会根据需要反复执行多次。实际上，只针对神经网络运算进行加速，已经无法满足真实场景的需求。1684为了提高算法的运行效率，包含了若干硬件加速模块以及相应的软件接口库，分别针对以上几个步骤进行加速，协助用户开发高效的算法。

为了满足客户对不同风格接口的偏好，我们还对硬件加速接口库进行了多次封装，用户可以自行选取合适的接口库进行开发，具体总结如下：

| 算法步骤    | 支持硬件加速 | OPENCV接口库 | FFMPEG接口库 | Native接口库 |
| ------- | ------ | --------- | --------- | --------- |
| 视频/图片解码 | 支持     | Y         | Y         | BMCV(图片)  |
| 输入预处理   | 支持     | Y         | N         | BMCV      |
| 模型推理    | 支持     | N         | N         | BMruntime |
| 输出后处理   | 部分支持   | N         | N         | BMCV      |

值得一提的是，为了提高算法效率以及硬件特性的要求，用户在调用硬件加速接口的时候需要注意以下几个 方面，后续的文档会通过实例来进行具体阐述：

​ 1. 内存零copy

​ 2. 申请物理连续内存

​ 3. 将多个预处理步骤进行合并

​ 4. 凑4batch进行推理

#### **c/c++/python三种编程接口**

目前提供了三种编程接口的支持，BMRuntime、 BMCV、 BMLib三个模块提供给了c接口编程。python/C++接口是基于SAIL库实现的。SAIL 对 BMNNSDK2 中的 BMRuntime、 BMCV、 BMLib 进行了封装，将 BMNNSDK2中原有的“加载 bmodel 并驱动 TPU 推理”、“驱动 TPU 做图像处理”、“驱动 VPU 做图像和视频解码”等功能抽象成更为简单的 C++ 接口对外提供；并且支持使用 pybind11 再次封装，提供简洁的 python接口。目前， SAIL 模块中所有的类、枚举、函数都在“sail”名字空间下， 关于C++/python 接口详细内容请阅读 [**Sophon\_Inference\_zh.pdf**](https://sophon-edge.gitbook.io/sophon-inference/)
