| @@ -542,11 +542,7 @@ ge::Status VarManager::AssignVarMem(const std::string &var_name, const ge::GeTen | |||||
| GELOGE(ge::INTERNAL_ERROR, "MemResource is invalid, memory_type = %u.", memory_type); | GELOGE(ge::INTERNAL_ERROR, "MemResource is invalid, memory_type = %u.", memory_type); | ||||
| return ge::INTERNAL_ERROR; | return ge::INTERNAL_ERROR; | ||||
| } | } | ||||
| result = mem_resource->AssignVarMem(var_name, tensor_desc_size, session_id_, mem_offset); | |||||
| if (result != SUCCESS) { | |||||
| GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed."); | |||||
| return ge::INTERNAL_ERROR; | |||||
| } | |||||
| if (var_resource_ == nullptr) { | if (var_resource_ == nullptr) { | ||||
| REPORT_INNER_ERROR("E19999", "VarManager has not been init, memory_type:%d, session_id:%lu, " | REPORT_INNER_ERROR("E19999", "VarManager has not been init, memory_type:%d, session_id:%lu, " | ||||
| "check invalid", memory_type, session_id_); | "check invalid", memory_type, session_id_); | ||||
| @@ -554,31 +550,46 @@ ge::Status VarManager::AssignVarMem(const std::string &var_name, const ge::GeTen | |||||
| return ge::INTERNAL_ERROR; | return ge::INTERNAL_ERROR; | ||||
| } | } | ||||
| result = var_resource_->SaveVarAddr( | |||||
| var_name, tensor_desc, reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type); | |||||
| if (result != SUCCESS) { | |||||
| GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed."); | |||||
| return ge::INTERNAL_ERROR; | |||||
| ge::GeTensorDesc cur_tensor_desc; | |||||
| int64_t cur_tensor_desc_size = 0; | |||||
| result = var_resource_->GetCurVarDesc(var_name, cur_tensor_desc); | |||||
| // reuse old format variable memory | |||||
| if (result == SUCCESS) { | |||||
| result = var_resource_->GetVarAddr( | |||||
| var_name, tensor_desc, reinterpret_cast<uint8_t **>(reinterpret_cast<uintptr_t>(&mem_offset)), memory_type); | |||||
| if (result == SUCCESS) { | |||||
| result = TensorUtils::GetSize(cur_tensor_desc, cur_tensor_desc_size); | |||||
| GELOGD("tensor_desc_size is %ld, cur_tensor_desc_size is %ld, memoffset is %zu", tensor_desc_size, | |||||
| cur_tensor_desc_size, mem_offset); | |||||
| } | |||||
| } | } | ||||
| result = var_resource_->GetVarAddr( | |||||
| var_name, tensor_desc, reinterpret_cast<uint8_t **>(reinterpret_cast<uintptr_t>(&mem_offset)), memory_type); | |||||
| if (result != SUCCESS) { | |||||
| GELOGE(ge::INTERNAL_ERROR, "GetVarAddr by offset failed."); | |||||
| return ge::INTERNAL_ERROR; | |||||
| } | |||||
| bool can_not_reuse_old_memory = (result != SUCCESS) || (tensor_desc_size > cur_tensor_desc_size); | |||||
| if (can_not_reuse_old_memory) { | |||||
| result = mem_resource->AssignVarMem(var_name, tensor_desc_size, session_id_, mem_offset); | |||||
| if (result != SUCCESS) { | |||||
| GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed."); | |||||
| return ge::INTERNAL_ERROR; | |||||
| } | |||||
| ge::GeTensorDesc cur_tensor_desc; | |||||
| result = var_resource_->SaveVarAddr( | |||||
| var_name, tensor_desc, reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type); | |||||
| if (result != SUCCESS) { | |||||
| GELOGE(ge::INTERNAL_ERROR, "AssignVarMem by offset failed."); | |||||
| return ge::INTERNAL_ERROR; | |||||
| } | |||||
| } | |||||
| // old not exist only save new tensor | |||||
| result = var_resource_->GetCurVarDesc(var_name, cur_tensor_desc); | result = var_resource_->GetCurVarDesc(var_name, cur_tensor_desc); | ||||
| if (result != SUCCESS) { | if (result != SUCCESS) { | ||||
| var_resource_->SetVarAddr(var_name, tensor_desc, | var_resource_->SetVarAddr(var_name, tensor_desc, | ||||
| reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type); | reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type); | ||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| if (cur_tensor_desc.GetFormat() != tensor_desc.GetFormat() || | |||||
| cur_tensor_desc.GetDataType() != tensor_desc.GetDataType() || | |||||
| cur_tensor_desc.GetShape().GetDims() != tensor_desc.GetShape().GetDims()) { | |||||
| bool format_changed = cur_tensor_desc.GetFormat() != tensor_desc.GetFormat() || | |||||
| cur_tensor_desc.GetDataType() != tensor_desc.GetDataType() || | |||||
| cur_tensor_desc.GetShape().GetDims() != tensor_desc.GetShape().GetDims(); | |||||
| if (format_changed) { | |||||
| GELOGI("var %s assigned new memory (format, data type, shape) (%s, %s, %zu) from (%s, %s, %zu)", var_name.c_str(), | GELOGI("var %s assigned new memory (format, data type, shape) (%s, %s, %zu) from (%s, %s, %zu)", var_name.c_str(), | ||||
| ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(), | ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(), | ||||
| ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(), | ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(), | ||||