MC3302_SDK_V1.1.9_202507281.../media/mpp/include/fhhcp/npu.h

574 lines
24 KiB
C
Raw Normal View History

2025-11-11 04:08:31 +00:00
#ifndef TY_NPU_H_
#define TY_NPU_H_
#include "base.h"
#ifdef __cplusplus
extern "C" {
#endif
#if (defined DP2000_300 || defined CPU_SIMU_300)
#define TY_NU_MAX_FREQ 792
#elif (defined DP2000_320 || defined CPU_SIMU_320)
#if (defined DP2000_310 || defined CPU_SIMU_310)
#define TY_NU_MAX_FREQ 743.1
#elif (defined DP2000_315 || defined CPU_SIMU_315)
#define TY_NU_MAX_FREQ 768
#else
#define TY_NU_MAX_FREQ 768
#endif
#endif
#define TY_VU_MAX_FREQ (TY_NU_MAX_FREQ/2)
#define TY_NPU_MODEL_VERSION_LEN 64
#define TY_NPU_MODEL_COMPILE_DATE_LEN 32
#define TY_NPU_NU_SUPPORT_DATA_FORMAT_LEN 256
#define TY_NPU_VU_SUPPORT_DATA_FORMAT_LEN 256
#define TY_NPU_PROFILE_MEM_THROUGHPUT_TYPE_NUM 8
#define TY_NPU_PROFILE_UNVALID -1
typedef struct TY_ModelIODesc{
uint32_t inputNum;
uint32_t outputNum;
T_TY_BlobDesc in[TY_NPU_MODLE_BLOB_MAX_INPUT_NUM];
T_TY_BlobDesc out[TY_NPU_MODLE_BLOB_MAX_OUTPUT_NUM];
}T_TY_ModelIODesc;
typedef struct TY_ModelCommonInfo{
char version[TY_NPU_MODEL_VERSION_LEN];
char compileDate[TY_NPU_MODEL_COMPILE_DATE_LEN];
}T_TY_ModelCommonInfo;
typedef struct TY_ModelDesc{
T_TY_ModelIODesc ioDesc;
T_TY_ModelCommonInfo info;
}T_TY_ModelDesc;
typedef struct TY_ModelCfgParam{
int32_t reserve;
}T_TY_ModelCfgParam;
typedef struct TY_TaskCfgParam{
int32_t batchNum;
int32_t reserve;
}T_TY_TaskCfgParam;
typedef struct TY_TaskInput{
T_TY_Mem dataIn;
T_TY_BlobDesc descIn;//当T_ModelDesc.in[i].type==E_BLOB_IMAGE_WITH_PRE_PROC时需要用户根据输入图像填写此参数
//用户根据输入图像赋值dataIn.addr和size
}T_TY_TaskInput;
typedef struct TY_TaskOutput{
T_TY_Mem dataOut;
}T_TY_TaskOutput;
typedef struct TY_OpWeightInfo{
int32_t reserved;
}T_TY_OpWeightInfo;
typedef struct TY_OpQuaInfo{
int32_t reserved;
}T_TY_OpWQuaInfo;
typedef struct TY_OpDesc{
char name[TY_NPU_OPTYPE_STRING_MAX_LEN];
int32_t id;
int32_t numInputs;
int32_t numOutputs;
T_TY_BlobDesc inputDesc[TY_NPU_MODLE_BLOB_MAX_INPUT_NUM];
T_TY_BlobDesc outputDesc[TY_NPU_MODLE_BLOB_MAX_OUTPUT_NUM];
T_TY_OpWeightInfo weightInfo; /* op 参数信息 */
T_TY_OpWQuaInfo quaInfo; /* op 量化信息 */
}T_TY_OpDesc;
typedef struct TY_Profile{
E_TY_EngineType type;
/* 根据type类型不同如下信息可能存在部分有效无效值设置为 TY_NPU_PROFILE_UNVALID (-1) */
float executeTime; /* 所有type均有效 单位ms */
float macUtilRate; /* E_AI_NPU有效 范围:[0,1] */
float ddrBandWidth; /* E_AI_NPU有效 MB/s */
uint64_t cycles; /* E_AI_NPU有效 时钟周期 */
uint64_t memThroughput[TY_NPU_PROFILE_MEM_THROUGHPUT_TYPE_NUM]; /* E_AI_NPU有效, 默认0为ddr吞吐其他待扩展 */
}T_TY_Profile;
typedef struct TY_OpProfileInfo{
char opName[TY_NPU_OPTYPE_STRING_MAX_LEN];
T_TY_Profile profile;
}T_TY_OpProfileInfo;
typedef struct TY_NpuHwCapacity{
uint32_t nuCurrFreq; /* Mhz */
uint32_t nuMaxFreq; /* Mhz */
uint32_t vuCurrFreq; /* Mhz */
uint32_t vuMaxFreq; /* Mhz */
float nuTops; /* nu 算力 */
float vuTops; /* vu 算力 */
char nuDataFmt[TY_NPU_NU_SUPPORT_DATA_FORMAT_LEN];
char vuDataFmt[TY_NPU_VU_SUPPORT_DATA_FORMAT_LEN];
}T_TY_NpuHwCapacity;
typedef struct TY_NpuDrvCapacity{
uint32_t taskQueDepth; /* 可配置的队列深度信息 */
}T_TY_NpuDrvCapacity;
typedef struct TY_NpuCapacityInfo{
T_TY_NpuHwCapacity hardware;
T_TY_NpuDrvCapacity driver;
}T_TY_NpuCapacityInfo;
typedef struct TY_NpuPayLoadInfo{
uint32_t waitTaskCnt; /* 等待执行的task数目 */
uint32_t resTaskCnt; /* 剩余可用的task数目 */
uint32_t allTaskCnt; /* 总计所有的task数目 */
float rate; /* 负载百分比 */
}T_TY_NpuPayLoadInfo;
/*
dump功能
1. & debug信息
2. 使
a. dump执行效率低TaskHandle同时调度执行latency严重
b. dump和profile功能二选一dump会导致profile数据不准
*/
typedef struct TY_OpDumpInfo{
char name[TY_NPU_OPTYPE_STRING_MAX_LEN];
/* dump typeMask:
1 ==> enable; 0 ==> disable
bit | 31~4 | 3 | 2 | 1 | 0 |
type | reserved | QUA | WEIGHT | OUT | IN |
*/
int32_t typeMask;
int32_t numInput; /* op输入数目, 可以不填 */
int32_t numOutput; /* op输出数目, 可以不填 */
/*
DUMP内存空间定义
1.
2.
*/
T_TY_Mem weight;
T_TY_Mem quanti;
/*
inputs & outputs
1. TY_NPU_GetOpListInfo()op的inputDesc & outputDesc数组
2. inputDesc & outputDesc的顺序来填写inputs & outputs memInfo
*/
T_TY_Mem inputs[TY_NPU_MODLE_BLOB_MAX_INPUT_NUM];
T_TY_Mem outputs[TY_NPU_MODLE_BLOB_MAX_OUTPUT_NUM];
}T_TY_OpDumpInfo;
typedef struct TY_Mat{
uint32_t rows;
uint32_t cols;
E_TY_DataType dataType;
uint32_t rowStride; //以字节为单位当前仅支持rowStride=cols*sizeof(dataType)
T_TY_Mem mem;
uint32_t reserved[2];
}T_TY_Mat;
typedef struct TY_MatMulCfg{ //AxB=C, A维度m行k列B维度k行n列C维度m行n列
uint32_t maxM;//支持的最大m
uint32_t maxN;//支持的最大n
uint32_t maxK;//支持的最大k
uint32_t priority; //0:普通优先级1:相对NPU_Forward高优先级
uint32_t reserved[2];
}T_TY_MatMulCfg;
typedef void* TY_NPU_MODEL_HANDLE;
typedef void* TY_NPU_TASK_HANDLE;
typedef uint64_t TY_NPU_NN_HANDLE;
typedef void* TY_NPU_MATMUL_HANDLE;
/*!
* @brief NPU系统初始化
* @note
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_SysInit(void);
/*!
* @brief NPU系统去初始化
* @note NPU_SysInit配对使用
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_SysExit(void);
/*!
* @brief NPU接口版本信息
* @param [out] majorVersion major版本
* @param [out] minorVersion minor版本
* @param [out] patchVersion patch版本
* @note x.y.z
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetVersion(int32_t *majorVersion,
int32_t *minorVersion,
int32_t *patchVersion);
/*!
* @brief NPU模型所需内存大小
* @param [in] model 线NPU模型二进制文件数据起始指针
* @param [in] modelSize 线
* @param [out] modelMem allocInfo成员有效
* mem成员
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetModelMemSize(const void *model,
int32_t modelSize,
T_TY_MemSegmentInfo *modelMemInfo);
/*!
* @brief NPU模型实例
* @param [in] model 线NPU模型二进制文件数据起始指针
* @param [in] modelSize 线
* @param [in] configParam
* @param [in] modelMem TY_NPU_GetModelMemSize
* @param [out] desc 线
* @param [out] modelHandle task
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_CreateModel(const void *model,
int32_t modelSize,
const T_TY_ModelCfgParam *configParam,
const T_TY_MemSegmentInfo *modelMem,
T_TY_ModelDesc *desc,
TY_NPU_MODEL_HANDLE *modelHandle);
/*!
* @brief NPU模型实例NPU内部cpy &
* @param [in] model MemSegMent
* 1.
* 2. 32 Bytes
* @param [in] configParam
* @param [in] modelMem nullptr
* @param [out] desc 线
* @param [out] modelHandle task
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_CreateModelFromPhyMem(const T_TY_MemSegmentInfo *model,
const T_TY_ModelCfgParam *configParam,
const T_TY_MemSegmentInfo *modelMem,
T_TY_ModelDesc *desc,
TY_NPU_MODEL_HANDLE *modelHandle);
/*!
* @brief NPU子图运行所需的内存大小
* @param [in] modelHandle
* @param [in] configParam
* @param [out] taskMem allocInfo成员有效
* mem成员task
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetTaskMemSize(const TY_NPU_MODEL_HANDLE modelHandle,
const T_TY_TaskCfgParam *configParam,
T_TY_MemSegmentInfo *taskMem);
/*!
* @brief NPU子图的一个运行实例
* @param [in] modelHandle
* @param [in] configParam
* @param [in] taskMem TY_NPU_GetTaskMemSize
* @param [out] taskHandle task
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_CreateTask(const TY_NPU_MODEL_HANDLE modelHandle,
const T_TY_TaskCfgParam *configParam,
const T_TY_MemSegmentInfo *taskMem,
TY_NPU_TASK_HANDLE *taskHandle);
/*!
* @brief NPU子图同步推理
* @param [in] taskHandle
* @param [in] npuId task运行的NPUNPU平台适用
* @param [in] inputNum
* @param [in] taskInput TY_NPU_CreateModel接口获取的模型输入描述信息
* @param [in] outputNum
* @param [in] taskOutput TY_NPU_CreateModel接口获取的模型输出描述信息
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_Forward(const TY_NPU_TASK_HANDLE taskHandle,
E_TY_NpuID npuId,
uint32_t inputNum,
const T_TY_TaskInput taskInput[],
uint32_t outputNum,
const T_TY_TaskOutput taskOutput[]);
/*!
* @brief NPU子图同步推理
* @param [in] taskHandle
* @param [in] npuId task运行的NPUNPU平台适用
* @param [in] inputNum
* @param [in] taskInput TY_NPU_CreateModel接口获取的模型输入描述信息
* @param [in] outputNum
* @param [in] taskOutput TY_NPU_CreateModel接口获取的模型输出描述信息
* @param [in] priority 0 1
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ForwardPriority(const TY_NPU_TASK_HANDLE taskHandle,
E_TY_NpuID npuId,
uint32_t inputNum,
const T_TY_TaskInput taskInput[],
uint32_t outputNum,
const T_TY_TaskOutput taskOutput[],
uint32_t priority);
/*!
* @brief NPU子图异步推理TY_NPU_Query接口查询是否推理完
* @param [in] taskHandle
* @param [in] npuId task运行的NPUNPU平台适用
* @param [in] inputNum
* @param [in] taskInput TY_NPU_CreateModel接口获取的模型输入描述信息
* @param [in] outputNum
* @param [in] taskOutput TY_NPU_CreateModel接口获取的模型输出描述信息
* @param [out] nnHandle handle信息
*
*
0
* 使taskHandle进行多个异步推理时taskInputtaskOutput应分别分配内存
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ForwardAsync(const TY_NPU_TASK_HANDLE taskHandle,
E_TY_NpuID npuId,
uint32_t inputNum,
const T_TY_TaskInput taskInput[],
uint32_t outputNum,
const T_TY_TaskOutput taskOutput[],
TY_NPU_NN_HANDLE* nnHandle);
/*!
* @brief NPU子图异步推理TY_NPU_Query接口查询是否推理完
* @param [in] taskHandle
* @param [in] npuId task运行的NPUNPU平台适用
* @param [in] inputNum
* @param [in] taskInput TY_NPU_CreateModel接口获取的模型输入描述信息
* @param [in] outputNum
* @param [in] taskOutput TY_NPU_CreateModel接口获取的模型输出描述信息
* @param [out] nnHandle handle信息
* @param [in] priority 0 1
*
*
0
* 使taskHandle进行多个异步推理时taskInputtaskOutput应分别分配内存
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ForwardAsyncPriority(const TY_NPU_TASK_HANDLE taskHandle,
E_TY_NpuID npuId,
uint32_t inputNum,
const T_TY_TaskInput taskInput[],
uint32_t outputNum,
const T_TY_TaskOutput taskOutput[],
TY_NPU_NN_HANDLE* nnHandle,
uint32_t priority);
/*!
* @brief NPU指定推理任务是否完成
* @param [in] npuId NPU编号
* @param [in] nnHandle handleTY_NPU_ForwardAsync接口
* @param [in] status 10
* @param [out] isBlock 10
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_Query( E_TY_NpuID npuId,
TY_NPU_NN_HANDLE nnHandle, E_TY_Bool *status, int32_t isBlock);
/*!
* @brief
* @param [in] taskHandle
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ReleaseTask(const TY_NPU_TASK_HANDLE taskHandle);
/*!
* @brief
* @param [in] modelHandle
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ReleaseModel(const TY_NPU_TASK_HANDLE modelHandle);
/*!
* @brief (m,n,k)Memory大小
* axb = ca维度m行k列b矩阵维度k行n列c矩阵维度m行n列
* @param [in] matMulCfg m,n,k值
* @param [out] matMulMemInfo MatMul算子需要的内存信息T_MemSegmentInfo结构中allocInfo成员申请对应内存
* T_MemSegmentInfo结构中mem成员TY_NPU_CreateMatMul创建MatMul算子库
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetMatMulMemSize(const T_TY_MatMulCfg *matMulCfg,
T_TY_MemSegmentInfo *matMulMemInfo);
/*!
* @brief MatMul算子库
* axb = ca维度m行k列b矩阵维度k行n列c矩阵维度m行n列
* @param [in] matMulCfg m,n,k值TY_NPU_GetMatMulMemSize入参一致
* @param [in] matMulMemInfo MatMul算子需要的内存信息TY_NPU_GetMatMulMemSize
* @param [out] handle
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_CreateMatMul(const T_TY_MatMulCfg *matMulCfg,
const T_TY_MemSegmentInfo *matMulMemInfo, TY_NPU_MATMUL_HANDLE *handle);
/*!
* @brief
* : c = a x Transpose(b), a,b,c均为矩阵;
* @param [in] handle handleTY_NPU_CreateMatMul
* @param [in] npuId NPUNPU平台适用
* @param [in] srcA a矩阵, , m行k列, int8_t
* @param [in] srcB b矩阵的转置, , n行k列, int8_t
* @param [out] dstC c矩阵, , m行n列, int32_t
* @param [out] nnHandle handleisBlock为1时nullptr
* @param [in] isBlock 10TY_NPU_Query获取任务完成状态
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_MatMul(const TY_NPU_MATMUL_HANDLE handle, E_TY_NpuID npuId,
const T_TY_Mat* srcA, const T_TY_Mat* srcB, T_TY_Mat* dstC,
TY_NPU_NN_HANDLE *nnHandle, int32_t isBlock);
/*!
* @brief ,TY_NPU_SysExit之前调用TY_NPU_MatMul任务已完成
* @param [in] handle TY_NPU_CreateMatMul
*
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_ReleaseMatMul(const TY_NPU_MATMUL_HANDLE handle);
/*!
* @brief NPU模型fusion-op算子数目
* @param [in] modelHandle handleTY_NPU_CreateModel()
* @param [out] opNum fusion-op算子数目npucpu算子)
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetOpNum(
const TY_NPU_MODEL_HANDLE modelHandle,
int32_t *opNum);
/*!
* @brief NPU模型fusion-op算子信息
* @param [in] modelHandle handleTY_NPU_CreateModel()
* @param [in] opNum fusion-op算子数目
* @param [out] opDescList
* [opNum]
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetOpListInfo(
const TY_NPU_MODEL_HANDLE modelHandle,
int32_t opNum, /* 输入op数目如果小于子图内op的数目取前opNum个 */
T_TY_OpDesc opDescList[] /* 外部申请空间 */
);
/*!
* @brief NPU能力信息
* @param [in] id, npu id信息
* @param [out] capacity npu能力信息
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_QueryCapacity(
E_TY_NpuID id,
T_TY_NpuCapacityInfo *capacity);
/*!
* @brief NPU负载信息
* @param [in] id, npu id信息
* @param [out] capacity npu能力信息
* @note rate超过一定门限后task阻塞
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_QueryLoad(
E_TY_NpuID id,
T_TY_NpuPayLoadInfo *load);
/*!
* @brief profile统计功能
* @param [in] modelHandle handleTY_NPU_CreateModel()
* @note modelHandle关联的所有taskHandle均产生profile信息
* 1. Create的TaskHandle均有效profile
* 2. 1
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_SetProfileOn(const TY_NPU_MODEL_HANDLE modelHandle);
/*!
* @brief profile统计功能绑定
* @param [in] modelHandle handleTY_NPU_CreateModel()
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_SetProfileOff(const TY_NPU_MODEL_HANDLE modelHandle);
/*!
* @brief taskHandle对应的profile信息task执行完毕后调用
* @param [in] taskHandle handleTY_NPU_CreateTask()
* @param [in] opProfileNum fusion-op数目TY_NPU_GetOpNum()
* @param [out] outputProfileNum profile输出的fusion-op数目
* @param [out] opProfiles op profile信息[opProfileNum]
opProfileNum*sizeof(TY_OpProfileInfo),
* @note task profile只记录最近一次的TY_NPU_Forward()taskHandle不同TY_NPU_Forward()
* TY_NPU_Forward()TY_NPU_GetProfileInfo()
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_GetProfileInfo(
const TY_NPU_TASK_HANDLE taskHandle,
int32_t opProfileNum,
int32_t *outputProfileNum,
T_TY_OpProfileInfo opProfiles[]);
/*!
* @brief task的dump信息
* @param [in] taskHandle handleTY_NPU_CreateTask()
* @param [in] opNum op数目, (0, opNum]maxOpNum由TY_NPU_GetOpNum()
* @param [out] opDumps dump信息[opNum]
* opNum*sizeof(TY_OpDumpInfo),
* @note (1) T_OpDumpInfo可以只设置一次dump动作
* (2) taskHandle执行前T_OpDumpInfo可动态修改
* (3) taskHandle执行完毕后dump信息全部已导出使
* (4)
*
* dump所需空间太大
* dump动作
*
0
*/
TY_NPU_FUNC_VISIBILITY int32_t TY_NPU_SetDumpOp(
const TY_NPU_TASK_HANDLE taskHandle,
int32_t opNum,
T_TY_OpDumpInfo *opDumps);
#ifdef __cplusplus
}
#endif
#endif