MI IPU API
REVISION HISTORY¶
Revision No. | Description |
Date |
---|---|---|
3.0 | 07/23/2021 | |
08/25/2021 | ||
11/30/2021 | ||
12/21/2021 | ||
01/20/2022 | ||
02/25/2022 | ||
06/01/2022 | ||
06/13/2022 | ||
08/15/2022 | ||
-Add tensor format ‘MI_IPU_FORMAT_COMPLEX64’ -Modify debug command for IPU version |
10/27/2022 | |
10/08/2023 |
1. 概述¶
1.1. 模块说明¶
MI IPU模块实现了AI模型的推演功能加速。通过channel支持多个AI模型的推演,支持模块内部分配input/output Tensor,也支持直接使用前一级模块out buffer 作为input Tensor。
图1-1 Pudding框图
1.2. 关键词说明¶
-
IPU
智能处理器
-
Firmware
驱动IPU硬件的程序文件
-
Tensor
网络模型中的多维数据
-
Input Tensor
整个AI模型的输入Tensor
-
OutputTensor
整个AI 模型的输出Tensor
2. API参考¶
2.1. 功能模块API¶
API名 | 功能 |
---|---|
MI_IPU_CreateDevice | 创建IPU设备 |
MI_IPU_DestroyDevice | 销毁IPU设备 |
MI_IPU_CreateCHN | 创建IPU通道 |
MI_IPU_DestroyCHN | 销毁指定IPU通道 |
MI_IPU_GetInOutTensorDesc | 获取指定通道的网络模型输入输出信息 |
MI_IPU_GetInputTensors | 从指定通道分配输入Tensor Buffer |
MI_IPU_PutInputTensors | 释放指定通道的输入Tensor Buffer |
MI_IPU_GetOutputTensors | 从指定通道分配输出Tensor Buffer |
MI_IPU_PutOutputTensors | 释放指定通道的输出Tensor Buffer |
MI_IPU_Invoke | 执行一次网络模型推演 |
MI_IPU_GetInputTensors2 | 从指定通道分配批处理输入Tensor Buffer |
MI_IPU_PutInputTensors2 | 释放指定通道的批处理输入Tensor Buffer |
MI_IPU_GetOutputTensors2 | 从指定通道分配批处理输出Tensor Buffer |
MI_IPU_PutOutputTensors2 | 释放指定通道的批处理输出Tensor Buffer |
MI_IPU_Invoke2 | 执行一次n_buf batch模式网络模型推演 |
MI_IPU_Invoke2Custom | 执行一次one_buf batch模式网络模型推演 |
MI_IPU_GetOfflineModeStaticInfo | 获取离线模型运行需要的variable buffer size和离线模型文件大小 |
MI_IPU_CreateCHNWithUserMem | 使用用户提供的MMA内存创建IPU通道 |
2.2. MI_IPU_CreateDevice¶
-
功能
创建IPU设备。
-
语法
MI_S32 MI_IPU_CreateDevice(MI_IPU_DevAttr_t *pstIPUDevAttr, SerializedReadFunc pReadFunc, char *pReadCtx, MI_U32 FWSize);
-
形参
参数名称 描述 输入/输出 pstIPUDevAttr IPU设备属性结构体指针 输入 pReadFunc 用户自定义读取文件函数指针(设为NULL默认使用MI IPU提供的文件读取函数) 输入 pReadCtx IPU firmware文件路径(设为NULL默认使用MI IPU提供的文件路径:/config/dla/ipu_firmware.bin) 输入 FWSize IPU firmware文件大小(设为0默认MI IPU自动获取文件大小) 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
举例
MI_S32 s32Ret; stDevAttr.u32MaxVariableBufSize = BufSize; /*模型内部Tensor使用的memory的最大size*/ s32Ret = MI_IPU_CreateDevice(&stDevAttr, NULL, NULL, 0); if (s32Ret != MI_SUCCESS) { printf("fail to create ipu device\n"); return s32Ret; }
2.3. MI_IPU_DestroyDevice¶
-
功能
销毁IPU设备。
-
语法
MI_S32 MI_IPU_DestroyDevice(void);
-
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
举例
MI_IPU_DestroyDevice();
2.4. MI_IPU_CreateCHN¶
-
功能
创建IPU通道。
-
语法
MI_S32 MI_IPU_CreateCHN(MI_IPU_CHN *ptChnId,MI_IPUChnAttr_t *pstIPUChnAttr, SerializedReadFunc pReadFunc, char *pReadCtx);
-
参数
参数名称 描述 输入/输出 ptChnId 获取IPU通道ID的指针 输出 pstIPUChnAttr IPU通道描述信息结构体指针 输入 pReadFunc 用户自定义读取文件函数(设为NULL默认使用MI IPU提供的文件读取函数) 输入 pReadCtx 网络模型文件路径或者网络模型OS内存地址 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
-
MI_IPUChnAttr_t.u32BatchMax 为批处理的最大值,如果这个模型不需要使用批处理,则将该值设置为1或者0。
-
MI_IPUChnAttr_t.u32InputBufDepth 为设定的输入预分配私有tensor buffer* u32BatchMax的个数,比如 0 or 1 or 2 or 3, 当设置为0时,表示buffer来源于外部。如果直接使用前级模块的输出MI buffer,建议此处设置input_depth为0避免内存浪费。
-
MI_IPUChnAttr_t. u32OutputBufDepth为设定的输出预分配私有tensor buffer* u32BatchMax的个数, 比如 0 or 1 or 2 or 3,当设置为0时,表示buffer来源于外部,如MI_RGN模块。
-
如果创建的是one_buf batch模式网络模型,则不会预分配输入和输出buffer。
-
IPU最大通道数为48。
-
-
举例
MI_S32 s32Ret, buf_depth = 3, batch_max = 1; MI_IPU_CHN u32ChnId = 0; chnAttr.u32InputBufDepth = buf_depth; chnAttr.u32OutputBufDepth = buf_depth; chnAttr. u32BatchMax = batch_max; char pReadCtx[] = "caffe_mobilenet_v2.tflite_sgsimg.img"; s32Ret = MI_IPU_CreateCHN(&u32ChnId, &chnAttr, NULL, pReadCtx); if (s32Ret != MI_SUCCESS) { printf("fail to create ipu channel\n"); MI_IPU_DestroyDevice(); return s32Ret; }
2.5. MI_IPU_DestroyCHN¶
-
功能
销毁指定IPU通道。
-
语法
MI_S32 MI_IPU_DestroyCHN(MI_IPU_CHN u32ChnId);
-
参数
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
- IPU最大通道数为48。
-
举例
MI_IPU_DestroyCHN(u32ChnId);
2.6. MI_IPU_GetInOutTensorDesc¶
-
描述
获取指定通道的网络模型输入输出信息。
-
语法
MI_S32 MI_IPU_GetInOutTensorDesc(MI_IPU_CHN u32ChnId,MI_IPU_SubNet_InputOutputDesc_t *pstDesc);
-
参数
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstDesc 网络描述结构体指针 输出 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
- IPU最大通道数为48。
-
举例
MI_IPU_SubNet_InputOutputDesc_t desc; s32Ret = MI_IPU_GetInOutTensorDesc(u32ChnId, &desc); if (s32Ret) { printf("fail to get network description\n"); MI_IPU_DestroyCHN(u32ChnId); MI_IPU_DestroyDevice(); return s32Ret; } else { int iNum = desc.stMI_InputTensorShapes[0].u32TensorShape[0]; int iResizeH = desc.stMI_InputTensorShapes[0].u32TensorShape[1]; int iResizeW = desc.stMI_InputTensorShapes[0].u32TensorShape[2]; int iResizeC = desc.stMI_InputTensorShapes[0].u32TensorShape[3]; unsigned char *pu8ImageData = new unsigned char[iNum*iResizeH*iResizeW*iResizeC]; ... }
2.7. MI_IPU_GetInputTensors¶
-
描述
从指定通道获取输入Tensor Buffer。
-
语法
MI_S32 MI_IPU_GetInputTensors(MI_IPU_CHN u32ChnId,MI_IPU_TensorVector_t *pstInputTensorVector);
-
参数
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInputTensorVector 输入IPU Tensor数组结构体指针 输出 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
-
输入Tensor的Buffer来源有2种方式:
-
通过MI_IPU_GetInputTensors分配Buffer;
-
使用MI的其他模块已分配的Buffer。
-
-
-
举例
通过MI_IPU_GetInputTensors分配buffer:
MI_IPU_TensorVector_t inputV; MI_IPU_TensorVector_t OutputV; MI_U8 au8MaggiePic[3*224*224] ; cv::Mat img = cv::imread(filename, -1); cv::Size inputSize = cv::Size(224,224,3) cv ::Mat imgResize ; cv::resize(img, imgResize, inputSize); memcpy(au8MaggiePic, imgResize.data, sizeof(au8MaggiePic)); s32Ret = MI_IPU_GetInputTensors(u32ChnId, &inputV); if (s32Ret == MI_SUCCESS) { memcpy(inputV.stArrayTensors[0].pstTensorData[0], au8MaggiePic, sizeof(au8MaggiePic)); MI_SYS_FlushInvCache(inputV.stArrayTensors[0].pstTensorData[0], sizeof(au8MaggiePic)); } else { printf(“fail to get buffer, please try again”); } MI_IPU_GetOutputTensors( u32ChannelID, &OutputV); if(MI_SUCCESS!=MI_IPU_Invoke(u32ChannelID, & inputV, &OutputV)) { cout<<"IPU invoke failed!!"<<endl; MI_IPU_DestroyCHN(u32ChannelID); MI_IPU_DestroyDevice(); return -1; }
使用MI其他模块已经分配的buffer
MI_IPU_TensorVector_t inputVector, outputVector; inputVector.u32TensorCount = 1; if (stBufInfo.eBufType == E_MI_SYS_BUFDATA_RAW) { inputVector.astArrayTensors[0].phyTensorAddr[0] = stBufInfo.stRawData.phyAddr; inputVector.astArrayTensors[0].ptTensorData[0] = stBufInfo.stRawData.pVirAddr; } else if (stBufInfo.eBufType == E_MI_SYS_BUFDATA_FRAME) { inputVector.astArrayTensors[0].phyTensorAddr[0] = stBufInfo.stFrameData.phyAddr[0]; inputVector.astArrayTensors[0].ptTensorData[0] = stBufInfo.stFrameData.pVirAddr[0]; inputVector.astArrayTensors[0].phyTensorAddr[1] = stBufInfo.stFrameData.phyAddr[1]; inputVector.astArrayTensors[0].ptTensorData[1] = stBufInfo.stFrameData.pVirAddr[1]; } //prepare output vector s32Ret = MI_IPU_GetOutputTensors(FdaChn, &outputVector); s32Ret = MI_IPU_Invoke(FdaChn, &inputVector, &outputVector);
2.8. MI_IPU_PutInputTensors¶
-
功能
释放指定通道的输入Tensor Buffer。
-
语法
MI_S32 MI_IPU_PutInputTensors(MI_IPU_CHN u32ChnId,MI_IPU_TensorVector_t *pstInputTensorVector);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道号 输入 pstInputTensorVector 输入IPU Tensor数组结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
2.9. MI_IPU_GetOutputTensors¶
-
功能
从指定通道获取输出Tensor Buffer。
-
语法
MI_S32 MI_IPU_GetOutputTensors(MI_IPU_CHN u32ChnId,MI_IPU_TensorVector_t *pstInputTensorVector);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInputTensorVector 输出IPU Tensor数组结构体指针 输出 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
举例
MI_IPU_TensorVector_t outputV; s32Ret = MI_IPU_GetOutputTensors(u32ChnId, &outputV); if (s32Ret != MI_SUCCESS) { printf(“fail to get buffer, please try again”); }
2.10. MI_IPU_PutOutputTensors¶
-
功能
释放指定通道的输出Tensor Buffer。
-
语法
MI_S32 MI_IPU_PutOutputTensors(MI_IPU_CHN u32ChnId,MI_IPU_TensorVector_t *pstInputTensorVector);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInputTensorVector 输出IPU Tensor数组结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
2.11. MI_IPU_Invoke¶
-
功能
执行一次AI网络推演过程。
-
语法
MI_S32 MI_IPU_Invoke(MI_IPU_CHN u32ChnId,MI_IPU_TensorVector_t *pstInputTensorVector,MI_IPU_TensorVector_t *pstOuputTensorVector);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInputTensorVector 输入IPU Tensor数组结构体指针 输入 pstOuputTensorVector 输出IPU Tensor数组结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
-
MI_IPU_Invoke为同步API。
-
每一个输入/输出tensor的起始物理地址必须64 bytes 对齐。
-
-
举例
s32Ret =MI_IPU_Invoke(u32ChnId, &inputV, &outputV); if (s32Ret == MI_SUCCESS) { // process output buffer data // ... }
2.12. MI_IPU_GetInputTensors2¶
-
功能
从指定通道获取批处理输入Tensor Buffer
-
语法
MI_S32 MI_IPU_GetInputTensors2(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
输入Tensor的Buffer来源有2种方式:
-
通过MI_IPU_GetInputTensors2分配Buffer;
-
使用MI的其他模块已分配的Buffer。
-
2.13. MI_IPU_PutInputTensors2¶
-
功能
释放指定通道的批处理输入Tensor Buffer。
-
语法
MI_S32 MI_IPU_PutInputTensors2(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
2.14. MI_IPU_GetOutputTensors2¶
-
功能
从指定通道获取批处理输出Tensor Buffer。
-
语法
MI_S32 MI_IPU_GetOutputTensors2(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
2.15. MI_IPU_PutOutputTensors2¶
-
功能
释放指定通道的批处理输出Tensor Buffer。
-
语法
MI_S32 MI_IPU_PutOutputTensors2(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
2.16. MI_IPU_Invoke2¶
-
功能
执行一次n_buf batch模式网络模型推演。
-
语法
MI_S32 MI_IPU_Invoke2(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam, MI_IPU_RuntimeInfo_t *pstRuntimeInfo);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 pstRuntimeInfo IPU运行信息结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
-
MI_IPU_Invoke2为同步API。
-
MI_IPU_Invoke2只能推理n_buf batch模式的模型。
-
每一个输入/输出tensor的起始物理地址必须64 bytes 对齐。
-
用户指定的variable buffer的起始物理地址必须64 bytes 对齐。
-
-
举例
MI_IPU_BatchInvoke_param_t stInvokeParam; MI_IPU_RuntimeInfo_t stRuntimeInfo; stInvokeParam.u32BatchN = 16; stInvokeParam.s32TaskPrio = 20; stInvokeParam.u32IpuAffinity = 0; //由ipu调度 s32Ret = MI_IPU_GetInputTensors2(u32ChnId, &stInvokeParam); if (s32Ret != MI_SUCCESS) { printf(“Error: MI_IPU_GetInputTensors2 return %d\n”, s32Ret); return -1; } s32Ret = MI_IPU_GetOutputTensors2(u32ChnId, &stInvokeParam); if (s32Ret != MI_SUCCESS) { printf(“Error: MI_IPU_ GetOutputTensors2 return %d\n”, s32Ret); MI_IPU_PutInputTensors2(u32ChnId, &stInvokeParam); return -1; } s32Ret = MI_IPU_Invoke2(u32ChnId, &stInvokeParam, &stRuntimeInfo); if (s32Ret == MI_SUCCESS) { // process output buffer data // ... printf(“bw_total=%llu, bw_read=%llu, bw_read=%llu, iputime=%llu\n”, stRuntimeInfo.u64BandWidth, stRuntimeInfo.u64BandWidthRead, stRuntimeInfo.u64BandWidthWrite, stRuntimeInfo.u64IpuTime); }
2.17. MI_IPU_Invoke2Custom¶
-
功能
执行一次one_buf batch模式网络模型推演。
-
语法
MI_S32 MI_IPU_Invoke2Custom(MI_IPU_CHN u32ChnId, MI_IPU_BatchInvoke_param_t *pstInvokeParam, MI_IPU_RuntimeInfo_t *pstRuntimeInfo);
-
形参
参数名称 描述 输入/输出 u32ChnId IPU通道ID 输入 pstInvokeParam 批处理参数结构体指针 输入 pstRuntimeInfo IPU运行信息结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
-
MI_IPU_Invoke2Custom为同步API。
-
MI_IPU_Invoke2Custom只能推理one_buf batch模式模型。
-
每一个输入/输出tensor的起始物理地址必须64 bytes 对齐。
-
用户指定的variable buffer的起始物理地址必须64 bytes 对齐。
-
-
举例
// input tensor number=1 output tensor number=1 MI_IPU_BatchInvoke_param_t stInvokeParam; MI_IPU_RuntimeInfo_t stRuntimeInfo; stInvokeParam.u32BatchN = 10; stInvokeParam.s32TaskPrio = 20; stInvokeParam.u32IpuAffinity = 0; //由ipu调度 int s32InputSize, s32InputSizeOne; s32InputSizeOne = stDesc.astMI_InputTensorDescs[0].u32BufSize; s32InputSize = s32InputSizeOne * stInvokeParam.u32BatchN; int s32OutputSize, s32OutputSizeOne; s32OutputSizeOne = stDesc.astMI_OutputTensorDescs[0].u32BufSize; s32OutputSize = s32OutputSizeOne * stInvokeParam.u32BatchN; s32Ret = MI_SYS_MMA_Alloc(0, NULL, s32InputSize, &u64InputPhyAddr); if (s32Ret != MI_SUCCESS) { printf("fail to allocate input buffer\n"); return -1; } s32Ret = MI_SYS_Mmap(u64InputPhyAddr, s32InputSize, &pInputVirAddr, TRUE); if (s32Ret != MI_SUCCESS) { MI_SYS_MMA_Free(0, u64InputPhyAddr); printf("Error: fail to map input address, error=%d\n", s32Ret); return -1; } stInvokeParam.astArrayTensors[0].ptTensorData[0] = pInputVirAddr; stInvokeParam.astArrayTensors[0].phyTensorAddr[0] = u64InputPhyAddr; s32Ret = MI_SYS_MMA_Alloc(0, NULL, s32OutputSize, &u64OutputPhyAddr); if (s32Ret != MI_SUCCESS) { MI_SYS_Munmap(pInputVirAddr, s32InputSize); MI_SYS_MMA_Free(0, u64InputPhyAddr); printf("fail to allocate output buffer\n"); return -1; } s32Ret = MI_SYS_Mmap(u64OutputPhyAddr, s32OutputSize, &pOutputVirAddr, TRUE); if (s32Ret != MI_SUCCESS) { MI_SYS_Munmap(pInputVirAddr, s32InputSize); MI_SYS_MMA_Free(0, u64InputPhyAddr); MI_SYS_MMA_Free(0, u64OutputPhyAddr); printf("Error: fail to map output address, error=%d\n", s32Ret); return -1; } stInvokeParam.astArrayTensors[1].ptTensorData[0] = pOutputVirAddr; stInvokeParam.astArrayTensors[1].phyTensorAddr[0] = u64OutputPhyAddr; for (int i = 0; i < stInvokeParam.u32BatchN; i++) { memcpy(pInputVirAddr+i*s32InputSizeOne; pInputBuf[i], s32InputSizeOne); } MI_SYS_FlushInvCache(pInputVirAddr, s32InputSize); s32Ret = MI_IPU_Invoke2Custom(channel, &stInvokeParam, NULL); if (s32Ret != MI_SUCCESS) { printf("fail to invoke\n"); MI_SYS_Munmap(pInputVirAddr, s32InputSize); MI_SYS_MMA_Free(0, u64InputPhyAddr); MI_SYS_Munmap(pOutputVirAddr, s32OutputSize); MI_SYS_MMA_Free(0, u64OutputPhyAddr); return -1; } else { // process output data for (int i = 0; i < stInvokeParam.u32BatchN; i++) { // pOutputVirAddr+i*s32OutputSizeOne } }
2.18. MI_IPU_GetOfflineModeStaticInfo¶
-
功能
获取离线模型运行需要的variable buffer size和离线模型文件大小
-
语法
MI_S32 MI_IPU_GetOfflineModeStaticInfo(SerializedReadFunc pReadFunc, char *pReadCtx, MI_IPU_OfflineModelStaticInfo_t *pStaticInfo);
-
形参
参数名称 描述 输入/输出 pReadFunc 用户自定义读取文件函数(设为NULL默认使用MI IPU提供的文件读取函数 输入 pReadCtx 离线模型文件路径 输入 pStaticInfo 离线模型静态信息结构体指针 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
举例
MI_IPU_OfflineModelStaticInfo_t staticInfo; s32Ret = MI_IPU_GetOfflineModeStaticInfo(NULL, pModelImgPath, &staticInfo); if (s32Ret == MI_SUCCESS) { printf("variable buffer size: %u bytes\n%s size: %u bytes\n", staticInfo.u32VariableBufferSize, pModelImgPath, staticInfo.u32OfflineModelSize); }
2.19. MI_IPU_CreateCHNWithUserMem¶
-
功能
使用用户提供的MMA内存创建IPU通道。
-
语法
MI_S32 MI_IPU_CreateCHNWithUserMem(MI_IPU_CHN *ptChnId, MI_IPUChnAttr_t *pstChnAttr, MI_PHY u64ModelPA);
-
参数
参数名称 描述 输入/输出 ptChnId 获取IPU通道ID的指针 输出 pstIPUChnAttr IPU通道描述信息结构体指针 输入 u64ModelPA 存放网络模型文件的MMA内存 输入 -
返回值
-
MI_SUCCESS成功。
-
非MI_SUCCESS失败,参照错误码。
-
-
依赖
-
头文件:mi_ipu.h
-
库文件:libmi_ipu.so
-
-
注意
- MI_IPUChnAttr_t.u32BatchMax 为批处理的最大值,如果这个模型不需要使用批处理,则将该值设置为1或者0。
- MI_IPUChnAttr_t.u32InputBufDepth 为设定的输入预分配私有tensor buffer* u32BatchMax的个数,比如 0 or 1 or 2 or 3, 当设置为0时,表示buffer来源于外部。如果直接使用前级模块的输出MI buffer,建议此处设置input_depth为0避免内存浪费。
- MI_IPUChnAttr_t. u32OutputBufDepth为设定的输出预分配私有tensor buffer* u32BatchMax的个数, 比如 0 or 1 or 2 or 3,当设置为0时,表示buffer来源于外部,如MI_RGN模块。
- 如果创建的是one_buf batch模式网络模型,则不会预分配输入和输出buffer。
- IPU最大通道数为48。
- 只有在调用MI_IPU_DestroyCHN后才能释放u64ModelPA
-
举例
MI_S32 s32Ret, buf_depth = 3, batch_max = 1; MI_IPU_CHN u32ChnId = 0; MI_IPUChnAttr_t chnAttr; MI_S32 fd, s32ModelSize; MI_U64 u64ModelPA = 0; void *pmem = NULL; void *pModelVA = NULL; char *pModelPath = "caffe_mobilenet_v2.tflite_sgsimg.img"; chnAttr.u32InputBufDepth = buf_depth; chnAttr.u32OutputBufDepth = buf_depth; chnAttr.u32BatchMax = batch_max; fd = open(pModelPath, O_RDONLY); if (fd < 0) { perror("Fail to open model!\n"); return -1; } s32ModelSize = lseek(fd, 0, SEEK_END); pmem = mmap(NULL, s32ModelSize, PROT_READ, MAP_SHARED, fd, 0); if (pmem == MAP_FAILED) { perror("mmap"); close(fd); return -1; } s32Ret = MI_SYS_MMA_Alloc(0, NULL, s32ModelSize, &u64ModelPA); if (s32Ret != MI_SUCCESS) { printf("fail to allocate model buf!\n"); munmap(pmem, s32ModelSize); close(fd); return s32Ret; } s32Ret = MI_SYS_Mmap(u64ModelPA, s32ModelSize, &pModelVA, TRUE); if (s32Ret != MI_SUCCESS) { printf("fail to mmap"); MI_SYS_MMA_Free(0, u64PhyAddr); munmap(pmem, s32ModelSize); close(fd); return s32Ret; } memcpy(pModelVA, pmem, s32ModelSize); MI_SYS_FlushInvCache(pModelVA, s32ModelSize); s32Ret = MI_IPU_CreateCHNWithUserMem(&u32ChnId, &chnAttr, u64ModelPA); if (s32Ret != MI_SUCCESS) { printf("fail to create ipu channel\n"); MI_SYS_Munmap(pModelVA, s32ModelSize); MI_SYS_MMA_Free(0, u64PhyAddr); munmap(pmem, s32ModelSize); close(fd); return s32Ret; }
3. 数据类型¶
3.1. 数据类型定义¶
数据类型 | 定义 |
---|---|
SerializedReadFunc | 定义用于客制化的读取文件方式,用于支持客制化的AI网络存储格式 |
MI_IPU_ELEMENT_FORMAT | 定义IPU输入数据枚举类型 |
MI_IPU_BatchMode_e | 定义IPU batch buffer模式枚举类型 |
MI_IPU_LayoutType_e | 定义tensor的排布枚举类型 |
MI_IPU_IpuWorkMode_e | 定义IPU模型的工作模式枚举类型 |
MI_IPU_TensorDesc_t | 定义IPU Tensor形状结构体 |
MI_IPU_SubNet_InputOutputDesc_t | 定义IPU子网络输入/输出描述结构体 |
MI_IPU_Tensor_t | 定义IPU Tensor地址结构体 |
MI_IPU_TensorVector_t | 定义IPU Tensor数组结构体指针 |
MI_IPU_DevAttr_t | 定义IPU设备属性结构体 |
MI_IPU_ChnAttr_t | 定义IPU通道属性结构体 |
MI_IPU_BatchInvoke_param_t | 定义批处理参数结构体 |
MI_IPU_RuntimeInfo_t | 定义IPU运行信息结构体 |
MI_IPU_OfflineModelStaticInfo_t | 定义IPU离线模型静态信息结构体 |
3.2. SerializedReadFunc¶
-
说明
定义用于客制化的读取文件方式,用于支持客制化的AI网络存储格式。
-
语法
typedef int (*SerializedReadFunc)(void *dst_buf,int offset, int size, char *ctx);
-
成员
成员名称 描述 dst_buf 数据存放地址 offset 文件指针偏移量 size 读取大小 ctx 文件路径
3.3. MI_IPU_ELEMENT_FORMAT¶
-
说明
定义IPU输入数据枚举类型。
-
语法
typedef enum
{
MI_IPU_FORMAT_U8, MI_IPU_FORMAT_NV12, MI_IPU_FORMAT_INT16, MI_IPU_FORMAT_INT32, MI_IPU_FORMAT_INT8, MI_IPU_FORMAT_FP32, MI_IPU_FORMAT_UNKNOWN, MI_IPU_FORMAT_ARGB8888, MI_IPU_FORMAT_ABGR8888, MI_IPU_FORMAT_GRAY, MI_IPU_FORMAT_COMPLEX64,
} MI_IPU_ELEMENT_FORMAT;
-
成员
成员名称 描述 MI_IPU_FORMAT_U8 U8类型 MI_IPU_FORMAT_NV12 NV12类型,如YUV MI_IPU_FORMAT_INT16 INT16类型 MI_IPU_FORMAT_INT32 INT32类型 MI_IPU_FORMAT_INT8 INT8类型 MI_IPU_FORMAT_FP32 FLOAT类型 MI_IPU_FORMAT_UNKNOWN Unknown MI_IPU_FORMAT_ARGB8888 ARGB8888类型 MI_IPU_FORMAT_ABGR8888 ABGR8888类型 MI_IPU_FORMAT_GRAY GRAY类型 MI_IPU_FORMAT_COMPLEX64 COMPLEX64类型 -
注意事项
-
ARGB/RGB/BGR tensor属于MI_IPU_FORMAT_U8数据类型
-
只有input tensor可以支援MI_IPU_FORMAT_NV12格式
-
只有output tensor可以支援MI_IPU_FORMAT_FP32格式
-
3.4. MI_IPU_BatchMode_e¶
-
说明
定义IPU batch buffer模式枚举类型。
-
定义
typedef enum { E_IPU_BATCH_N_BUF_MODE = 0, E_IPU_BATCH_ONE_BUF_MODE, } MI_IPU_BatchMode_e;
-
成员
成员名称 描述 E_IPU_BATCH_N_BUF_MODE 模型为n_buf batch模式 E_IPU_BATCH_ONE_BUF_MODE 模型为one_buf batch模式 -
相关数据类型及接口
3.5. MI_IPU_LayoutType_e¶
-
说明
定义tensor的排布枚举类型。
-
定义
typedef enum { E_IPU_LAYOUT_TYPE_NHWC = 0, E_IPU_LAYOUT_TYPE_NCHW, } MI_IPU_LayoutType_e;
-
成员
成员名称 描述 E_IPU_LAYOUT_TYPE_NHWC 该tensor为NHWC排布 E_IPU_LAYOUT_TYPE_NCHW 该tensor为NCHW排布 -
相关数据类型及接口
3.6. MI_IPU_IpuWorkMode_e¶
-
说明
定义IPU模型的工作模式枚举类型。
-
定义
typedef enum { E_IPU_IPU_WORK_MODE_SINGLECORE = 0, E_IPU_IPU_WORK_MODE_MULTICORE, } MI_IPU_IpuWorkMode_e;
-
成员
成员名称 描述 E_IPU_IPU_WORK_MODE_SINGLECORE 模型为单核模式 E_IPU_IPU_WORK_MODE_MULTICORE 模型为多核模式 -
相关数据类型及接口
3.7. MI_IPU_TensorDesc_t¶
-
说明
定义IPU Tensor描述结构体。
-
语法
typedef struct MI_IPU_TensorDesc_s { MI_U32 u32TensorDim; MI_IPU_ELEMENT_FORMAT eElmFormat; MI_U32 u32TensorShape[MI_IPU_MAX_TENSOR_DIM]; MI_S8 name[MAX_TENSOR_NAME_LEN]; MI_U32 u32InnerMostStride; MI_FLOAT fScalar; MI_S64 s64ZeroPoint; MI_S32 s32AlignedBufSize; MI_U32 u32BufSize; MI_U32 u32InputWidthAlignment; MI_U32 u32InputHeightAlignment; MI_IPU_LayoutType_e eLayoutType; MI_U32 au32Reserve[4]; // reserved } MI_IPU_TensorDesc_t;
-
成员
成员名称 描述 u32TensorDim Tensor维度 eElmFormat Tensor数据类型 u32TensorShape Tensor形状数组 name Tensor名称 u32InnerMostStride Tensor最内维长度(单位字节) fScalar Tensor量化系数 s64ZeroPoint Tensor量化offset s32AlignedBufSize Tensor buffer对齐后的大小 u32BufSize Tensor buffer大小 u32InputWidthAlignment 输入Tensor水平方向对齐大小 u32InputHeightAlignment 输入Tensor垂直方向对齐大小 eLayoutType Tensor的排布模式 au32Reserve 预留位 -
注意事项
-
Tensor维度最大为10。建议使用如下宏定义:
#define MI_IPU_MAX_TENSOR_DIM (10)
-
输入数据必须严格按照u32InputWidthAlignment和u32InputHeightAlignment对齐,否则结果会出错。
-
数据对齐方式
input_formats 板上运行时数据对齐方式 RGB/BGR 不用对齐 RGBA/BGRA W = ALIGN_UP(W * 4, input_width_alignment) / 4
input_width_alignment默认为1YUV_NV12 H = ALIGN_UP(H, input_height_alignment)
input_height_alignment默认为2
W = ALIGN_UP(W, input_width_alignment)
input_width_alignment默认为2GRAY H = ALIGN_UP(H, input_height_alignment)
input_height_alignment默认为1
W = ALIGN_UP(W, input_width_alignment)
input_width_alignment默认为1RAWDATA_F32_NHWC 不用对齐 RAWDATA_S16_NHWC 不用对齐
-
3.8. MI_IPU_SubNet_InputOutputDesc_t¶
-
说明
定义IPU子网络输入/输出描述结构体。
-
语法
typedef struct MI_IPU_SubNet_InputOutputDesc_s { MI_U32 u32InputTensorCount; MI_U32 u32OutputTensorCount; MI_IPU_TensorDesc_t astMI_InputTensorDescs[MI_IPU_MAX_INPUT_TENSOR_CNT]; MI_IPU_TensorDesc_t astMI_OutputTensorDescs[MI_IPU_MAX_OUTPUT_TENSOR_CNT]; } MI_IPU_SubNet_InputOutputDesc_t;
-
成员
成员名称 描述 u32InputTensorCount 输入Tensor个数 u32OutputTensorCount 输出Tensor个数 astMI_InputTensorDescs 输入Tensor形状结构体数组 astMI_OutputTensorDescs 输出Tensor形状结构体数组
3.9. MI_IPU_Tensor_t¶
-
说明
定义IPU Tensor地址结构体。
-
语法
typedef struct MI_IPU_Tensor_s { void *ptTensorData[2]; MI_PHY phyTensorAddr[2];//notice that this is miu bus addr,not cpu bus addr. } MI_IPU_Tensor_t;
-
成员
成员名称 描述 ptTensorData Tensor buffer虚拟地址 phyTensorAddr Tensor buffer物理地址
3.10. MI_IPU_TensorVector_t¶
- 说明
定义IPU Tensor数组结构体。
-
语法
typedef struct MI_IPU_TensorVector_s { MI_U32 u32TensorCount; MI_IPU_Tensor_t astArrayTensors[MI_IPU_MAX_TENSOR_CNT]; } MI_IPU_TensorVector_t;
-
成员
成员名称 描述 u32TensorCount Tensor个数 astArrayTensors 每个Tensor的地址信息
3.11. MI_IPU_DevAttr_t¶
-
说明
定义IPU设备属性结构体。
-
语法
typedef struct MI_IPU_DevAttr_s { MI_U32 u32MaxVariableBufSize; MI_U32 u32YUV420_W_Pitch_Alignment; // unused MI_U32 u32YUV420_H_Pitch_Alignment; // unused MI_U32 u32XRGB_W_Pitch_Alignment; // unused MI_U32 au32Reserve[8]; // reserved } MI_IPU_DevAttr_t;
-
成员
成员名称 描述 u32MaxVariableBufSize 模型内部Tensor使用的memory的最大大小 u32YUV420_W_Pitch_Alignment Unused u32YUV420_H_Pitch_Alignment Unused u32XRGB_W_Pitch_Alignment Unused au32Reserve 预留位
3.12. MI_IPU_ChnAttr_t¶
-
说明
定义IPU通道属性结构体。
-
语法
typedef struct MI_IPU_ChnAttr_s { MI_U32 u32SubNetId; MI_U32 u32OutputBufDepth; MI_U32 u32InputBufDepth; MI_U32 u32BatchMax; MI_U32 au32Reserve[8]; // reserved } MI_IPUChnAttr_t;
-
成员
成员名称 描述 u32SubNetId 子网络ID u32OutputBufDepth 输出Tensor Buffer深度 u32InputBufDepth 输入Tensor Buffer深度 au32Reserve 预留位 -
注意事项
IPU输入/输出缓冲区最大深度为3。建议使用如下宏定义:
#define MAX_IPU_INPUT_OUTPUT_BUF_DEPTH (3)
3.13. MI_IPU_BatchInvoke_param_t¶
-
说明
定义批处理参数结构体。
-
语法
typedef struct MI_IPU_BatchInvoke_param_s { MI_PHY u64VarBufPhyAddr; MI_U32 u32VarBufSize; MI_U32 u32BatchN; MI_S32 s32TaskPrio; MI_U32 u32IpuAffinity; MI_IPU_Tensor_t astArrayTensors[MI_IPU_MAX_BATCH_TENSOR_CNT]; MI_U32 au32Reserve[8]; // reserved } MI_IPU_BatchInvoke_param_t;
-
成员
成员名称 描述 u64VarBufPhyAddr 用户指定的variable buffer物理地址 u32VarBufSize 用户指定的variable buffer大小 u32BatchN 批处理个数 s32TaskPrio 任务优先级 u32IpuAffinity 绑定ipu core astArrayTensors 批处理所有的输入输出tensor buffer地址 au32Reserve 预留位 -
注意事项
-
astArrayTensors数组存放批处理所有的输入输出tensor buffer地址,规则是先依次存入所有输入tensor buffer地址,再存入所有输出tensor buffer地址。
-
每一个输入/输出tensor的起始物理地址必须64 bytes 对齐。
-
用户指定的variable buffer的起始物理地址必须64 bytes对齐。
-
3.14. MI_IPU_RuntimeInfo_t¶
-
说明
定义IPU运行信息结构体。
-
语法
typedef struct MI_IPU_RuntimeInfo_s { MI_U64 u64BandWidth; MI_U64 u64IpuTime; MI_U64 u64BandWidthRead; MI_U64 u64BandWidthWrite; MI_U32 au32Reserve[8]; // reserved } MI_IPU_RuntimeInfo_t;
-
成员
成员名称 描述 u64BandWidth 带宽数据总量 u64IpuTime IPU处理时间 (ms) u64BandWidthRead 带宽数据读总量 u64BandWidthWrite 带宽数据写总量 au32Reserve 预留位
3.15. MI_IPU_OfflineModelStaticInfo_t¶
-
说明
定义IPU离线模型静态信息结构体。
-
语法
typedef struct MI_IPU_OfflineModelStaticInfo_s { MI_U32 u32VariableBufferSize; MI_U32 u32OfflineModelSize; MI_IPU_BatchMode_e eBatchMode; MI_U32 u32TotalBatchNumTypes; MI_U32 au32BatchNumTypes[MI_IPU_MAX_BATCH_TYPE_NUM]; MI_IPU_IpuWorkMode_e eIpuWorkMode; MI_U32 au32Reserve[8]; // reserved } MI_IPU_OfflineModelStaticInfo_t;
-
成员
成员名称 描述 u32VariableBufferSize 离线模型运行需要的variable buffer size u32OfflineModelSize 离线模型文件大小 eBatchMode 离线模型batch buffer模式 u32TotalBatchNumTypes 离线模型所支持的batch数的种类个数 au32BatchNumTypes n_buf模式:离线模型板端运行所能够支持的最大batch数以及batch数推荐值的最大值
one_buf模式:离线模型板端运行所能够支持的batch数的种类eIpuWorkMode 离线模型的工作模式 au32Reserve 预留位 -
注意事项
-
如果模型的eBatchMode为E_IPU_BATCH_N_BUF_MODE:
u32TotalBatchNumTypes将会返回2。
au32BatchNumTypes[0]将会返回该离线模型板端运行所能够支持的最大batch数。
au32BatchNumTypes[1]将会返回该离线模型板端运行的推荐batch数中的最大值。(推荐batch数将是2的n次幂,当au32BatchNumTypes[1] = 2n,代表该模型的推荐batch数为20, 21, ..., 2(n-1), 2n)。
Ex:
au32BatchNumTypes[0]返回128,则可以支持1~128个batches。
au32BatchNumTypes[1]返回8,则该模型的推荐batch数为1, 2, 4, 8。
-
如果模型的eBatchMode为E_IPU_BATCH_ONE_BUF_MODE:
u32TotalBatchNumTypes将会返回离线模型板端运行所能够支持的batch数的种类的个数。
au32BatchNumTypes[0] ~ au32BatchNumTypes[u32TotalBatchNumTypes - 1]将会返回离线模型板端运行所能够支持的batch数的种类。
Ex:
u32TotalBatchNumTypes==3
au32BatchNumTypes[0]==10
au32BatchNumTypes[1]==20
au32BatchNumTypes[2]==30
则可以支持10、20、30这三种batch数。
-
4. 错误码¶
表4-1 IPU API错误码
错误代码 | 宏定义 | 描述 |
---|---|---|
0 | MI_SUCCESS | Success |
1 | E_IPU_ERR_INVALID_CHNID | Invlalid channel ID |
2 | E_IPU_ERR_CHNID_EXIST | Channel already exists |
3 | E_IPU_ERR_CHNID_UNEXIST | Channel does not exist |
4 | E_IPU_ERR_NOMEM | Failure caused by malloc memory |
5 | E_IPU_ERR_NOBUF | Failure caused by malloc buffer |
6 | E_IPU_ERR_BADADDR | Bad address, buffer address is not gotten from IPU buffer allocator |
7 | E_IPU_ERR_SYS_TIMEOUT | System timeout |
8 | E_IPU_ERR_FILE_OPERATION | File cannot be opened or read or written |
9 | E_IPU_ERR_ILLEGAL_TENSOR_BUFFER_SIZE | Tensor buffer size does not meet the requirement, usually less than the requirement |
10 | E_IPU_ERR_ILLEGAL_BUFFER_DEPTH | Input or output buffer depth quantum exceeds maximum number |
11 | E_IPU_ERR_ILLEGAL_INPUT_OUTPUT_DESC | Network description is illegal, usually input or output buffer quantum is wrong |
12 | E_IPU_ERR_ILLEGAL_INPUT_OUTPUT_PARAM | Uer's input or output buffer quantum does not match network description |
13 | E_IPU_ERR_MAP | Address mapping error |
14 | E_IPU_ERR_INIT_FIRMWARE | Fail to initialize IPU firmware |
15 | E_IPU_ERR_CREATE_CHANNEL | Fail to create channel |
16 | E_IPU_ERR_DESTROY_CHANNEL | Fail to destroy channel |
17 | E_IPU_ERR_INVOKE | Fail to invoke |
18 | E_IPU_ERR_SET_MALLOC_REGION | Fail to set malloc region for freertos |
19 | E_IPU_ERR_SET_IPU_PARAMETER | Fail to set IPU parameter |
20 | E_IPU_ERR_INVALID_PITCH_ALIGNMENT | Invalid pitch alignment |
21 | E_IPU_ERR_NO_CREATED_IPU_DEVICE | There is no created IPU device |
22 | E_IPU_ERR_GET_IPU_VERSION | Fail to get IPU version from IPU firmware |
23 | E_IPU_ERR_MISMATCH_IPU_HEAD_FILE | IPU head files version not matched |
24 | E_IPU_ERR_NO_SUPPORT_REQ | IPU firmware does not support this request |
25 | E_IPU_ERR_FAILED | Unexpected error |
26 | E_IPU_ERR_SEND_REQUEST | Fail to send request to IPU |
27 | E_IPU_ERR_GET_FIRMWARE_INFO | Fail to get ipu firmware information |
28 | E_IPU_ERR_INVALID_IPUCORE_BOOTING_PARAM | Invalid IPU cores booting parameters |
29 | E_IPU_ERR_INVALID_IPUCORE_SHUTDOWNING_PARAM | Invalid IPU cores shutdowning parameters |
30 | E_IPU_ERR_NO_MULTICORE_ENV | Multicore mode needs all ipu cores being alive |
31 | E_IPU_ERR_INVALID_TASK_PRIORITY | Invalid ipu task priority |
32 | E_IPU_ERR_DEV_SHUTDOWN | Ipu core has been shutdown |
33 | E_IPU_ERR_DEV_FAIL_RESET | Fail to reset ipu |
34 | E_IPU_ERR_DEV_FAIL_SHUTDOWN | Fail to shutdown ipu |
35 | E_IPU_ERR_NO_AVAILABLE_DEV | No available ipu dev |
36 | E_IPU_ERR_RESET_OFF | Reset function is off |
37 | E_IPU_ERR_INVALID_BATCH_NUM | batch number error |
38 | E_IPU_ERR_BATCH_TYPE | batch type error |
39 | E_IPU_ERR_BATCH_MODE | batch mode error |
40 | E_IPU_ERR_NO_AVAILABLE_BATCH_MODE | do not find available batch mode |
41 | E_IPU_ERR_IPU_HANG | invoke was dropped due to ipu hang |
42 | E_IPU_ERR_NO_RESET_DEV | no reset ipu dev |
43 | E_IPU_ERR_NO_BATCH_PARAM | no batch parameter |
44 | E_IPU_ERR_INVALID_MODEL_BUFFER | invalid user model buffer physical address or size |
45 | E_IPU_ERR_INVALID_VARIABLE_BUFFER | invalid variable buffer physical address or size |
46 | E_IPU_ERR_NOT_ASSIGN_CORE | not assign ipu core when use user's variable buffer |
47 | E_IPU_ERR_SWDISP_NOT_REGISTER | model has unsupported swdisp function |
48 | E_IPU_ERR_SWDISP_NOT_FIND_TASKID | not find swdisp task id |
49 | E_IPU_ERR_SWDISP_INVALID_PARAM | invalid swdisp parameter |
50 | E_IPU_ERR_SWDISP_UNEXPECTED | unexpected swdisp error |
51 | E_IPU_ERR_SWDISP_UNKNOWN | unknown swdisp error |
52 | E_IPU_ERR_BAD_PHY_ADDR_ALIGNMENT | ipu buffer physical addr not aligned |
53 | E_IPU_ERR_MISMATCH_INVOKE_FUNC | n_buf/one_buf batch model should use MI_IPU_Invoke2/MI_IPU_Invoke2Custom |
54 | E_IPU_ERR_MISMATCH_MODEL | other platform's model |
55 | E_IPU_ERR_INVOKE_INTERRUPT | invoke task was interrupted (maybe on suspend), please try again |
256 | E_IPU_ERR_NO_AVAILABLE_CHNID | There is no available channel |
5. PROCFS介绍¶
5.1. 概述¶
通过控制台debug IPU的方式主要有procfs和sysfs。
-
IPU Procfs在open device(mi_dev)的时候创建节点
proc/mi_module/mi_ipu/mi_ipu0
,close device的时候删除节点。 -
IPU Sysfs在insmod ko的时候创建节点
sys/dla/xxx
。
5.2. 如何看MMA信息¶
# cat /proc/mi_modules/mi_sys/mi_sys0
可以看到所有MMA的使用情况。
# cat /proc/mi_modules/mi_ipu/mi_ipu0
可以看IPU的device和各channel使用MMA的情况。
5.3. 查看IPU version信息¶
# cat /sys/dla/version
5.4. 查看IPU clock信息¶
# cat /sys/dla/freq
5.5. 调节IPU clock¶
# echo xxx > /sys/dla/freq *(XXX必须是available frequency)*
5.6. 开关auto reset功能¶
Auto reset功能可以在IPU无响应后reset IPU,继续未完成的任务。
打开auto reset功能:echo on > /sys/dla/auto_reset
关闭auto reset功能:echo off > /sys/dla/auto_reset
前期测试阶段,建议关闭auto reset功能,理清IPU无响应的原因。
5.7. 抓取IPU log¶
# echo “ctrl_size=0x800000 corectrl_size=0x800000 ctrl=0xffffff corectrl=0x1fff” > /sys/dla/ipu_log
ctrl_size和corectrl_size是为ctrl log和corectrl log分配buffer的大小,ctrl和corectrl是ctrl log和corectrl log的配置。