505 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			505 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /****************************************************************************
 | |
| *
 | |
| *    Copyright (c) 2017 - 2018 by Rockchip Corp.  All rights reserved.
 | |
| *
 | |
| *    The material in this file is confidential and contains trade secrets
 | |
| *    of Rockchip Corporation. This is proprietary information owned by
 | |
| *    Rockchip Corporation. No part of this work may be disclosed,
 | |
| *    reproduced, copied, transmitted, or used in any way for any purpose,
 | |
| *    without the express written permission of Rockchip Corporation.
 | |
| *
 | |
| *****************************************************************************/
 | |
| 
 | |
| 
 | |
| #ifndef _RKNN_RUNTIME_H
 | |
| #define _RKNN_RUNTIME_H
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| #include <stdint.h>
 | |
| 
 | |
| /*
 | |
|     Definition of extended flag for rknn_init.
 | |
| */
 | |
| /* set high priority context. */
 | |
| #define RKNN_FLAG_PRIOR_HIGH                    0x00000000
 | |
| 
 | |
| /* set medium priority context */
 | |
| #define RKNN_FLAG_PRIOR_MEDIUM                  0x00000001
 | |
| 
 | |
| /* set low priority context. */
 | |
| #define RKNN_FLAG_PRIOR_LOW                     0x00000002
 | |
| 
 | |
| /* asynchronous mode.
 | |
|    when enable, rknn_outputs_get will not block for too long because it directly retrieves the result of
 | |
|    the previous frame which can increase the frame rate on single-threaded mode, but at the cost of
 | |
|    rknn_outputs_get not retrieves the result of the current frame.
 | |
|    in multi-threaded mode you do not need to turn this mode on. */
 | |
| #define RKNN_FLAG_ASYNC_MASK                    0x00000004
 | |
| 
 | |
| /* collect performance mode.
 | |
|    when enable, you can get detailed performance reports via rknn_query(ctx, RKNN_QUERY_PERF_DETAIL, ...),
 | |
|    but it will reduce the frame rate. */
 | |
| #define RKNN_FLAG_COLLECT_PERF_MASK             0x00000008
 | |
| 
 | |
| /*
 | |
|    save pre-compile model.
 | |
| */
 | |
| #define RKNN_FLAG_PRECOMPILE_MASK               0x00000020
 | |
| 
 | |
| /*
 | |
|     Error code returned by the RKNN API.
 | |
| */
 | |
| #define RKNN_SUCC                               0       /* execute succeed. */
 | |
| #define RKNN_ERR_FAIL                           -1      /* execute failed. */
 | |
| #define RKNN_ERR_TIMEOUT                        -2      /* execute timeout. */
 | |
| #define RKNN_ERR_DEVICE_UNAVAILABLE             -3      /* device is unavailable. */
 | |
| #define RKNN_ERR_MALLOC_FAIL                    -4      /* memory malloc fail. */
 | |
| #define RKNN_ERR_PARAM_INVALID                  -5      /* parameter is invalid. */
 | |
| #define RKNN_ERR_MODEL_INVALID                  -6      /* model is invalid. */
 | |
| #define RKNN_ERR_CTX_INVALID                    -7      /* context is invalid. */
 | |
| #define RKNN_ERR_INPUT_INVALID                  -8      /* input is invalid. */
 | |
| #define RKNN_ERR_OUTPUT_INVALID                 -9      /* output is invalid. */
 | |
| #define RKNN_ERR_DEVICE_UNMATCH                 -10     /* the device is unmatch, please update rknn sdk
 | |
|                                                            and npu driver/firmware. */
 | |
| #define RKNN_ERR_INCOMPATILE_PRE_COMPILE_MODEL  -11     /* This RKNN model use pre_compile mode, but not compatible with current driver. */
 | |
| //add by chifred: for reporting optimization version bug info
 | |
| #define RKNN_ERR_INCOMPATILE_OPTIMIZATION_LEVEL_VERSION  -12     /* This RKNN model set optimization level, but not compatible with current driver. */
 | |
| #define RKNN_ERR_TARGET_PLATFORM_UNMATCH        -13     /* This RKNN model set target platform, but not compatible with current platform. */
 | |
| //chifred add end
 | |
| #define RKNN_ERR_NON_PRE_COMPILED_MODEL_ON_MINI_DRIVER -14  /* This RKNN model is not a pre-compiled model, but the npu driver is mini driver. */
 | |
| 
 | |
| /*
 | |
|     Definition for tensor
 | |
| */
 | |
| #define RKNN_MAX_DIMS                           16      /* maximum dimension of tensor. */
 | |
| #define RKNN_MAX_NAME_LEN                       256     /* maximum name lenth of tensor. */
 | |
| 
 | |
| 
 | |
| 
 | |
| #ifdef __arm__
 | |
| typedef uint32_t rknn_context;
 | |
| #else
 | |
| typedef uint64_t rknn_context;
 | |
| #endif
 | |
| 
 | |
| /*
 | |
|     The query command for rknn_query
 | |
| */
 | |
| typedef enum _rknn_query_cmd {
 | |
|     RKNN_QUERY_IN_OUT_NUM = 0,                          /* query the number of input & output tensor. */
 | |
|     RKNN_QUERY_INPUT_ATTR,                              /* query the attribute of input tensor. */
 | |
|     RKNN_QUERY_OUTPUT_ATTR,                             /* query the attribute of output tensor. */
 | |
|     RKNN_QUERY_PERF_DETAIL,                             /* query the detail performance, need set
 | |
|                                                            RKNN_FLAG_COLLECT_PERF_MASK when call rknn_init. */
 | |
|     RKNN_QUERY_PERF_RUN,                                /* query the time of run. */
 | |
|     RKNN_QUERY_SDK_VERSION,                             /* query the sdk & driver version */
 | |
|     RKNN_QUERY_PRE_COMPILE,                             /* query the pre compile model */
 | |
| 
 | |
|     RKNN_QUERY_CMD_MAX
 | |
| } rknn_query_cmd;
 | |
| 
 | |
| /*
 | |
|     the tensor data type.
 | |
| */
 | |
| typedef enum _rknn_tensor_type {
 | |
|     RKNN_TENSOR_FLOAT32 = 0,                            /* data type is float32. */
 | |
|     RKNN_TENSOR_FLOAT16,                                /* data type is float16. */
 | |
|     RKNN_TENSOR_INT8,                                   /* data type is int8. */
 | |
|     RKNN_TENSOR_UINT8,                                  /* data type is uint8. */
 | |
|     RKNN_TENSOR_INT16,                                  /* data type is int16. */
 | |
| 
 | |
|     RKNN_TENSOR_TYPE_MAX
 | |
| } rknn_tensor_type;
 | |
| 
 | |
| /*
 | |
|     the quantitative type.
 | |
| */
 | |
| typedef enum _rknn_tensor_qnt_type {
 | |
|     RKNN_TENSOR_QNT_NONE = 0,                           /* none. */
 | |
|     RKNN_TENSOR_QNT_DFP,                                /* dynamic fixed point. */
 | |
|     RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC,                  /* asymmetric affine. */
 | |
| 
 | |
|     RKNN_TENSOR_QNT_MAX
 | |
| } rknn_tensor_qnt_type;
 | |
| 
 | |
| /*
 | |
|     the tensor data format.
 | |
| */
 | |
| typedef enum _rknn_tensor_format {
 | |
|     RKNN_TENSOR_NCHW = 0,                               /* data format is NCHW. */
 | |
|     RKNN_TENSOR_NHWC,                                   /* data format is NHWC. */
 | |
| 
 | |
|     RKNN_TENSOR_FORMAT_MAX
 | |
| } rknn_tensor_format;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_IN_OUT_NUM.
 | |
| */
 | |
| typedef struct _rknn_input_output_num {
 | |
|     uint32_t n_input;                                   /* the number of input. */
 | |
|     uint32_t n_output;                                  /* the number of output. */
 | |
| } rknn_input_output_num;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_INPUT_ATTR / RKNN_QUERY_OUTPUT_ATTR.
 | |
| */
 | |
| typedef struct _rknn_tensor_attr {
 | |
|     uint32_t index;                                     /* input parameter, the index of input/output tensor,
 | |
|                                                            need set before call rknn_query. */
 | |
| 
 | |
|     uint32_t n_dims;                                    /* the number of dimensions. */
 | |
|     uint32_t dims[RKNN_MAX_DIMS];                       /* the dimensions array. */
 | |
|     char name[RKNN_MAX_NAME_LEN];                       /* the name of tensor. */
 | |
| 
 | |
|     uint32_t n_elems;                                   /* the number of elements. */
 | |
|     uint32_t size;                                      /* the bytes size of tensor. */
 | |
| 
 | |
|     rknn_tensor_format fmt;                             /* the data format of tensor. */
 | |
|     rknn_tensor_type type;                              /* the data type of tensor. */
 | |
|     rknn_tensor_qnt_type qnt_type;                      /* the quantitative type of tensor. */
 | |
|     int8_t fl;                                          /* fractional length for RKNN_TENSOR_QNT_DFP. */
 | |
|     uint32_t zp;                                        /* zero point for RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC. */
 | |
|     float scale;                                        /* scale for RKNN_TENSOR_QNT_AFFINE_ASYMMETRIC. */
 | |
| } rknn_tensor_attr;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_PERF_DETAIL.
 | |
| */
 | |
| typedef struct _rknn_perf_detail {
 | |
|     char* perf_data;                                    /* the string pointer of perf detail. don't need free it by user. */
 | |
|     uint64_t data_len;                                  /* the string length. */
 | |
| } rknn_perf_detail;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_PERF_RUN.
 | |
| */
 | |
| typedef struct _rknn_perf_run {
 | |
|     int64_t run_duration;                               /* real inference time (us) */
 | |
| } rknn_perf_run;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_SDK_VERSION.
 | |
| */
 | |
| typedef struct _rknn_sdk_version {
 | |
|     char api_version[256];                              /* the version of rknn api. */
 | |
|     char drv_version[256];                              /* the version of rknn driver. */
 | |
| } rknn_sdk_version;
 | |
| 
 | |
| /*
 | |
|    The flags of rknn_tensor_mem.
 | |
| */
 | |
| typedef enum _rknn_tensor_mem_flags {
 | |
|     RKNN_TENSOR_MEMORY_FLAGS_UNKNOWN = 0,
 | |
|     RKNN_TENSOR_MEMORY_FLAGS_ALLOC_INSIDE = 1,           /*Used to mark in rknn_destroy_mem() whether it is necessary to release the "mem" pointer itself.
 | |
|                                                          If the flag RKNN_TENSOR_MEMORY_FLAGS_ALLOC_INSIDE is set, rknn_destroy_mem() will call free(mem).*/
 | |
|    
 | |
| } rknn_tensor_mem_flags;
 | |
| 
 | |
| 
 | |
| /*
 | |
|     the memory information of tensor.
 | |
| */
 | |
| typedef struct _rknn_tensor_memory {
 | |
|     void*       logical_addr;                           /* the virtual address of tensor buffer. */
 | |
|     uint64_t    physical_addr;                          /* the physical address of tensor buffer. */
 | |
|     int32_t     fd;                                     /* the fd of tensor buffer. */
 | |
|     uint32_t    size;                                   /* the size of tensor buffer. */
 | |
|     uint32_t    handle;                                 /* the handle tensor buffer. */
 | |
|     void *      priv_data;                              /* the data which is reserved. */
 | |
|     uint64_t reserved_flag;                             /* the flag which is reserved. */
 | |
| } rknn_tensor_mem;
 | |
| 
 | |
| /*
 | |
|     the input information for rknn_input_set.
 | |
| */
 | |
| typedef struct _rknn_input {
 | |
|     uint32_t index;                                     /* the input index. */
 | |
|     void* buf;                                          /* the input buf for index. */
 | |
|     uint32_t size;                                      /* the size of input buf. */
 | |
|     uint8_t pass_through;                               /* pass through mode.
 | |
|                                                            if TRUE, the buf data is passed directly to the input node of the rknn model
 | |
|                                                                     without any conversion. the following variables do not need to be set.
 | |
|                                                            if FALSE, the buf data is converted into an input consistent with the model
 | |
|                                                                      according to the following type and fmt. so the following variables
 | |
|                                                                      need to be set.*/
 | |
|     rknn_tensor_type type;                              /* the data type of input buf. */
 | |
|     rknn_tensor_format fmt;                             /* the data format of input buf.
 | |
|                                                            currently the internal input format of NPU is NCHW by default.
 | |
|                                                            so entering NCHW data can avoid the format conversion in the driver. */
 | |
| } rknn_input;
 | |
| 
 | |
| /*
 | |
|     the output information for rknn_outputs_get.
 | |
| */
 | |
| typedef struct _rknn_output {
 | |
|     uint8_t want_float;                                 /* want transfer output data to float */
 | |
|     uint8_t is_prealloc;                                /* whether buf is pre-allocated.
 | |
|                                                            if true, the following variables need to be set.
 | |
|                                                            if false, The following variables do not need to be set. */
 | |
|     uint32_t index;                                     /* the output index. */
 | |
|     void* buf;                                          /* the output buf for index.
 | |
|                                                            when is_prealloc = FALSE and rknn_outputs_release called,
 | |
|                                                            this buf pointer will be free and don't use it anymore. */
 | |
|     uint32_t size;                                      /* the size of output buf. */
 | |
| } rknn_output;
 | |
| 
 | |
| /*
 | |
|     the extend information for rknn_run.
 | |
| */
 | |
| typedef struct _rknn_run_extend {
 | |
|     uint64_t frame_id;                                  /* output parameter, indicate current frame id of run. */
 | |
| } rknn_run_extend;
 | |
| 
 | |
| /*
 | |
|     the extend information for rknn_outputs_get.
 | |
| */
 | |
| typedef struct _rknn_output_extend {
 | |
|     uint64_t frame_id;                                  /* output parameter, indicate the frame id of outputs, corresponds to
 | |
|                                                            struct rknn_run_extend.frame_id.*/
 | |
| } rknn_output_extend;
 | |
| 
 | |
| /*
 | |
|     the information for RKNN_QUERY_RKNN_PRECOMPILE.
 | |
| */
 | |
| typedef struct _rknn_precompile {
 | |
|     void* model_data;                                   /* the pointer of precompile model. don't need free it by user. */
 | |
|     uint32_t data_len;                                  /* the model length. */
 | |
| } rknn_precompile;
 | |
| 
 | |
| 
 | |
| /*  rknn_init
 | |
| 
 | |
|     initial the context and load the rknn model.
 | |
| 
 | |
|     input:
 | |
|         rknn_context* context       the pointer of context handle.
 | |
|         void* model                 pointer to the rknn model.
 | |
|         uint32_t size               the size of rknn model.
 | |
|         uint32_t flag               extend flag, see the define of RKNN_FLAG_XXX_XXX.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_init(rknn_context* context, void* model, uint32_t size, uint32_t flag);
 | |
| 
 | |
| 
 | |
| /*  rknn_destroy
 | |
| 
 | |
|     unload the rknn model and destroy the context.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_destroy(rknn_context context);
 | |
| 
 | |
| 
 | |
| /*  rknn_query
 | |
| 
 | |
|     query the information about model or others. see rknn_query_cmd.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         rknn_query_cmd cmd          the command of query.
 | |
|         void* info                  the buffer point of information.
 | |
|         uint32_t size               the size of information.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_query(rknn_context context, rknn_query_cmd cmd, void* info, uint32_t size);
 | |
| 
 | |
| 
 | |
| /*  rknn_inputs_set
 | |
| 
 | |
|     set inputs information by input index of rknn model.
 | |
|     inputs information see rknn_input.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_inputs           the number of inputs.
 | |
|         rknn_input inputs[]         the arrays of inputs information, see rknn_input.
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_inputs_set(rknn_context context, uint32_t n_inputs, rknn_input inputs[]);
 | |
| 
 | |
| 
 | |
| /*  rknn_inputs_map
 | |
| 
 | |
|     map inputs tensor memory information by input index of rknn model.
 | |
|     inputs information see rknn_input.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_inputs           the number of inputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_inputs_map(rknn_context context, uint32_t n_inputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| 
 | |
| /*  rknn_inputs_sync
 | |
| 
 | |
|     synchronize inputs tensor buffer by input index of rknn model.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_inputs           the number of inputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_inputs_sync(rknn_context context, uint32_t n_inputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| 
 | |
| /*  rknn_inputs_unmap
 | |
| 
 | |
|     unmap inputs tensor memory information by input index of rknn model.
 | |
|     inputs information see rknn_input.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_inputs           the number of inputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_inputs_unmap(rknn_context context, uint32_t n_inputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| 
 | |
| /*  rknn_run
 | |
| 
 | |
|     run the model to execute inference.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         rknn_run_extend* extend     the extend information of run.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_run(rknn_context context, rknn_run_extend* extend);
 | |
| 
 | |
| 
 | |
| /*  rknn_outputs_get
 | |
| 
 | |
|     wait the inference to finish and get the outputs.
 | |
|     this function will block until inference finish.
 | |
|     the results will set to outputs[].
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_outputs          the number of outputs.
 | |
|         rknn_output outputs[]       the arrays of output, see rknn_output.
 | |
|         rknn_output_extend*         the extend information of output.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_outputs_get(rknn_context context, uint32_t n_outputs, rknn_output outputs[], rknn_output_extend* extend);
 | |
| 
 | |
| 
 | |
| /*  rknn_outputs_release
 | |
| 
 | |
|     release the outputs that get by rknn_outputs_get.
 | |
|     after called, the rknn_output[x].buf get from rknn_outputs_get will
 | |
|     also be free when rknn_output[x].is_prealloc = FALSE.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_ouputs           the number of outputs.
 | |
|         rknn_output outputs[]       the arrays of output.
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_outputs_release(rknn_context context, uint32_t n_ouputs, rknn_output outputs[]);
 | |
| 
 | |
| 
 | |
| /*  rknn_outputs_map
 | |
| 
 | |
|     map the model output tensors memory information.
 | |
|     The difference between this function and "rknn_outputs_get" is
 | |
|     that it directly maps the model output tensor memory location to the user.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_outputs          the number of outputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_outputs_map(rknn_context context, uint32_t n_outputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| /*  rknn_outputs_sync
 | |
| 
 | |
|     synchronize the output tensors buffer to ensure cache cohenrency, wait the inference to finish.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_outputs          the number of outputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_outputs_sync(rknn_context context, uint32_t n_outputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| /*  rknn_outputs_unmap
 | |
| 
 | |
|     unmap the outputs memory information that get by rknn_outputs_map.
 | |
| 
 | |
|     input:
 | |
|         rknn_context context        the handle of context.
 | |
|         uint32_t n_ouputs           the number of outputs.
 | |
|         rknn_tensor_mem mem[]       the array of tensor memory information
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_outputs_unmap(rknn_context context, uint32_t n_ouputs, rknn_tensor_mem mem[]);
 | |
| 
 | |
| /*  rknn_create_mem (memory allocated inside)
 | |
| 
 | |
|     Create tensor memory. This API require libdrm support!
 | |
| 
 | |
|     input:
 | |
|         rknn_context ctx            the handle of context.
 | |
|         uint64_t size               the size of tensor buffer.
 | |
|     return:
 | |
|         rknn_tensor_mem             the pointer of tensor memory information.
 | |
| */
 | |
| rknn_tensor_mem* rknn_create_mem(rknn_context ctx, uint64_t size);
 | |
| 
 | |
| /*  rknn_destroy_mem (support allocate inside and outside)
 | |
| 
 | |
|     destroy tensor memory.
 | |
| 
 | |
|     input:
 | |
|         rknn_context ctx            the handle of context.
 | |
|         rknn_tensor_mem *mem        the pointer of tensor memory information.
 | |
|     return:
 | |
|         int                         error code
 | |
| */
 | |
| int rknn_destroy_mem(rknn_context ctx, rknn_tensor_mem *mem);
 | |
| 
 | |
| 
 | |
| 
 | |
| /*  rknn_set_io_mem
 | |
| 
 | |
|     set the input and output tensors buffer.
 | |
| 
 | |
|     input:
 | |
|         rknn_context ctx            the handle of context.
 | |
|         rknn_tensor_mem *mem        the array of tensor memory information.
 | |
|         rknn_tensor_attr *attr      the attribute of input or output tensor buffer.
 | |
|     return:
 | |
|         int                         error code.
 | |
| */
 | |
| int rknn_set_io_mem(rknn_context ctx, rknn_tensor_mem *mem, rknn_tensor_attr *attr);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| } //extern "C"
 | |
| #endif
 | |
| 
 | |
| #endif  //_RKNN_RUNTIME_H
 |