NPU 模型的 API 部署流程*
1. 使用 NPU*
通过NPU编译器生成模型文件后,需要把模型文件部署到板子上。 NPU编译器生成的模型文件为 C 文件,配合我们提供的 API 接口,可以实现模型在板子上的运行。
1.1 调用 API 流程*
- 打开 SNPU
- 加载模型和输入数据,运行模型,得到输出数据。
- 关闭 SNPU
gx_snpu.h
/**
* @brief 初始化snpu
*
*
* @return snpu 初始化成功与否
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_init(void);
/**
* @brief 关闭snpu
*
*
* @return snpu 关闭成功与否
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_exit(void);
/**
* @brief snpu 输入和输出的数据格式
*/
typedef short GX_SNPU_FLOAT;
/**
* @brief snpu工作状态
*/
typedef enum {
GX_SNPU_IDLE, /**< 空闲状态*/
GX_SNPU_BUSY, /**< 工作忙状态*/
GX_SNPU_STALL, /**< 停滞状态*/
} GX_SNPU_STATE;
/**
* @brief snpu 回调函数,任务处理完后,中断里面执行该函数
*/
typedef int (*GX_SNPU_CALLBACK)(int module_id, GX_SNPU_STATE state, void *private_data);
/**
* @brief snpu 工作任务
*/
typedef struct {
int module_id; /**< 模块标识号 module id defined by programmer*/
void *data; /**< 临时数据内容区域 data_content in model.h*/
void *input; /**< 模型输入数据 input in model.h*/
void *output; /**< 模型输出数据 output in model.h*/
void *cmd; /**< 指令内容区域 cmd_content in model.h*/
void *weight; /**< 权重内容区域 weight_content in model.h*/
void *cache; /**< 权重缓存区域 cache_content in model.h*/
} GX_SNPU_TASK;
/**
* FFT 算子类型
*/
typedef enum {
GX_SNPU_REAL_FFT_256 = 0x00, /*!< 256点实数FFT 输入256个short,输出258个short */
GX_SNPU_REAL_IFFT_256 = 0x01, /*!< 256点实数IFFT 输入258个short,输出256个int */
GX_SNPU_CPLX_FFT_256 = 0x02, /*!< 256点复数FFT 输入512个short,输出512个short */
GX_SNPU_CPLX_IFFT_256 = 0x03, /*!< 256点复数IFFT 输入512个short,输出512个short */
GX_SNPU_REAL_FFT_512 = 0x04, /*!< 512点实数FFT 输入512个short,输出514个short */
GX_SNPU_REAL_IFFT_512 = 0x05, /*!< 512点实数IFFT 输入514个short,输出512个int */
GX_SNPU_CPLX_FFT_512 = 0x06, /*!< 512点复数FFT 输入1024个short,输出1024个short */
GX_SNPU_CPLX_IFFT_512 = 0x07, /*!< 512点复数IFFT 输入1024个short,输出1024个short */
} GX_SNPU_FFT_TYPE;
/**
* FFT 算子信息
*/
typedef struct {
int ifft_input_shift; /*!< 外部配置的ifft数据偏移,有符号数,正数为右移,负数为左移*/
unsigned int phy_fft_src_addr; /*!< 计算数据输入地址, 4字节对齐 */
unsigned int phy_fft_dst_addr; /*!< 计算结果目的地址, 4字节对齐 */
GX_SNPU_FFT_TYPE fft_type; /*!< 算子类型 */
} GX_SNPU_FFT_INFO;
/**
* @brief 异步方式运行一个工作任务
*
* @param task 工作任务, 详细说明请参考 gxdocref GX_SNPU_TASK
* @param callback 回调函数,任务处理完后,中断里面执行该函数, 详细说明请参考 gxdocref GX_SNPU_CALLBACK
* @param private_data 回调函数的参数
*
* @return snpu 任务工作状态
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_run_task(GX_SNPU_TASK *task, GX_SNPU_CALLBACK callback, void *private_data);
/**
* @brief 同步方式运行一个工作任务
*
* @param task 工作任务, 详细说明请参考 gxdocref GX_SNPU_TASK
*
* @return snpu 任务工作状态
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_run_task_sync(GX_SNPU_TASK *task);
/**
* @brief 同步方式运行FFT算子,运行该函数前需要先调用gx_snpu_pause,完成后需调用gx_snpu_resume才能恢复模型运行
*
* @param fft_info FFT算子的信息, 详细说明请参考 gxdocref GX_SNPU_FFT_INFO
* @param out_shift FFT计算输出是short类型,若要得到float32,需做out_shift移位,shift为正,表示左移;shift为负,表示右移;
*
* @return snpu 任务工作状态
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_run_fft(GX_SNPU_FFT_INFO *fft_info, int *out_shift);
/**
* @brief snpu 获得工作状态
*
* @return snpu 任务工作状态
* @retval GX_SNPU_IDLE 空闲状态
* @retval GX_SNPU_BUSY 工作忙状态
* @retval GX_SNPU_STALL 停滞状态
*/
GX_SNPU_STATE gx_snpu_get_state(void);
/**
* @brief 暂停snpu运行
*
* @return snpu 任务工作状态
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_pause(void);
/**
* @brief 恢复snpu运行
*
* @return snpu 任务工作状态
* @retval 0 正常
* @retval -1 失败
*/
int gx_snpu_resume(void);