MI IPU API


REVISION HISTORY

Revision No.
Description
Date
3.0
  • Initial release
  • 07/23/2021
  • Added PROCFS introduction
  • 08/25/2021
  • Modify default ipu firmware file path
  • Modify parameter(pReadCtx) description of MI_IPU_CreateCHN
  • Modify maximum channel number
  • Modify the usage of tensor shape
  • Modify maximum tensor dimension
  • Modify error codes
  • Modify ipu frequency path on /sys
  • 11/30/2021
  • Add swdisp related error codes
  • Add u64BandWidthRead/u64BandWidthWrite to MI_IPU_RuntimeInfo_t structure
  • Add ipu buffer alignment error code
  • 12/21/2021
  • Modify IPU buffer alignment number
  • 01/20/2022
  • Add MI_IPU_Invoke2Custom function
  • Modify error codes
  • Add MI_IPU_FORMAT_GRAY tensor format
  • Add member 'u32BufSize', 'u32InputWidthAlignment', 'u32InputHeightAlignment', 'bOutputNCHW' in MI_IPU_TensorDesc_t
  • 02/25/2022
  • Add error code ‘E_IPU_ERR_MISMATCH_MODEL’
  • 06/01/2022
  • Add enum type ‘MI_IPU_BatchMode_e’, ‘MI_IPU_LayoutType_e’, ‘MI_IPU_IpuWorkMode_e’
  • Modify member ‘bOutputNCHW’ to ‘eLayoutType’ and add new member ‘au32Reserve[4]’ in MI_IPU_TensorDesc_t
  • Add new member ‘au32Reserve[8]’ in MI_IPU_DevAttr_t
  • Add new member ‘au32Reserve[8]’ in MI_IPUChnAttr_t
  • Add new member ‘au32Reserve[8]’ in MI_IPU_BatchInvokeParam_t
  • Add new member ‘au32Reserve[8]’ in MI_IPU_RuntimeInfo_t
  • Add new member ‘au32Reserve[8]’, ‘eBatchMode’, ‘u32TotalBatchNumTypes’, ‘au32BatchNumTypes[MI_IPU_MAX_BATCH_TYPE_NUM]’, ‘eIpuWorkMode’ in MI_IPU_OfflineModelStaticInfo_t
  • 06/13/2022
  • In MI_IPU_RuntimeInfo_t, comment the unit of ‘u64IpuTime’ as ms.
  • In MI_IPU_OfflineModelStaticInfo_t, add description for ‘au32BatchNumTypes[1]’ as max batchNum suggested.
  • 08/15/2022
  • Add error code ‘E_IPU_ERR_INVOKE_INTERRUPT’
    -Add tensor format ‘MI_IPU_FORMAT_COMPLEX64’
    -Modify debug command for IPU version
  • 10/27/2022
  • Add API ‘MI_S32 MI_IPU_CreateCHNWithUserMem(MI_IPU_CHN *ptChnId, MI_IPUChnAttr_t *pstChnAttr, MI_PHY u64ModelPA)’.
  • 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种方式:

        1. 通过MI_IPU_GetInputTensors分配Buffer;

        2. 使用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种方式:

      1. 通过MI_IPU_GetInputTensors2分配Buffer;

      2. 使用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模式
    • 相关数据类型及接口

      MI_IPU_OfflineModelStaticInfo_t

      MI_IPU_GetOfflineModeStaticInfo

    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排布
    • 相关数据类型及接口

      MI_IPU_TensorDesc_t

      MI_IPU_GetInOutTensorDesc

    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 模型为多核模式
    • 相关数据类型及接口

      MI_IPU_OfflineModelStaticInfo_t

      MI_IPU_GetOfflineModeStaticInfo


    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默认为1
        YUV_NV12 H = ALIGN_UP(H, input_height_alignment)
        input_height_alignment默认为2
        W = ALIGN_UP(W, input_width_alignment)
        input_width_alignment默认为2
        GRAY H = ALIGN_UP(H, input_height_alignment)
        input_height_alignment默认为1
        W = ALIGN_UP(W, input_width_alignment)
        input_width_alignment默认为1
        RAWDATA_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的配置。