| @@ -16,14 +16,12 @@ | |||||
| #include "ge_runtime/task/label_goto_task.h" | #include "ge_runtime/task/label_goto_task.h" | ||||
| #include "ge_runtime/task/task_factory.h" | #include "ge_runtime/task/task_factory.h" | ||||
| #include "framework/common/util.h" | |||||
| namespace ge { | namespace ge { | ||||
| namespace model_runner { | namespace model_runner { | ||||
| LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info) | LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::shared_ptr<LabelGotoTaskInfo> &task_info) | ||||
| : TaskRepeater<LabelGotoTaskInfo>(model_context, task_info), | |||||
| task_info_(task_info), | |||||
| stream_(nullptr), | |||||
| label_(nullptr) { | |||||
| : TaskRepeater<LabelGotoTaskInfo>(model_context, task_info), task_info_(task_info) { | |||||
| if (task_info_ == nullptr) { | if (task_info_ == nullptr) { | ||||
| GELOGW("task_info_ is null!"); | GELOGW("task_info_ is null!"); | ||||
| return; | return; | ||||
| @@ -42,29 +40,78 @@ LabelGotoTask::LabelGotoTask(const ModelContext &model_context, const std::share | |||||
| label_ = label_list[label_id]; | label_ = label_list[label_id]; | ||||
| } | } | ||||
| LabelGotoTask::~LabelGotoTask() {} | |||||
| LabelGotoTask::~LabelGotoTask() { | |||||
| GE_FREE_RT_LOG(label_info_); | |||||
| GE_FREE_RT_LOG(index_value_); | |||||
| } | |||||
| bool LabelGotoTask::Distribute() { | bool LabelGotoTask::Distribute() { | ||||
| GELOGI("LabelGotoTask Distribute start."); | GELOGI("LabelGotoTask Distribute start."); | ||||
| if (!CheckParamValid()) { | |||||
| return false; | |||||
| } | |||||
| const std::vector<void *> label_list = { label_ }; | |||||
| rtError_t rt_ret = rtMalloc(&index_value_, sizeof(uint64_t), RT_MEMORY_HBM); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
| return false; | |||||
| } | |||||
| uint64_t branch_index = 0; | |||||
| rt_ret = rtMemcpy(index_value_, sizeof(uint64_t), &branch_index, sizeof(uint64_t), RT_MEMCPY_HOST_TO_DEVICE); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
| return false; | |||||
| } | |||||
| uint32_t label_info_size = sizeof(rtLabelDevInfo) * label_list.size(); | |||||
| rt_ret = rtMalloc(&label_info_, label_info_size, RT_MEMORY_HBM); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
| return false; | |||||
| } | |||||
| rt_ret = rtLabelListCpy(label_list.data(), label_list.size(), label_info_, label_info_size); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
| return false; | |||||
| } | |||||
| rt_ret = rtLabelSwitchByIndex(index_value_, label_list.size(), label_info_, stream_); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: %#x", rt_ret); | |||||
| return false; | |||||
| } | |||||
| GELOGI("DistributeTask end."); | |||||
| return true; | |||||
| } | |||||
| bool LabelGotoTask::CheckParamValid() { | |||||
| if (stream_ == nullptr) { | if (stream_ == nullptr) { | ||||
| GELOGE(PARAM_INVALID, "stream is null!"); | GELOGE(PARAM_INVALID, "stream is null!"); | ||||
| return false; | return false; | ||||
| } | } | ||||
| if (label_ == nullptr) { | if (label_ == nullptr) { | ||||
| GELOGE(PARAM_INVALID, "label is null!"); | GELOGE(PARAM_INVALID, "label is null!"); | ||||
| return false; | return false; | ||||
| } | } | ||||
| rtError_t rt_ret = rtLabelGotoEx(label_, stream_); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | |||||
| if (label_info_ != nullptr) { | |||||
| GELOGE(PARAM_INVALID, "label_info_ has dirty data."); | |||||
| return false; | |||||
| } | |||||
| if (index_value_ != nullptr) { | |||||
| GELOGE(PARAM_INVALID, "index_value_ has dirty data."); | |||||
| return false; | return false; | ||||
| } | } | ||||
| GELOGI("DistributeTask end."); | |||||
| return true; | return true; | ||||
| } | } | ||||
| REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo); | REGISTER_TASK(TaskInfoType::LABEL_GOTO, LabelGotoTask, LabelGotoTaskInfo); | ||||
| } // namespace model_runner | } // namespace model_runner | ||||
| } // namespace ge | } // namespace ge | ||||
| @@ -31,9 +31,13 @@ class LabelGotoTask : public TaskRepeater<LabelGotoTaskInfo> { | |||||
| bool Distribute() override; | bool Distribute() override; | ||||
| private: | private: | ||||
| bool CheckParamValid(); | |||||
| std::shared_ptr<LabelGotoTaskInfo> task_info_; | std::shared_ptr<LabelGotoTaskInfo> task_info_; | ||||
| void *stream_; | |||||
| void *label_; | |||||
| void *stream_{nullptr}; | |||||
| void *label_{nullptr}; | |||||
| void *label_info_{nullptr}; | |||||
| void *index_value_{nullptr}; | |||||
| }; | }; | ||||
| } // namespace model_runner | } // namespace model_runner | ||||
| } // namespace ge | } // namespace ge | ||||
| @@ -17,9 +17,15 @@ | |||||
| #include "graph/load/model_manager/task_info/label_goto_ex_task_info.h" | #include "graph/load/model_manager/task_info/label_goto_ex_task_info.h" | ||||
| #include "graph/load/model_manager/davinci_model.h" | #include "graph/load/model_manager/davinci_model.h" | ||||
| #include "graph/debug/ge_attr_define.h" | |||||
| namespace ge { | namespace ge { | ||||
| constexpr uint8_t kGotoBranchMax = 1; | |||||
| LabelGotoExTaskInfo::~LabelGotoExTaskInfo() { | |||||
| GE_FREE_RT_LOG(args_); | |||||
| GE_FREE_RT_LOG(index_value_); | |||||
| } | |||||
| Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) { | ||||
| GELOGI("LabelGotoExTaskInfo Init Start."); | GELOGI("LabelGotoExTaskInfo Init Start."); | ||||
| GE_CHECK_NOTNULL(davinci_model); | GE_CHECK_NOTNULL(davinci_model); | ||||
| @@ -28,7 +34,7 @@ Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da | |||||
| return FAILED; | return FAILED; | ||||
| } | } | ||||
| // Get LabelGoto task def | |||||
| // Get LabelGotoEx task def | |||||
| const domi::LabelGotoExDef &label_goto = task_def.label_goto_ex(); | const domi::LabelGotoExDef &label_goto = task_def.label_goto_ex(); | ||||
| OpDescPtr op_desc = davinci_model->GetOpByIndex(label_goto.op_index()); | OpDescPtr op_desc = davinci_model->GetOpByIndex(label_goto.op_index()); | ||||
| if (op_desc == nullptr) { | if (op_desc == nullptr) { | ||||
| @@ -48,15 +54,51 @@ Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da | |||||
| GELOGE(PARAM_INVALID, "LabelGotoExTaskInfo: Invalid label id:%u, label size:%zu", label_index, label_list.size()); | GELOGE(PARAM_INVALID, "LabelGotoExTaskInfo: Invalid label id:%u, label size:%zu", label_index, label_list.size()); | ||||
| return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
| } | } | ||||
| label_ = label_list[label_index]; | |||||
| GE_CHECK_NOTNULL(label_list[label_index]); | |||||
| vector<rtLabel_t> label_used = { label_list[label_index] }; | |||||
| rtMemType_t memory_type = op_desc->HasAttr(ATTR_NAME_MEMORY_TYPE_RANGE) ? RT_MEMORY_TS_4G : RT_MEMORY_HBM; | |||||
| GELOGI("memory_type: %u", memory_type); | |||||
| args_size_ = kGotoBranchMax * sizeof(rtLabelDevInfo); | |||||
| rtError_t rt_ret = rtMalloc(&args_, args_size_, memory_type); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rtMalloc failed, error: %#x", rt_ret); | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
| } | |||||
| rt_ret = rtLabelListCpy(label_used.data(), label_used.size(), args_, args_size_); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rtLabelListCpy failed, error: %#x", rt_ret); | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
| } | |||||
| GELOGI("LabelGotoExTaskInfo Init Success, label id:%u, label:%p.", label_index, label_); | |||||
| rt_ret = rtMalloc(&index_value_, sizeof(uint64_t), memory_type); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rtMalloc failed, error: %#x", rt_ret); | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
| } | |||||
| uint64_t branch_index = 0; | |||||
| rt_ret = rtMemcpy(index_value_, sizeof(uint64_t), &branch_index, sizeof(uint64_t), RT_MEMCPY_HOST_TO_DEVICE); | |||||
| if (rt_ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rtMemcpy failed, error: %#x", rt_ret); | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
| } | |||||
| GELOGI("LabelGotoExTaskInfo Init Success, label id:%u, label:%p.", label_index, label_list[label_index]); | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| Status LabelGotoExTaskInfo::Distribute() { | Status LabelGotoExTaskInfo::Distribute() { | ||||
| GELOGI("LabelGotoExTaskInfo Distribute Start."); | GELOGI("LabelGotoExTaskInfo Distribute Start."); | ||||
| rtError_t rt_ret = rtLabelGotoEx(label_, stream_); | |||||
| GE_CHECK_NOTNULL(args_); | |||||
| GE_CHECK_NOTNULL(index_value_); | |||||
| if (args_size_ == 0) { | |||||
| GELOGE(PARAM_INVALID, "branch max: %u, args size: %u invalid.", kGotoBranchMax, args_size_); | |||||
| return PARAM_INVALID; | |||||
| } | |||||
| rtError_t rt_ret = rtLabelSwitchByIndex(index_value_, kGotoBranchMax, args_, stream_); | |||||
| if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
| @@ -22,16 +22,18 @@ | |||||
| namespace ge { | namespace ge { | ||||
| class LabelGotoExTaskInfo : public TaskInfo { | class LabelGotoExTaskInfo : public TaskInfo { | ||||
| public: | public: | ||||
| LabelGotoExTaskInfo() : label_(nullptr) {} | |||||
| LabelGotoExTaskInfo() = default; | |||||
| ~LabelGotoExTaskInfo() override { label_ = nullptr; } | |||||
| ~LabelGotoExTaskInfo() override; | |||||
| Status Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) override; | Status Init(const domi::TaskDef &task_def, DavinciModel *davinci_model) override; | ||||
| Status Distribute() override; | Status Distribute() override; | ||||
| private: | private: | ||||
| void *label_; | |||||
| void *index_value_{nullptr}; // switch index input. | |||||
| void *args_{nullptr}; // label info memory. | |||||
| uint32_t args_size_{0}; // label info length. | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_LABEL_GOTO_EX_TASK_INFO_H_ | #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_LABEL_GOTO_EX_TASK_INFO_H_ | ||||
| @@ -16,20 +16,13 @@ | |||||
| #include "graph/load/model_manager/task_info/label_switch_by_index_task_info.h" | #include "graph/load/model_manager/task_info/label_switch_by_index_task_info.h" | ||||
| #include "graph/debug/ge_attr_define.h" | |||||
| #include "graph/load/model_manager/davinci_model.h" | #include "graph/load/model_manager/davinci_model.h" | ||||
| namespace ge { | namespace ge { | ||||
| constexpr uint8_t kLabelSwitchIndexNum = 1; | constexpr uint8_t kLabelSwitchIndexNum = 1; | ||||
| LabelSwitchByIndexTaskInfo::~LabelSwitchByIndexTaskInfo() { | LabelSwitchByIndexTaskInfo::~LabelSwitchByIndexTaskInfo() { | ||||
| if (args_ != nullptr) { | |||||
| rtError_t ret = rtFree(args_); | |||||
| if (ret != RT_ERROR_NONE) { | |||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", ret); | |||||
| } | |||||
| } | |||||
| args_ = nullptr; | |||||
| GE_FREE_RT_LOG(args_); | |||||
| index_value_ = nullptr; | index_value_ = nullptr; | ||||
| } | } | ||||
| @@ -37,13 +30,12 @@ Status LabelSwitchByIndexTaskInfo::Init(const domi::TaskDef &task_def, DavinciMo | |||||
| GELOGI("LabelSwitchByIndexTaskInfo Init Start."); | GELOGI("LabelSwitchByIndexTaskInfo Init Start."); | ||||
| GE_CHECK_NOTNULL(davinci_model); | GE_CHECK_NOTNULL(davinci_model); | ||||
| const vector<rtLabel_t> &label_list = davinci_model->GetLabelList(); | |||||
| Status ret = SetStream(task_def.stream_id(), davinci_model->GetStreamList()); | Status ret = SetStream(task_def.stream_id(), davinci_model->GetStreamList()); | ||||
| if (ret != SUCCESS) { | if (ret != SUCCESS) { | ||||
| return FAILED; | return FAILED; | ||||
| } | } | ||||
| // Get LabelSwitch task def | |||||
| // Get LabelSwitchByIndex task def | |||||
| const domi::LabelSwitchByIndexDef &label_switch = task_def.label_switch_by_index(); | const domi::LabelSwitchByIndexDef &label_switch = task_def.label_switch_by_index(); | ||||
| OpDescPtr op_desc = davinci_model->GetOpByIndex(label_switch.op_index()); | OpDescPtr op_desc = davinci_model->GetOpByIndex(label_switch.op_index()); | ||||
| if (op_desc == nullptr) { | if (op_desc == nullptr) { | ||||
| @@ -68,7 +60,7 @@ Status LabelSwitchByIndexTaskInfo::Init(const domi::TaskDef &task_def, DavinciMo | |||||
| davinci_model->DisableZeroCopy(index_value_); | davinci_model->DisableZeroCopy(index_value_); | ||||
| std::vector<uint32_t> label_idx_list; | |||||
| vector<uint32_t> label_idx_list; | |||||
| if (!AttrUtils::GetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, label_idx_list)) { | if (!AttrUtils::GetListInt(op_desc, ATTR_NAME_LABEL_SWITCH_LIST, label_idx_list)) { | ||||
| GELOGE(INTERNAL_ERROR, "LabelSwitchByIndexTaskInfo: %s Get attr %s failed.", op_desc->GetName().c_str(), | GELOGE(INTERNAL_ERROR, "LabelSwitchByIndexTaskInfo: %s Get attr %s failed.", op_desc->GetName().c_str(), | ||||
| ATTR_NAME_LABEL_SWITCH_LIST.c_str()); | ATTR_NAME_LABEL_SWITCH_LIST.c_str()); | ||||
| @@ -81,7 +73,8 @@ Status LabelSwitchByIndexTaskInfo::Init(const domi::TaskDef &task_def, DavinciMo | |||||
| return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
| } | } | ||||
| label_list_.resize(branch_max_, nullptr); | |||||
| vector<rtLabel_t> label_used(branch_max_, nullptr); | |||||
| const vector<rtLabel_t> &label_list = davinci_model->GetLabelList(); | |||||
| for (size_t idx = 0; idx < label_idx_list.size(); ++idx) { | for (size_t idx = 0; idx < label_idx_list.size(); ++idx) { | ||||
| uint32_t label_id = label_idx_list[idx]; | uint32_t label_id = label_idx_list[idx]; | ||||
| if (label_id >= label_list.size()) { | if (label_id >= label_list.size()) { | ||||
| @@ -90,8 +83,7 @@ Status LabelSwitchByIndexTaskInfo::Init(const domi::TaskDef &task_def, DavinciMo | |||||
| return INTERNAL_ERROR; | return INTERNAL_ERROR; | ||||
| } | } | ||||
| GE_CHECK_NOTNULL(label_list[label_id]); | GE_CHECK_NOTNULL(label_list[label_id]); | ||||
| label_list_[idx] = label_list[label_id]; | |||||
| label_used[idx] = label_list[label_id]; | |||||
| } | } | ||||
| rtMemType_t memory_type = op_desc->HasAttr(ATTR_NAME_MEMORY_TYPE_RANGE) ? RT_MEMORY_TS_4G : RT_MEMORY_HBM; | rtMemType_t memory_type = op_desc->HasAttr(ATTR_NAME_MEMORY_TYPE_RANGE) ? RT_MEMORY_TS_4G : RT_MEMORY_HBM; | ||||
| @@ -103,7 +95,7 @@ Status LabelSwitchByIndexTaskInfo::Init(const domi::TaskDef &task_def, DavinciMo | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
| } | } | ||||
| rt_ret = rtLabelListCpy(label_list_.data(), label_list_.size(), args_, args_size_); | |||||
| rt_ret = rtLabelListCpy(label_used.data(), label_used.size(), args_, args_size_); | |||||
| if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | return RT_ERROR_TO_GE_STATUS(rt_ret); | ||||
| @@ -125,7 +117,7 @@ Status LabelSwitchByIndexTaskInfo::Distribute() { | |||||
| rtError_t rt_ret = rtLabelSwitchByIndex(index_value_, branch_max_, args_, stream_); | rtError_t rt_ret = rtLabelSwitchByIndex(index_value_, branch_max_, args_, stream_); | ||||
| if (rt_ret != RT_ERROR_NONE) { | if (rt_ret != RT_ERROR_NONE) { | ||||
| GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | GELOGE(RT_FAILED, "Call rt api failed, ret: 0x%X", rt_ret); | ||||
| return RT_FAILED; | |||||
| return RT_ERROR_TO_GE_STATUS(rt_ret); | |||||
| } | } | ||||
| GELOGI("LabelSwitchByIndexTaskInfo Distribute Success."); | GELOGI("LabelSwitchByIndexTaskInfo Distribute Success."); | ||||
| @@ -14,16 +14,15 @@ | |||||
| * limitations under the License. | * limitations under the License. | ||||
| */ | */ | ||||
| #ifndef GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| #define GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| #ifndef GE_GRAPH_LOAD_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| #define GE_GRAPH_LOAD_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| #include "graph/load/model_manager/task_info/task_info.h" | #include "graph/load/model_manager/task_info/task_info.h" | ||||
| namespace ge { | namespace ge { | ||||
| class LabelSwitchByIndexTaskInfo : public TaskInfo { | class LabelSwitchByIndexTaskInfo : public TaskInfo { | ||||
| public: | public: | ||||
| LabelSwitchByIndexTaskInfo() | |||||
| : index_value_(nullptr), branch_max_(0), args_(nullptr), args_size_(0), fixed_addr_offset_(0) {} | |||||
| LabelSwitchByIndexTaskInfo() = default; | |||||
| ~LabelSwitchByIndexTaskInfo() override; | ~LabelSwitchByIndexTaskInfo() override; | ||||
| @@ -34,12 +33,11 @@ class LabelSwitchByIndexTaskInfo : public TaskInfo { | |||||
| Status CalculateArgs(const domi::TaskDef &task_def, DavinciModel *davinci_model) override; | Status CalculateArgs(const domi::TaskDef &task_def, DavinciModel *davinci_model) override; | ||||
| private: | private: | ||||
| void *index_value_; // switch index input. | |||||
| uint32_t branch_max_; // max branch count. | |||||
| void *args_; // label info memory. | |||||
| uint32_t args_size_; // label info length. | |||||
| std::vector<rtLabel_t> label_list_; | |||||
| int64_t fixed_addr_offset_; | |||||
| void *index_value_{nullptr}; // switch index input. | |||||
| uint32_t branch_max_{0}; // max branch count. | |||||
| void *args_{nullptr}; // label info memory. | |||||
| uint32_t args_size_{0}; // label info length. | |||||
| int64_t fixed_addr_offset_{0}; | |||||
| }; | }; | ||||
| } // namespace ge | } // namespace ge | ||||
| #endif // GE_GRAPH_LOAD_NEW_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| #endif // GE_GRAPH_LOAD_MODEL_MANAGER_TASK_INFO_LABEL_SWITCH_BY_INDEX_TASK_INFO_H_ | |||||
| @@ -166,15 +166,6 @@ | |||||
| } \ | } \ | ||||
| } while (0) | } while (0) | ||||
| // Check if the container is empty | |||||
| #define GE_CHECK_VECTOR_NOT_EMPTY(vector) \ | |||||
| do { \ | |||||
| if (vector.empty()) { \ | |||||
| DOMI_LOGE("param[%s] is empty!", #vector); \ | |||||
| return ge::FAILED; \ | |||||
| } \ | |||||
| } while (0) | |||||
| // Check if the value on the left is greater than or equal to the value on the right | // Check if the value on the left is greater than or equal to the value on the right | ||||
| #define GE_CHECK_GE(lhs, rhs) \ | #define GE_CHECK_GE(lhs, rhs) \ | ||||
| do { \ | do { \ | ||||
| @@ -209,6 +200,17 @@ | |||||
| } \ | } \ | ||||
| } while (0) | } while (0) | ||||
| #define GE_FREE_RT_LOG(addr) \ | |||||
| do { \ | |||||
| if (addr != nullptr) { \ | |||||
| rtError_t error = rtFree(addr); \ | |||||
| if (error != RT_ERROR_NONE) { \ | |||||
| GELOGE(RT_FAILED, "Call rtFree failed, error: %#x", error); \ | |||||
| } \ | |||||
| addr = nullptr; \ | |||||
| } \ | |||||
| } while (0) | |||||
| /** | /** | ||||
| * @ingroup domi_common | * @ingroup domi_common | ||||
| * @brief version of om.proto file | * @brief version of om.proto file | ||||