| @@ -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); | |||
| 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) { | |||
| REPORT_INNER_ERROR("E19999", "VarManager has not been init, memory_type:%d, session_id:%lu, " | |||
| "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; | |||
| } | |||
| 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); | |||
| if (result != SUCCESS) { | |||
| var_resource_->SetVarAddr(var_name, tensor_desc, | |||
| reinterpret_cast<uint8_t *>(static_cast<uintptr_t>(mem_offset)), memory_type); | |||
| 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(), | |||
| ge::TypeUtils::DataTypeToSerialString(tensor_desc.GetDataType()).c_str(), | |||
| ge::TypeUtils::FormatToSerialString(tensor_desc.GetFormat()).c_str(), | |||