/** * Copyright 2020 Huawei Technologies Co., Ltd * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __CCE_RUNTIME_MODEL_H__ #define __CCE_RUNTIME_MODEL_H__ #include "base.h" #if defined(__cplusplus) && !defined(COMPILE_OMG_PACKAGE) extern "C" { #endif typedef enum tagModelTaskType { RT_MODEL_TASK_KERNEL = 0, RT_MODEL_TASK_EVENT_RECORD, RT_MODEL_TASK_EVENT_WAIT, RT_MODEL_TASK_FUSION_START, RT_MODEL_TASK_FUSION_END, RT_MODEL_TASK_KERNEL_EX, RT_MODEL_TASK_HCCL, RT_MODEL_TASK_STREAM_SWITCH, RT_MODEL_TASK_STREAM_ACTIVE, RT_MODEL_TASK_LABEL_SET, RT_MODEL_TASK_LABEL_SWITCH, RT_MODEL_TASK_LABEL_GOTO, RT_MODEL_TASK_PROFILER_TRACE, RT_MODEL_TASK_MEMCPY_ASYNC, RT_MODEL_TASK_NOTIFY_RECORD, RT_MODEL_TASK_NOTIFY_WAIT, RT_MODEL_TASK_REDUCE_ASYNC, RT_MODEL_TASK_RDMA_SEND, RT_MODEL_TASK_EVENT_RESET = 18, RT_MODEL_TASK_MODEL_END_GRAPH, RT_MODEL_TASK_STREAM_SWITCH_N, RT_MODEL_TASK_RDMA_DB_SEND, RT_MODEL_TASK_MEMCPY_ADDR_ASYNC, RT_MODEL_TASK_STREAM_LABEL_SWITCH_BY_INDEX, RT_MODEL_TASK_STREAM_LABEL_GOTO, RT_MODEL_TASK_MODEL_EXIT, RT_MODEL_TASK_ALL_KERNEL, } rtModelTaskType_t; typedef enum tagModelStreamType { RT_MODEL_HEAD_STREAM = 0, RT_MODEL_WAIT_ACTIVE_STREAM = 1 } rtModelStreamType_t; typedef enum tagModelQueueFlag { RT_MODEL_INPUT_QUEUE = 0, RT_MODEL_OUTPUT_QUEUE = 1 } rtModelQueueFlag_t; #define EXECUTOR_NONE ((uint32_t)0x0) #define EXECUTOR_TS ((uint32_t)0x01) #define EXECUTOR_AICPU ((uint32_t)0x02) /* * @ingroup rt_model * @brief debug flag for kernel exception dump */ #define RT_DEBUG_FLAG_AICORE_OVERFLOW (0x1 << 0) #define RT_DEBUG_FLAG_ATOMIC_ADD_OVERFLOW (0x1 << 1) /** * @ingroup * @brief the type defination of aicpu model task command */ typedef enum tagTsAicpuModelCmd { TS_AICPU_MODEL_LOAD = 1, TS_AICPU_MODEL_EXECUTE, TS_AICPU_MODEL_DESTROY, TS_AICPU_MODEL_ABORT, TS_AICPU_MODEL_RESERVED, } tsAicpuModelCmd; typedef struct tagAicpuTaskInfo { uint32_t taskID; uint32_t streamID; uint32_t kernelType; uint64_t kernelName; uint64_t kernelSo; uint64_t paraBase; uint32_t taskFlag; } rtAicpuTaskInfo_t; typedef struct tagModelStreamInfo { uint32_t streamID; uint32_t streamFlag; } rtModelStreamInfo_t; typedef struct tagModelQueueInfo { uint32_t queueID; uint32_t flag; } rtModelQueueInfo_t; typedef struct tagAicpuModelInfo { uint32_t moduleID; uint32_t tsId; uint16_t streamInfoNum; uint16_t aicpuTaskNum; uint64_t streamInfoPtr; uint64_t aicpuTaskPtr; uint16_t queueSize; uint64_t queueInfoPtr; } rtAicpuModelInfo_t; typedef struct tagKernelTaskInfo { uint16_t blockDim; uint16_t argsCount; uint16_t argsSize; uint16_t reserved; char *stubFunc; uint8_t *smDesc; uint8_t *args; uint16_t *argsOffset; } rtKernelTaskInfo_t; typedef struct tagAllKernelTaskInfo { uint16_t blockDim; uint16_t argsCount; uint16_t argsSize; uint16_t reserved; const void *dev_func; void *handle; uint8_t *smDesc; uint8_t *args; uint16_t *argsOffset; } rtAllKernelTaskInfo_t; typedef struct tagKernelTaskInfoEx { uint32_t flags; uint32_t argsSize; void *args; uint32_t reserved[6]; } rtKernelTaskInfoEx_t; typedef struct tagEventTaskInfo { uint32_t eventID; uint32_t reserved[9]; } rtEventTaskInfo_t; typedef struct tagStreamSwitchTaskInfo { int64_t value; uint64_t pValuePtr; uint32_t trueStreamID; uint32_t dataType; uint32_t reserved[4]; } rtStreamSwitchTaskInfo_t; typedef struct tagStreamSwitchNTaskInfo { uint64_t pValuePtr; uint64_t pTrueStreamPtr; uint32_t size; uint32_t elementSize; uint32_t dataType; uint32_t reserved[3]; } rtStreamSwitchNTaskInfo_t; typedef struct tagStreamActiveTaskInfo { uint32_t activeStreamID; uint32_t reserved[9]; } rtStreamActiveTaskInfo_t; typedef struct tagSetTaskInfo { uint16_t labelId; uint32_t reserved[9]; } rtLabelSetTaskInfo_t; typedef struct tagSwitchTaskInfo { uint32_t value; uint32_t reserved[9]; } rtLabelSwitchTaskInfo_t; typedef struct tagLabelGotoTaskInfo { uint16_t labelId; uint32_t reserved[9]; } rtLabelGotoTaskInfo_t; typedef struct tagProfilerTraceTaskInfo { uint64_t profilerTraceId; uint32_t notify : 8; uint32_t reserved_ : 24; uint32_t flags; uint32_t reserved[6]; } rtProfilerTrace_t; typedef struct tagrtMemcpyAsyncTaskInfo { void *dst; uint64_t destMax; void *src; uint64_t count; uint32_t kind; uint32_t reserved; } rtMemcpyAsyncTaskInfo_t; typedef struct tagrtNotifyTaskInfo { uint32_t notifyID; uint32_t reserved[9]; } rtNotifyTaskInfo_t; typedef struct tagrtReduceAsyncTaskInfo { void *dst; uint64_t destMax; void *src; uint64_t count; uint32_t kind; uint32_t type; } rtReduceAsyncTaskInfo_t; typedef struct tagrtRdmaSendTaskInfo { uint32_t index; uint32_t wqe_index; uint32_t reserved[8]; } rtRdmaSendTaskInfo_t; typedef struct tagrtRdmaDbSendTaskInfo { uint64_t dbInfo; uint32_t dbIndex; uint32_t reserved[7]; // offset 7 } rtRdmaDbSendTaskInfo_t; typedef struct tagrtModelEndGraphTaskInfo { uint32_t modelId; uint32_t executorFlag; uint32_t reserved[8]; } rtModelEndGraphTaskInfo_t; typedef struct tagrtModelExitInfo { uint32_t modelId; uint32_t streamId; uint32_t reserved[8]; } rtModelExitTaskInfo_t; typedef struct tagrtStreamLabelSwitchByIndexTask_t { uint64_t indexPtr; uint64_t labelInfoPtr; uint32_t max; uint8_t reserved[20]; } rtStreamLabelSwitchByIndexTask_t; typedef struct tagrtStreamLabelGotoTask_t { uint16_t labelId; uint16_t modelId; uint8_t reserved[36]; } rtStreamLabelGotoTask_t; typedef struct tagTaskInfo { uint32_t type; uint32_t streamID; union { rtKernelTaskInfoEx_t kernelTaskEx; rtKernelTaskInfo_t kernelTask; rtAllKernelTaskInfo_t allkernelTask; rtEventTaskInfo_t eventTask; rtStreamSwitchTaskInfo_t streamSwitchTask; rtStreamActiveTaskInfo_t streamActiveTask; rtLabelSetTaskInfo_t labelSetTask; rtLabelSwitchTaskInfo_t labelSwitchTask; rtLabelGotoTaskInfo_t labelGotoTask; rtProfilerTrace_t profilertraceTask; rtMemcpyAsyncTaskInfo_t memcpyAsyncTask; rtNotifyTaskInfo_t notifyTask; rtReduceAsyncTaskInfo_t reduceAsyncTask; rtRdmaSendTaskInfo_t rdmaSendTask; rtRdmaDbSendTaskInfo_t rdmaDbSendTask; rtModelEndGraphTaskInfo_t modelEndGraphTask; rtModelExitTaskInfo_t modelExitTask; rtStreamSwitchNTaskInfo_t streamSwitchNTask; rtStreamLabelSwitchByIndexTask_t streamLabelSwitchIndexTask; rtStreamLabelGotoTask_t streamLabelGotoTask; uint32_t reserved[10]; } u; } rtTaskInfo_t; typedef struct tagLabelDevInfo_t { uint16_t modelId; uint16_t streamId; uint16_t labelId; }rtLabelDevInfo; typedef rtError_t (*rtTaskGenCallback)(rtModel_t model, rtTaskInfo_t *taskInfo); /** * @ingroup rt_model * @brief set callback for generate model * @param [in] callBack callback function * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtSetTaskGenCallback(rtTaskGenCallback callback); /** * @ingroup rt_model * @brief create model instance * @param [out] model created model * @param [in] flag reserved * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelCreate(rtModel_t *model, uint32_t flag); /** * @ingroup rt_model * @brief destroy model instance * @param [in] model model to destroy * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelDestroy(rtModel_t model); /** * @ingroup rt_model * @brief bind model and stream instance * @param [in] model binded model * @param [in] stream binded stream * @param [in] flag reserved * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelBindStream(rtModel_t model, rtStream_t stream, uint32_t flag); /** * @ingroup rt_model * @brief unbind model and stream instance * @param [in] model unbinded model * @param [in] stream unbinded stream * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelUnbindStream(rtModel_t model, rtStream_t stream); /** * @ingroup rt_model * @brief tell runtime Model has been Loaded * @param [in] model model to execute * @return RT_ERROR_NONE for ok */ RTS_API rtError_t rtModelLoadComplete(rtModel_t model); /** * @ingroup rt_model * @brief execute model instance * @param [in] model model to execute * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelExecute(rtModel_t model, rtStream_t stream, uint32_t flag); /** * @ingroup rt_model * @brief get model the last persist task id * @param [in] model model to execute * @param [out] taskid last task id of the model * @param [out] streamid last steam id of the model * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelGetTaskId(rtModel_t model, uint32_t *taskid, uint32_t *streamid); /** * @ingroup rt_model * @brief add a end graph task to stream * @param [in] model model to execute * @param [in] end graph stream * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtEndGraph(rtModel_t model, rtStream_t stream); /** * @ingroup rt_model * @brief add a end graph task with flag to stream * @param [in] model model to execute * @param [in] end graph stream * @param [in] flags AICPU datadump * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtEndGraphEx(rtModel_t model, rtStream_t stream, uint32_t flags); /** * @ingroup rt_model * @brief add a end graph task to stream * @param [in] model model to execute * @param [in] flags EXECUTOR_TS | EXECUTOR_AICPU * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelExecutorSet(rtModel_t model, uint8_t flags); /** * @ingroup rt_model * @brief abort model * @param [in] model model to abort * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelAbort(rtModel_t model); /** * @ingroup rt_model * @brief end graph task to model default stream * @param [in] model model to execute * @param [in] end graph stream * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelExit(rtModel_t model, rtStream_t stream); /** * @ingroup rt_model * @brief bind queue * @param [in] model model to bind * @param [in] queueId queueId to bind * @param [in] flag * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelBindQueue(rtModel_t model, uint32_t queueId, rtModelQueueFlag_t flag); /** * @ingroup rt_model * @brief get model id * @param [in] model * @param [out] modelId model id * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtModelGetId(rtModel_t model, uint32_t *modelId); /* * @ingroup rt_model * @brief enable debug for dump overflow exception * @param [in] addr: ddr address of kernel exception dumpped * @param [in] model: model handle * @param [in] flag: debug flag * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtDebugRegister(rtModel_t model, uint32_t flag, const void *addr, uint32_t *streamId, uint32_t *taskId); /* * @ingroup rt_model * @brief disable debug for dump overflow exception * @param [in] model: model handle * @return RT_ERROR_NONE for ok * @return RT_ERROR_INVALID_VALUE for error input */ RTS_API rtError_t rtDebugUnRegister(rtModel_t model); #if defined(__cplusplus) && !defined(COMPILE_OMG_PACKAGE) } #endif #endif // __CCE_RUNTIME_MODEL_H__