/* * Copyright (c) 2019 Samsung Electronics Co., Ltd. All Rights Reserved * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __ONERT_BACKEND_ACL_COMMON_LINEAR_MEMORY_MANAGER_H__ #define __ONERT_BACKEND_ACL_COMMON_LINEAR_MEMORY_MANAGER_H__ #include #include "AclMemoryManager.h" #include "ir/OperandIndexMap.h" #include "util/logging.h" namespace { template std::shared_ptr createMemoryManager() { std::shared_ptr lifetime_mgr = std::make_shared(); std::shared_ptr pool_mgr = std::make_shared(); std::shared_ptr mem_mgr = std::make_shared(lifetime_mgr, pool_mgr); return mem_mgr; } } // namespace namespace onert { namespace backend { namespace acl_common { template class AclLinearMemoryManager : public AclMemoryManager { public: AclLinearMemoryManager() : _allocator{nullptr}, _io_manager{createMemoryManager()}, _io_group{std::make_shared(_io_manager)} { // DO NOTHING } virtual ~AclLinearMemoryManager() = default; void allocate(void) override { _allocator = std::make_shared(); _io_manager->populate(*_allocator, 1); _io_group->acquire(); } void deallocate(void) override { _io_group->release(); _io_manager->clear(); } void startLifetime(const ir::OperandIndex &ind) override { auto &tensors = this->tensors(); assert(tensors.find(ind) != tensors.end()); auto tensor = tensors[ind]; assert(tensor->handle()); _io_group->manage(tensor->handle()); } void finishLifetime(const ir::OperandIndex &ind) override { auto &tensors = this->tensors(); assert(tensors.find(ind) != tensors.end()); auto tensor = tensors[ind]; assert(tensor->allocator()); tensor->allocator()->allocate(); } private: std::shared_ptr _allocator; std::shared_ptr _io_manager; std::shared_ptr _io_group; }; } // namespace acl_common } // namespace backend } // namespace onert #endif // __ONERT_BACKEND_ACL_COMMON_LINEAR_MEMORY_MANAGER_H__