diff --git a/ge/graph/load/new_model_manager/davinci_model.cc b/ge/graph/load/new_model_manager/davinci_model.cc index f15c0c5f..9ebfde7c 100755 --- a/ge/graph/load/new_model_manager/davinci_model.cc +++ b/ge/graph/load/new_model_manager/davinci_model.cc @@ -964,9 +964,10 @@ Status DavinciModel::InitDataOp(const NodePtr &node, uint32_t &data_op_index, ma const vector output_size_list = ModelUtils::GetOutputSize(op_desc); const vector virtual_addr_list = ModelUtils::GetOutputDataAddrs(runtime_param_, op_desc); const vector output_offset_list = op_desc->GetOutputOffset(); - if (output_offset_list.size() != virtual_addr_list.size()) { - GELOGE(PARAM_INVALID, "virtual_addr size:%zu should be equal to offset size:%zu.", virtual_addr_list.size(), - output_offset_list.size()); + if (output_size_list.empty() || virtual_addr_list.empty() || (output_size_list.size() != virtual_addr_list.size()) || + (output_offset_list.size() != virtual_addr_list.size())) { + GELOGE(PARAM_INVALID, "Data[%s] init failed: output size is %zu, virtual_addr size is %zu, offset size is %zu.", + op_desc->GetName().c_str(), output_size_list.size(), virtual_addr_list.size(), output_offset_list.size()); return PARAM_INVALID; } auto data_index = data_op_index; @@ -975,7 +976,9 @@ Status DavinciModel::InitDataOp(const NodePtr &node, uint32_t &data_op_index, ma } bool fusion_flag = false; ZeroCopyOffset zero_copy_offset; - Status ret = zero_copy_offset.InitInputDataInfo(output_size_list, virtual_addr_list, op_desc, fusion_flag); + int64_t data_size = output_size_list[kDataIndex]; + void *virtual_addr = virtual_addr_list[kDataIndex]; + Status ret = zero_copy_offset.InitInputDataInfo(data_size, virtual_addr, op_desc, fusion_flag); if (ret != SUCCESS) { GELOGE(PARAM_INVALID, "InitDataInfo of input_info %s failed.", op_desc->GetName().c_str()); return PARAM_INVALID; diff --git a/ge/graph/load/new_model_manager/zero_copy_offset.cc b/ge/graph/load/new_model_manager/zero_copy_offset.cc index 709db259..97c310d1 100644 --- a/ge/graph/load/new_model_manager/zero_copy_offset.cc +++ b/ge/graph/load/new_model_manager/zero_copy_offset.cc @@ -30,18 +30,11 @@ ZeroCopyOffset::ZeroCopyOffset() {} ZeroCopyOffset::~ZeroCopyOffset() {} -Status ZeroCopyOffset::InitInputDataInfo(const vector &output_size_list, - const vector &virtual_addr_list, const OpDescPtr &op_desc, +Status ZeroCopyOffset::InitInputDataInfo(int64_t output_size, void *virtual_addr, const OpDescPtr &op_desc, bool &fusion_flag) { GELOGI("[ZCPY] Start to InitInputDataInfo of %s, total_data_size is %ld, virtual_addr is %p", - op_desc->GetName().c_str(), output_size_list[kDataIndex], virtual_addr_list[kDataIndex]); - if (output_size_list.empty() || virtual_addr_list.empty() || (output_size_list.size() != virtual_addr_list.size())) { - GELOGE(PARAM_INVALID, "Data[%s] init failed: Output size is %zu, Output addr is %zu", op_desc->GetName().c_str(), - output_size_list.size(), virtual_addr_list.size()); - return PARAM_INVALID; - } - - basic_addr_ = virtual_addr_list[kDataIndex]; + op_desc->GetName().c_str(), output_size, virtual_addr); + basic_addr_ = virtual_addr; (void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_BASIC_OFFSET, zero_copy_basic_offset_); (void)ge::AttrUtils::GetListInt(op_desc, ATTR_ZERO_COPY_RELATIVE_OFFSET, zero_copy_relative_offset_); GE_CHK_BOOL_EXEC(zero_copy_basic_offset_.size() == zero_copy_relative_offset_.size(), return PARAM_INVALID, @@ -53,26 +46,23 @@ Status ZeroCopyOffset::InitInputDataInfo(const vector &output_size_list IsL2Fusion(zero_copy_basic_offset_, virtual_addr_offset, fusion_flag); uint32_t out_count = 0; - data_size_ = output_size_list[kDataIndex]; + data_size_ = output_size; if (!fusion_flag) { GELOGI("[ZCPY] %s not set l2_fusion.", op_desc->GetName().c_str()); out_count++; - data_info_.emplace_back(output_size_list[kDataIndex], virtual_addr_list[kDataIndex]); + data_info_.emplace_back(output_size, virtual_addr); relative_offset_.emplace_back(0); - GELOGI("[ZCPY] %s size is %ld, virtual_addr is %p.", op_desc->GetName().c_str(), output_size_list[kDataIndex], - virtual_addr_list[kDataIndex]); + GELOGI("[ZCPY] %s size is %ld, virtual_addr is %p.", op_desc->GetName().c_str(), output_size, virtual_addr); } else { GELOGI("[ZCPY] set l2_fusion for %s.", op_desc->GetName().c_str()); for (size_t index = 0; index < zero_copy_basic_offset_.size(); ++index) { if (zero_copy_basic_offset_.at(index) == virtual_addr_offset) { out_count++; - uint64_t out_offset = - reinterpret_cast(virtual_addr_list[kDataIndex]) + zero_copy_relative_offset_.at(index); - int64_t real_data_size = ModelUtils::GetOutputSize(op_desc).at(kDataIndex); - data_info_.emplace_back(real_data_size, reinterpret_cast(static_cast(out_offset))); + uint64_t out_offset = reinterpret_cast(virtual_addr) + zero_copy_relative_offset_.at(index); + data_info_.emplace_back(output_size, reinterpret_cast(static_cast(out_offset))); relative_offset_.emplace_back(zero_copy_relative_offset_.at(index)); GELOGI("[ZCPY] virtual_addr: %p has been l2-fusion to %lu, need copy data_size is %ld.", basic_addr_, - out_offset, real_data_size); + out_offset, output_size); } } } diff --git a/ge/graph/load/new_model_manager/zero_copy_offset.h b/ge/graph/load/new_model_manager/zero_copy_offset.h index c662032b..025d1b14 100644 --- a/ge/graph/load/new_model_manager/zero_copy_offset.h +++ b/ge/graph/load/new_model_manager/zero_copy_offset.h @@ -42,8 +42,7 @@ class ZeroCopyOffset { ZeroCopyOffset(); ~ZeroCopyOffset(); - Status InitInputDataInfo(const vector &output_size_list, const vector &virtual_addr_list, - const OpDescPtr &op_desc, bool &fusion_flag); + Status InitInputDataInfo(int64_t output_size, void *virtual_addr, const OpDescPtr &op_desc, bool &fusion_flag); void SetInputOutsideAddrs(const vector &output_offset_list, void *addr, const size_t &index, bool fusion_flag, std::set &real_virtual_addrs);