From 4a4d2c01327754d03f35e8932b003a7e5c57b363 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Mon, 15 Mar 2021 11:50:30 +0800 Subject: [PATCH 1/2] Unique label goto addr --- ge/graph/load/model_manager/davinci_model.cc | 39 +++++++++++++++++++ ge/graph/load/model_manager/davinci_model.h | 5 +++ .../task_info/label_goto_ex_task_info.cc | 26 ++----------- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/ge/graph/load/model_manager/davinci_model.cc b/ge/graph/load/model_manager/davinci_model.cc index 9d1ba0c2..bd022e87 100755 --- a/ge/graph/load/model_manager/davinci_model.cc +++ b/ge/graph/load/model_manager/davinci_model.cc @@ -31,6 +31,7 @@ #include "common/scope_guard.h" #include "common/thread_pool.h" #include "framework/common/debug/ge_log.h" +#include "framework/common/util.h" #include "graph/common/ge_call_wrapper.h" #include "graph/compute_graph.h" #include "graph/debug/ge_attr_define.h" @@ -297,6 +298,11 @@ void DavinciModel::ReleaseTask() { GE_CHK_STATUS(task->Release(), "Release task failed."); } } + + for (auto &item : label_goto_args_) { + GE_FREE_RT_LOG(item.second.first); + } + label_goto_args_.clear(); } Status DavinciModel::Assign(const GeModelPtr &ge_model) { @@ -1334,6 +1340,39 @@ void DavinciModel::ParseDynamicOutShape(const std::vector &str_info } } +Status DavinciModel::GetLabelGotoAddr(uint32_t label_index, rtMemType_t mem_type, void *&arg_addr, uint32_t &arg_size) { + std::lock_guard lock(label_args_mutex_); + auto it = label_goto_args_.find(label_index); + if (it != label_goto_args_.end()) { + arg_addr = it->second.first; + arg_size = it->second.second; + return SUCCESS; + } + + if (label_index >= label_list_.size()) { + GELOGE(PARAM_INVALID, "LabelGotoExTaskInfo: Invalid label id:%u, label size:%zu", label_index, label_list_.size()); + return INTERNAL_ERROR; + } + GE_CHECK_NOTNULL(label_list_[label_index]); + vector label_used = { label_list_[label_index] }; + + arg_size = label_used.size() * sizeof(rtLabelDevInfo); + rtError_t rt_ret = rtMalloc(&arg_addr, arg_size, mem_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(), arg_addr, arg_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); + } + + label_goto_args_[label_index] = { arg_addr, arg_size }; + return SUCCESS; +} + /// @ingroup ge /// @brief LabelSet Op Initialize. /// @param [in] op_desc: LabelSet Op descriptor. diff --git a/ge/graph/load/model_manager/davinci_model.h b/ge/graph/load/model_manager/davinci_model.h index 70c0f687..58478b0f 100755 --- a/ge/graph/load/model_manager/davinci_model.h +++ b/ge/graph/load/model_manager/davinci_model.h @@ -273,6 +273,8 @@ class DavinciModel { const vector &GetLabelList() const { return label_list_; } + Status GetLabelGotoAddr(uint32_t label_index, rtMemType_t memory_type, void *&addr, uint32_t &size); + Status DestroyThread(); // get Op @@ -930,6 +932,9 @@ class DavinciModel { vector label_list_; set label_id_indication_; + mutex label_args_mutex_; + map> label_goto_args_; + mutex outside_addrs_mutex_; vector zero_copy_tasks_; // Task used Data or NetOutput addr. set copy_only_addrs_; // Address need copy to original place. diff --git a/ge/graph/load/model_manager/task_info/label_goto_ex_task_info.cc b/ge/graph/load/model_manager/task_info/label_goto_ex_task_info.cc index 2d108faa..c651e6df 100755 --- a/ge/graph/load/model_manager/task_info/label_goto_ex_task_info.cc +++ b/ge/graph/load/model_manager/task_info/label_goto_ex_task_info.cc @@ -22,7 +22,7 @@ namespace ge { constexpr uint8_t kGotoBranchMax = 1; LabelGotoExTaskInfo::~LabelGotoExTaskInfo() { - GE_FREE_RT_LOG(args_); + args_ = nullptr; GE_FREE_RT_LOG(index_value_); } @@ -49,30 +49,12 @@ Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da return INTERNAL_ERROR; } - const vector &label_list = davinci_model->GetLabelList(); - if (label_index >= label_list.size()) { - GELOGE(PARAM_INVALID, "LabelGotoExTaskInfo: Invalid label id:%u, label size:%zu", label_index, label_list.size()); - return INTERNAL_ERROR; - } - GE_CHECK_NOTNULL(label_list[label_index]); - vector 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); - } + GE_CHK_STATUS_RET_NOLOG(davinci_model->GetLabelGotoAddr(label_index, memory_type, args_, args_size_)); - rt_ret = rtMalloc(&index_value_, sizeof(uint64_t), memory_type); + rtError_t 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); @@ -85,7 +67,7 @@ Status LabelGotoExTaskInfo::Init(const domi::TaskDef &task_def, DavinciModel *da return RT_ERROR_TO_GE_STATUS(rt_ret); } - GELOGI("LabelGotoExTaskInfo Init Success, label id:%u, label:%p.", label_index, label_list[label_index]); + GELOGI("LabelGotoExTaskInfo Init Success, label id:%u", label_index); return SUCCESS; } From ba8899ddf4d248579db81925294194587e1df9c7 Mon Sep 17 00:00:00 2001 From: zhangxiaokun Date: Mon, 15 Mar 2021 15:02:15 +0800 Subject: [PATCH 2/2] Unique LabelGoto args addr --- ge/graph/load/model_manager/davinci_model.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ge/graph/load/model_manager/davinci_model.cc b/ge/graph/load/model_manager/davinci_model.cc index bd022e87..ccf17fe8 100755 --- a/ge/graph/load/model_manager/davinci_model.cc +++ b/ge/graph/load/model_manager/davinci_model.cc @@ -1350,7 +1350,7 @@ Status DavinciModel::GetLabelGotoAddr(uint32_t label_index, rtMemType_t mem_type } if (label_index >= label_list_.size()) { - GELOGE(PARAM_INVALID, "LabelGotoExTaskInfo: Invalid label id:%u, label size:%zu", label_index, label_list_.size()); + GELOGE(INTERNAL_ERROR, "Invalid label id:%u, label size:%zu", label_index, label_list_.size()); return INTERNAL_ERROR; } GE_CHECK_NOTNULL(label_list_[label_index]); @@ -1363,13 +1363,13 @@ Status DavinciModel::GetLabelGotoAddr(uint32_t label_index, rtMemType_t mem_type return RT_ERROR_TO_GE_STATUS(rt_ret); } + label_goto_args_[label_index] = { arg_addr, arg_size }; rt_ret = rtLabelListCpy(label_used.data(), label_used.size(), arg_addr, arg_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); } - label_goto_args_[label_index] = { arg_addr, arg_size }; return SUCCESS; }