joint.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. #ifndef _AX_JOINT_H_
  2. #define _AX_JOINT_H_
  3. #include "ax_base_type.h"
  4. #include "ax_global_type.h"
  5. #include "ax_interpreter_external_api.h"
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. const AX_CHAR* AX_JOINT_GetVersion();
  10. typedef AX_VOID* AX_JOINT_HANDLE;
  11. typedef AX_VOID* AX_JOINT_EXECUTION_CONTEXT;
  12. typedef AX_VOID* AX_JOINT_ASYNC_TASK_HANDLE;
  13. typedef AX_VOID (*AX_JOINT_ASYNC_CB)(AX_S32 error_code, AX_VOID* user_data);
  14. #define AX_ID_NPU_SMOD_JOINT 0x10
  15. #define AX_ERR_NPU_JOINT_SUCCESS 0x00
  16. #if defined(CHIP_AX620) || defined(CHIP_AX170) || defined(CHIP_AX720)
  17. #define AX_ERR_NPU_JOINT_UNKNOWN_FAILURE \
  18. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x81)
  19. #define AX_ERR_NPU_JOINT_INVALID_PARAM \
  20. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x82)
  21. #define AX_ERR_NPU_JOINT_INIT_FAILED \
  22. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x83)
  23. #define AX_ERR_NPU_JOINT_MALFORMED_TOPOLOGY \
  24. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x84)
  25. #define AX_ERR_NPU_JOINT_CREATE_CONTEXT_FAILED \
  26. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x85)
  27. #define AX_ERR_NPU_JOINT_RUN_FAILED \
  28. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x86)
  29. #elif defined(CHIP_AX630A)
  30. #define AX_ERR_NPU_JOINT_UNKNOWN_FAILURE \
  31. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x01)
  32. #define AX_ERR_NPU_JOINT_INVALID_PARAM \
  33. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x02)
  34. #define AX_ERR_NPU_JOINT_INIT_FAILED \
  35. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x03)
  36. #define AX_ERR_NPU_JOINT_MALFORMED_TOPOLOGY \
  37. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x04)
  38. #define AX_ERR_NPU_JOINT_CREATE_CONTEXT_FAILED \
  39. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x05)
  40. #define AX_ERR_NPU_JOINT_RUN_FAILED \
  41. AX_DEF_ERR(AX_ID_NPU, AX_ID_NPU_SMOD_JOINT, 0x06)
  42. #endif
  43. typedef enum _AX_JOINT_TENSOR_LAYOUT_E {
  44. JOINT_TENSOR_LAYOUT_UNKNOWN = 0,
  45. JOINT_TENSOR_LAYOUT_NHWC = 1,
  46. JOINT_TENSOR_LAYOUT_NCHW = 2
  47. } AX_JOINT_TENSOR_LAYOUT_T;
  48. typedef enum {
  49. AX_JOINT_MT_INVALID = 0,
  50. /*!
  51. * AX_JOINT_MT_PHYSICAL类型内存必须使用AX_SYS_Mem接口分配/释放内存空间
  52. * AX_JOINT_MT_VIRTUAL类型内存使用malloc(new)/free(delete)等接口分配/释放内存空间
  53. */
  54. AX_JOINT_MT_PHYSICAL = 1,
  55. AX_JOINT_MT_VIRTUAL = 2,
  56. } AX_JOINT_MEMORY_TYPE_T;
  57. typedef enum {
  58. AX_JOINT_DT_UNKNOWN = 0,
  59. AX_JOINT_DT_UINT8 = 1,
  60. AX_JOINT_DT_UINT16 = 2,
  61. AX_JOINT_DT_FLOAT32 = 3,
  62. AX_JOINT_DT_SINT16 = 4,
  63. AX_JOINT_DT_SINT8 = 5,
  64. AX_JOINT_DT_SINT32 = 6,
  65. AX_JOINT_DT_UINT32 = 7,
  66. AX_JOINT_DT_FLOAT64 = 8,
  67. AX_JOINT_DT_SINT64 = 9,
  68. AX_JOINT_DT_UINT64 = 10,
  69. // data bits stored in compact form
  70. AX_JOINT_DT_UINT10_PACKED = 100,
  71. AX_JOINT_DT_UINT12_PACKED = 101,
  72. AX_JOINT_DT_UINT14_PACKED = 102,
  73. AX_JOINT_DT_UINT16_PACKED = 103,
  74. } AX_JOINT_DATA_TYPE_T;
  75. typedef enum {
  76. AX_JOINT_CS_FEATUREMAP = 0,
  77. AX_JOINT_CS_RAW8 = 12,
  78. AX_JOINT_CS_RAW10 = 1,
  79. AX_JOINT_CS_RAW12 = 2,
  80. AX_JOINT_CS_RAW14 = 11,
  81. AX_JOINT_CS_RAW16 = 3,
  82. AX_JOINT_CS_NV12 = 4,
  83. AX_JOINT_CS_NV21 = 5,
  84. AX_JOINT_CS_RGB = 6,
  85. AX_JOINT_CS_BGR = 7,
  86. AX_JOINT_CS_RGBA = 8,
  87. AX_JOINT_CS_GRAY = 9,
  88. AX_JOINT_CS_YUV444 = 10
  89. } AX_JOINT_COLOR_SPACE_T;
  90. typedef enum {
  91. // RuntimeVar 属于 NPU 硬件特有机制,请详询技术支持
  92. AX_JOINT_NOT_RTV = 0,
  93. AX_JOINT_RTV_AFFINE = 1,
  94. AX_JOINT_RTV_DMA_CCM_AX630A = 2, // deprecated
  95. AX_JOINT_RTV_WB_CLIP = 3,
  96. AX_JOINT_RTV_WB_MASK_RATIO = 4,
  97. AX_JOINT_RTV_DRC_PARAM = 5, // deprecated
  98. AX_JOINT_RTV_WB_SRC_RATIO = 6,
  99. AX_JOINT_RTV_WARP_CCM = 7,
  100. AX_JOINT_RTV_WARP_MAT33 = 8,
  101. AX_JOINT_RTV_YDRC_CONTEXT = 9,
  102. AX_JOINT_RTV_YDRC_OFFSET = 10,
  103. AX_JOINT_RTV_YDRC_DITHER = 11,
  104. AX_JOINT_RTV_YDRC_LUT = 12,
  105. AX_JOINT_RTV_WAIT_IFE_DONE = 13,
  106. AX_JOINT_RTV_HAAR_SHRINKAGE_COEFF = 14,
  107. AX_JOINT_RTV_HAAR_BLEND_COEFF = 15,
  108. AX_JOINT_RTV_HAAR_FTZ = 16,
  109. AX_JOINT_RTV_HAAR_BLEND_WEIGHT = 17,
  110. AX_JOINT_RTV_HAAR_SHRINKAGE_WEIGHT = 18,
  111. AX_JOINT_RTV_HAAR_OFFSET = 19,
  112. AX_JOINT_RTV_WB_DRC_BASE = 20,
  113. AX_JOINT_RTV_WB_DRC_LUT = 21,
  114. AX_JOINT_RTV_HSK_OCM_WAIT_ITP_EUS = 22
  115. } AX_JOINT_RTV_TYPE_T;
  116. typedef struct _AX_JOINT_IOMETA_EX_T {
  117. AX_JOINT_COLOR_SPACE_T eColorSpace;
  118. AX_JOINT_RTV_TYPE_T eRtvType;
  119. AX_U64 u64Reserved[7];
  120. } AX_JOINT_IOMETA_EX_T;
  121. typedef struct _AX_JOINT_SDK_ATTR_T {
  122. AX_NPU_SDK_EX_HARD_MODE_T eNpuMode;
  123. AX_U64 u64Reserved[7];
  124. } AX_JOINT_SDK_ATTR_T;
  125. typedef struct _AX_JOINT_IOMETA_T {
  126. AX_CHAR* pName;
  127. AX_S32* pShape; // YUV will be treated as 1-ch data
  128. AX_U8 nShapeSize; // dimension of shape
  129. AX_JOINT_TENSOR_LAYOUT_T eLayout;
  130. AX_JOINT_MEMORY_TYPE_T eMemoryType;
  131. AX_JOINT_DATA_TYPE_T eDataType;
  132. AX_JOINT_IOMETA_EX_T* pExtraMeta;
  133. AX_U32 nSize;
  134. /*!
  135. * `nQuantizationValue` is the total amount of possible values
  136. * in quantization part of a data represented in `Q` method
  137. * eg. for U4Q12 data, nQuantizationValue = 2**12 = 4096
  138. */
  139. AX_U32 nQuantizationValue;
  140. /*!
  141. * when pStride is NULL, there is not stride limit
  142. *
  143. * when pStride is not NULL, it holds the number of elements in stride
  144. * of each dimension, the size of `pStride` always equal to `nShapeSize`
  145. * eg. index[0:3] shape[n,c,h,w] stride[chw,hw,w,1]
  146. * eg. index[0:3] shape[n,h,w,c] stride[hwc,wc,c,1]
  147. */
  148. AX_S32* pStride;
  149. #if defined(__aarch64__)
  150. AX_U64 u64Reserved[9];
  151. #elif defined(__arm__)
  152. AX_U64 u64Reserved[11];
  153. #endif
  154. } AX_JOINT_IOMETA_T;
  155. typedef enum {
  156. AX_JOINT_QT_BIT_UNKNOWN = 0,
  157. AX_JOINT_QT_BIT_8 = 1,
  158. AX_JOINT_QT_BIT_16 = 2,
  159. AX_JOINT_QT_BIT_32 = 3,
  160. AX_JOINT_QT_BIT_MIX = 4
  161. } AX_JOINT_QUANTIZATION_TYPE_T;
  162. typedef struct _AX_JOINT_IO_INFO_T {
  163. AX_JOINT_IOMETA_T* pInputs;
  164. AX_U32 nInputSize;
  165. AX_JOINT_IOMETA_T* pOutputs;
  166. AX_U32 nOutputSize;
  167. AX_U32 nMaxBatchSize; // 0 for unlimited
  168. AX_BOOL bDynamicBatchSize; // if true, any batch size <= nMaxBatchSize is
  169. // supported
  170. AX_JOINT_QUANTIZATION_TYPE_T
  171. eQuantizationType; // model quantization type: BIT_8, BIT_16, BIT_32,
  172. // BIT_MIX
  173. // FilterMode
  174. // 是一种软硬联合的独特设计,用于加速检测类模型的推理,使用方式请详询技术支持
  175. AX_BOOL bFilterMode;
  176. #if defined(__aarch64__)
  177. AX_U64 u64Reserved[10];
  178. #elif defined(__arm__)
  179. AX_U64 u64Reserved[12];
  180. #endif
  181. } AX_JOINT_IO_INFO_T;
  182. typedef struct _AX_JOINT_IO_BUFFER_T {
  183. AX_ADDR phyAddr;
  184. AX_VOID* pVirAddr;
  185. AX_U32 nSize; // total size of memory
  186. /*!
  187. * pStride holds the number of elements in stride of each dimension
  188. * set pStride to NULL to disable stride function
  189. *
  190. * `nStrideSize` should be equal to `nShapeSize`
  191. * eg. index[0:3] shape[n,c,h,w] stride[chw,hw,w,1]
  192. * eg. index[0:3] shape[n,h,w,c] stride[hwc,wc,c,1]
  193. */
  194. AX_S32* pStride;
  195. AX_U8 nStrideSize;
  196. #if defined(__aarch64__)
  197. AX_U64 u64Reserved[11];
  198. #elif defined(__arm__)
  199. AX_U64 u64Reserved[13];
  200. #endif
  201. } AX_JOINT_IO_BUFFER_T;
  202. typedef struct _AX_JOINT_IO_SETTING_T {
  203. AX_U32 nWbtIndex;
  204. AX_U64 u64Reserved[7];
  205. } AX_JOINT_IO_SETTING_T;
  206. typedef struct _AX_JOINT_IO_T {
  207. AX_JOINT_IO_BUFFER_T* pInputs;
  208. AX_U32 nInputSize;
  209. AX_JOINT_IO_BUFFER_T* pOutputs;
  210. AX_U32 nOutputSize;
  211. AX_U32 nBatchSize; // 0 for auto detection
  212. AX_JOINT_IO_SETTING_T* pIoSetting;
  213. #if defined(__aarch64__)
  214. AX_U64 u64Reserved[11];
  215. #elif defined(__arm__)
  216. AX_U64 u64Reserved[13];
  217. #endif
  218. } AX_JOINT_IO_T;
  219. typedef struct _AX_JOINT_EXECUTION_CONTEXT_SETTING_T {
  220. AX_U32 nBatchSize; // 0 for self-adaption
  221. AX_BOOL bNoCacheMem; // set true to disable cached mem
  222. AX_U64 u64Reserved[7];
  223. } AX_JOINT_EXECUTION_CONTEXT_SETTING_T;
  224. typedef struct AX_JOINT_MODEL_CMM_INFO {
  225. AX_U32 nCMMSize;
  226. } AX_JOINT_MODEL_CMM_INFO;
  227. typedef struct AX_JOINT_HANDLE_SETTING_T {
  228. AX_CHAR* name; // if nullptr or empty, handle name will fallback to "null",
  229. // only work on AX620
  230. AX_U64 u64Reserved[7];
  231. } AX_JOINT_HANDLE_SETTING_T;
  232. /*
  233. * 使用 Adv_Init 接口时,请务必调用配套的 Adv_Deinit 接口
  234. * AX_JOINT_Adv_Init/Deinit 接口会对应调用 ax_interpreter_external_api 的
  235. * Init/Deinit 接口,用户无需再重复调用
  236. */
  237. AX_S32 AX_JOINT_Adv_Init(AX_JOINT_SDK_ATTR_T* pAttr);
  238. AX_S32 AX_JOINT_Adv_Deinit(AX_VOID);
  239. AX_S32 AX_JOINT_CreateHandle(AX_JOINT_HANDLE* pHandle, const AX_VOID* pData,
  240. AX_U32 nDataSize);
  241. AX_S32 AX_JOINT_CreateHandleV2(AX_JOINT_HANDLE* pHandle, const AX_VOID* pData,
  242. AX_U32 nDataSize,
  243. AX_JOINT_HANDLE_SETTING_T* pSetting);
  244. AX_S32 AX_JOINT_DestroyHandle(AX_JOINT_HANDLE handle);
  245. const AX_JOINT_IO_INFO_T* AX_JOINT_GetIOInfo(AX_JOINT_HANDLE handle);
  246. // CreateExecutionContext will self-adapt batch size, but may consume more RAM
  247. AX_S32 AX_JOINT_CreateExecutionContext(AX_JOINT_HANDLE handle,
  248. AX_JOINT_EXECUTION_CONTEXT* pContext);
  249. // use CreateExecutionContextV2 for precise memory control
  250. AX_S32 AX_JOINT_CreateExecutionContextV2(
  251. AX_JOINT_HANDLE handle, AX_JOINT_EXECUTION_CONTEXT* pContext,
  252. AX_JOINT_EXECUTION_CONTEXT_SETTING_T* pSetting);
  253. AX_S32 AX_JOINT_DestroyExecutionContext(AX_JOINT_EXECUTION_CONTEXT context);
  254. AX_S32 AX_JOINT_RunSync(AX_JOINT_HANDLE handle,
  255. AX_JOINT_EXECUTION_CONTEXT context, AX_JOINT_IO_T* pIO);
  256. AX_S32 AX_JOINT_RunAsync(AX_JOINT_HANDLE handle,
  257. AX_JOINT_EXECUTION_CONTEXT context, AX_JOINT_IO_T* pIO,
  258. AX_JOINT_ASYNC_CB callback, AX_VOID* user_data,
  259. AX_JOINT_ASYNC_TASK_HANDLE* task_handle);
  260. AX_S32 AX_JOINT_CancelTask(AX_JOINT_HANDLE handle,
  261. AX_JOINT_EXECUTION_CONTEXT context,
  262. AX_JOINT_ASYNC_TASK_HANDLE task_handle);
  263. AX_S32 AX_JOINT_DestroyTaskHandle(AX_JOINT_HANDLE handle,
  264. AX_JOINT_EXECUTION_CONTEXT context,
  265. AX_JOINT_ASYNC_TASK_HANDLE task_handle);
  266. // 以下两个接口用于封装底层细节。可以直接调用 SYS 相关接口。
  267. typedef enum {
  268. AX_JOINT_ABST_DEFAULT = 0,
  269. AX_JOINT_ABST_CACHED = 1,
  270. } AX_JOINT_ALLOC_BUFFER_STRATEGY_T;
  271. AX_S32 AX_JOINT_AllocBuffer(const AX_JOINT_IOMETA_T* pMeta,
  272. AX_JOINT_IO_BUFFER_T* pBuf,
  273. AX_JOINT_ALLOC_BUFFER_STRATEGY_T eStrategy);
  274. AX_S32 AX_JOINT_FreeBuffer(AX_JOINT_IO_BUFFER_T* pBuf);
  275. /*
  276. * Get model type from joint file
  277. * This interface can be called at any time, even if AX_JOINT_Init is not
  278. * called. \param - [IN] pJoint: joint file data \param - [IN] nJointSize:
  279. * joint file size \param - [OUT] pModelType: model type
  280. */
  281. AX_S32 AX_JOINT_GetJointModelType(const AX_CHAR* pJoint, AX_U32 nJointSize,
  282. AX_NPU_SDK_EX_MODEL_TYPE_T* pModelType);
  283. AX_S32 AX_JOINT_GetVNPUMode(AX_JOINT_HANDLE handle,
  284. AX_NPU_SDK_EX_MODEL_TYPE_T* pModelType);
  285. AX_S32 AX_JOINT_GetVNPUHardMode(AX_NPU_SDK_EX_HARD_MODE_T* pHardMode);
  286. const AX_CHAR* AX_JOINT_GetModelToolsVersion(AX_JOINT_HANDLE handle);
  287. /*
  288. * Get CMM usage info (in Byte) from handle
  289. */
  290. AX_S32 AX_JOINT_GetCMMUsage(AX_JOINT_HANDLE handle,
  291. AX_JOINT_MODEL_CMM_INFO* cmm_info);
  292. #ifdef __cplusplus
  293. }
  294. #endif
  295. #endif