From db06da7cc1fb6f48b8b423c8f98d69c8fecb7ffd Mon Sep 17 00:00:00 2001 From: wandongdong Date: Wed, 19 Aug 2020 19:29:00 -0700 Subject: [PATCH] add Prepare for tensor read/write --- mindspore/lite/src/ir/tensor.cc | 1 + mindspore/lite/src/ir/tensor.h | 6 +++++ mindspore/lite/src/runtime/allocator.h | 1 + .../kernel/opencl/subgraph_opencl_kernel.cc | 24 ------------------- .../src/runtime/opencl/opencl_allocator.cc | 10 ++++---- .../src/runtime/opencl/opencl_allocator.h | 7 ++++++ mindspore/lite/src/scheduler.cc | 24 ++++--------------- 7 files changed, 25 insertions(+), 48 deletions(-) diff --git a/mindspore/lite/src/ir/tensor.cc b/mindspore/lite/src/ir/tensor.cc index 091ec942ae..1556d64aa6 100644 --- a/mindspore/lite/src/ir/tensor.cc +++ b/mindspore/lite/src/ir/tensor.cc @@ -318,6 +318,7 @@ size_t LiteTensor::Size() const { void *LiteTensor::MutableData() const { MS_ASSERT(this->tensor_impl_ != nullptr); + this->tensor_impl_->Prepare(); auto data = this->tensor_impl_->Data(); if (nullptr == data) { auto ret = tensor_impl_->MallocData(); diff --git a/mindspore/lite/src/ir/tensor.h b/mindspore/lite/src/ir/tensor.h index 74bf07ec98..0c9ff258fc 100644 --- a/mindspore/lite/src/ir/tensor.h +++ b/mindspore/lite/src/ir/tensor.h @@ -177,6 +177,12 @@ class Tensor : public mindspore::tensor::MetaTensor { std::vector GetQuantParams() const; + void Prepare() { + if (allocator_ != nullptr) { + data_ = allocator_->Prepare(data_); + } + } + protected: void *data_ = nullptr; void *device_data_ = nullptr; diff --git a/mindspore/lite/src/runtime/allocator.h b/mindspore/lite/src/runtime/allocator.h index 9d44bd6f89..b5acf0fdfd 100644 --- a/mindspore/lite/src/runtime/allocator.h +++ b/mindspore/lite/src/runtime/allocator.h @@ -41,6 +41,7 @@ class Allocator { virtual size_t GetTotalSize() { return 0; } virtual void Clear() {} static std::shared_ptr Create(); + virtual void *Prepare(void *ptr) { return ptr; } std::string name; }; diff --git a/mindspore/lite/src/runtime/kernel/opencl/subgraph_opencl_kernel.cc b/mindspore/lite/src/runtime/kernel/opencl/subgraph_opencl_kernel.cc index a6d82e0325..93f14131e1 100644 --- a/mindspore/lite/src/runtime/kernel/opencl/subgraph_opencl_kernel.cc +++ b/mindspore/lite/src/runtime/kernel/opencl/subgraph_opencl_kernel.cc @@ -165,17 +165,6 @@ int SubGraphOpenCLKernel::Init() { MallocTensorWithReuse(); - // Map buffer for write, it is not necessary for fine-grained - for (auto &tensor : in_tensors_) { - void *data = tensor->Data(); - // It is required with coarse-grained SVM - if (data != nullptr) { - data = allocator_->MapBuffer(data, CL_MAP_WRITE, nullptr, true); - tensor->SetData(data); - } else { - MS_LOG(ERROR) << "SubGraphOpenCLKernel input nullptr!"; - } - } return RET_OK; } @@ -254,26 +243,13 @@ int SubGraphOpenCLKernel::GetKernelFromToTensor(const std::vectorFreeData(); - } - } - for (const auto tensor : out_tensors_) { - if (tensor != nullptr) { - allocator_->UnmapBuffer(tensor->Data()); - tensor->FreeData(); - } - } for (const auto tensor : in_convert_tensors_) { if (tensor != nullptr) { - tensor->FreeData(); delete tensor; } } for (const auto tensor : out_convert_tensors_) { if (tensor != nullptr) { - tensor->FreeData(); delete tensor; } } diff --git a/mindspore/lite/src/runtime/opencl/opencl_allocator.cc b/mindspore/lite/src/runtime/opencl/opencl_allocator.cc index 0f383ffeeb..ac423a3c6d 100644 --- a/mindspore/lite/src/runtime/opencl/opencl_allocator.cc +++ b/mindspore/lite/src/runtime/opencl/opencl_allocator.cc @@ -202,13 +202,14 @@ void OpenCLAllocator::Free(void *buf) { allocated_list_.erase(iter); free_list_.insert(std::make_pair(mem_buf->size_, mem_buf)); UnLock(); + buf = nullptr; MS_LOG(DEBUG) << "Free a new Image2D. size: " << mem_buf->size_ << ", host addr: " << mem_buf->host_ptr_ - << ", device addr: " << mem_buf->device_ptr_ << ", image addr: " << mem_buf->image_ptr_; + << ", device addr: " << mem_buf->device_ptr_ << ", image addr: " << mem_buf->image_ptr_ + << ", free list size: " << free_list_.size(); return; } UnLock(); - free(buf); - MS_LOG(DEBUG) << "Free host ptr: " << buf; + MS_LOG(WARNING) << "Host ptr " << buf << " has freed"; } size_t OpenCLAllocator::GetTotalSize() { @@ -305,7 +306,8 @@ void *OpenCLAllocator::MapBuffer(void *host_ptr, int flags, void *command_queue, new_host_ptr = ocl_runtime->MapBuffer(*image, 0, CL_MAP_READ | CL_MAP_WRITE, region); } if (new_host_ptr == nullptr) { - MS_LOG(ERROR) << "Map buffer failed, can not found buffer :" << mem_buf->device_ptr_ << ", host_ptr=" << host_ptr; + MS_LOG(WARNING) << "Map buffer failed, can not found buffer or already mapped, dev_ptr=" << mem_buf->device_ptr_ + << ", host_ptr=" << host_ptr; UnLock(); return nullptr; } diff --git a/mindspore/lite/src/runtime/opencl/opencl_allocator.h b/mindspore/lite/src/runtime/opencl/opencl_allocator.h index 69cdc8c718..f76d832616 100644 --- a/mindspore/lite/src/runtime/opencl/opencl_allocator.h +++ b/mindspore/lite/src/runtime/opencl/opencl_allocator.h @@ -25,6 +25,7 @@ #include #include #include "src/runtime/allocator.h" +#include "CL/cl2.hpp" namespace mindspore::lite::opencl { @@ -59,6 +60,12 @@ class OpenCLAllocator : public Allocator { int UnmapBuffer(void *host_ptr, void *command_queue = nullptr); MEM_TYPE GetMemType(void *host_ptr); int GetImageSize(void *host_ptr, std::vector *img_size); + void *Prepare(void *ptr) override { + if (ptr != nullptr) { + ptr = MapBuffer(ptr, CL_MAP_WRITE, nullptr, true); + } + return ptr; + } private: void Lock(); diff --git a/mindspore/lite/src/scheduler.cc b/mindspore/lite/src/scheduler.cc index 7ab0ebd2fb..8b48d89371 100644 --- a/mindspore/lite/src/scheduler.cc +++ b/mindspore/lite/src/scheduler.cc @@ -201,26 +201,10 @@ kernel::LiteKernel *Scheduler::CreateSubKernel(const std::vector input_kernels{head_kernel}; - std::vector output_kernels{tail_kernel}; - std::vector input_tensors; - std::vector output_tensors; - for (auto tensor : head_kernel->in_tensors()) { - if (tensor->Data() == nullptr) { - input_tensors.emplace_back(tensor); - } - } - for (auto tensor : tail_kernel->out_tensors()) { - if (tensor->Data() == nullptr) { - output_tensors.emplace_back(tensor); - } - } - // std::vector input_tensors = kernel::LiteKernelUtil::SubgraphInputTensors(kernels); - // std::vector output_tensors = kernel::LiteKernelUtil::SubgraphOutputTensors(kernels); - // std::vector input_kernels = kernel::LiteKernelUtil::SubgraphInputKernels(kernels); - // std::vector output_kernels = kernel::LiteKernelUtil::SubgraphOutputKernels(kernels); + std::vector input_tensors = kernel::LiteKernelUtil::SubgraphInputTensors(kernels); + std::vector output_tensors = kernel::LiteKernelUtil::SubgraphOutputTensors(kernels); + std::vector input_kernels = kernel::LiteKernelUtil::SubgraphInputKernels(kernels); + std::vector output_kernels = kernel::LiteKernelUtil::SubgraphOutputKernels(kernels); sub_kernel = new kernel::SubGraphOpenCLKernel(input_tensors, output_tensors, input_kernels, output_kernels, kernels); sub_kernel->Init();