|
|
|
@ -42,7 +42,6 @@ KernelRuntime::~KernelRuntime() {
|
|
|
|
|
#ifdef ENABLE_DUMP_E2E
|
|
|
|
|
dump_conf_ptr_ = nullptr;
|
|
|
|
|
#endif
|
|
|
|
|
reuse_mem_base_ = nullptr;
|
|
|
|
|
mem_reuse_util_ptr_ = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -476,9 +475,9 @@ void KernelRuntime::ReuseAssignDynamicMemory(session::KernelGraph *graph) {
|
|
|
|
|
bestfit_mem_reuse->Reuse(mem_reuse_util_ptr.get());
|
|
|
|
|
size_t total_allocated_size = bestfit_mem_reuse->GetAllocatedSize();
|
|
|
|
|
MS_LOG(INFO) << "TotalReuseDynamicSize [" << total_allocated_size << "]";
|
|
|
|
|
auto base_ptr = MallocDynamicMem(total_allocated_size, false);
|
|
|
|
|
reuse_mem_base_ = base_ptr;
|
|
|
|
|
mem_reuse_util_ptr_ = mem_reuse_util_ptr;
|
|
|
|
|
auto base_ptr = MallocDynamicMem(total_allocated_size, false);
|
|
|
|
|
mem_reuse_util_ptr_->set_mem_base(base_ptr);
|
|
|
|
|
auto &kernels = graph->execution_order();
|
|
|
|
|
for (auto &kernel : kernels) {
|
|
|
|
|
AssignNodeOutputMem(kReuseDynamicMem, kernel, kGetAllOuts);
|
|
|
|
@ -488,22 +487,13 @@ void KernelRuntime::ReuseAssignDynamicMemory(session::KernelGraph *graph) {
|
|
|
|
|
|
|
|
|
|
void KernelRuntime::AssignReuseWorkSpaceMem(const AnfNodePtr &node) {
|
|
|
|
|
MS_EXCEPTION_IF_NULL(node);
|
|
|
|
|
auto key = node.get();
|
|
|
|
|
auto kernel_mod = AnfAlgo::GetKernelMod(node);
|
|
|
|
|
MS_EXCEPTION_IF_NULL(kernel_mod);
|
|
|
|
|
size_t index = 0;
|
|
|
|
|
auto iter = mem_reuse_util_ptr_->kernel_workspace_refs_.find(key);
|
|
|
|
|
for (auto &size : kernel_mod->GetWorkspaceSizeList()) {
|
|
|
|
|
if (iter != mem_reuse_util_ptr_->kernel_workspace_refs_.end()) {
|
|
|
|
|
if (index >= iter->second.size()) {
|
|
|
|
|
MS_LOG(EXCEPTION) << "index:[" << index << "] is larger than it's workspace size:[" << iter->second.size()
|
|
|
|
|
<< "]";
|
|
|
|
|
}
|
|
|
|
|
auto wk_ref = iter->second[index];
|
|
|
|
|
auto wk_ptr = reuse_mem_base_ + wk_ref->offset_;
|
|
|
|
|
AnfAlgo::SetWorkspaceAddr(CreateDeviceAddress(wk_ptr, size, "", kTypeUnknown), index, node.get());
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
auto wk_ptr = mem_reuse_util_ptr_->GetNodeWorkSpacePtr(node, index);
|
|
|
|
|
AnfAlgo::SetWorkspaceAddr(CreateDeviceAddress(wk_ptr, size, "", kTypeUnknown), index, node.get());
|
|
|
|
|
index++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -554,18 +544,7 @@ uint8_t *KernelRuntime::CalDeviceMem(const AnfNodePtr &node, size_t size, int fl
|
|
|
|
|
} else if (flag == kDynamicMem) {
|
|
|
|
|
ptr = MallocDynamicMem(size, false);
|
|
|
|
|
} else if (flag == kReuseDynamicMem) {
|
|
|
|
|
auto key = node.get();
|
|
|
|
|
auto iter = mem_reuse_util_ptr_->kernel_output_refs_.find(key);
|
|
|
|
|
if (iter != mem_reuse_util_ptr_->kernel_output_refs_.end()) {
|
|
|
|
|
// private member form KernelRuntime
|
|
|
|
|
memreuse::KernelRefCountPtr kernel_ref_count_ptr = mem_reuse_util_ptr_->kernel_output_refs_[key][index];
|
|
|
|
|
if (kernel_ref_count_ptr == nullptr) {
|
|
|
|
|
return ptr;
|
|
|
|
|
}
|
|
|
|
|
ptr = reuse_mem_base_ + kernel_ref_count_ptr->offset_;
|
|
|
|
|
} else {
|
|
|
|
|
MS_LOG(EXCEPTION) << "node [" << AnfAlgo::GetCNodeName(node) << "] don't exist in kernel_output_refs";
|
|
|
|
|
}
|
|
|
|
|
ptr = mem_reuse_util_ptr_->GetNodeOutputPtr(node, index);
|
|
|
|
|
}
|
|
|
|
|
return ptr;
|
|
|
|
|
}
|
|
|
|
|