// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #ifdef ARMCOMPUTENEON_ENABLED #include #endif #ifdef ARMCOMPUTECL_ENABLED #include #endif #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) #include #include #include #endif namespace armnn { class BaseMemoryManager { public: enum class MemoryAffinity { Buffer, Offset }; BaseMemoryManager() { } virtual ~BaseMemoryManager() { } #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) BaseMemoryManager(std::unique_ptr alloc, MemoryAffinity memoryAffinity); std::shared_ptr& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; } std::shared_ptr& GetInterLayerManager() { return m_InterLayerMemoryMgr; } std::shared_ptr& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; } void Finalize(); void Acquire(); void Release(); protected: std::unique_ptr m_Allocator; std::shared_ptr m_IntraLayerMemoryMgr; std::shared_ptr m_InterLayerMemoryMgr; std::shared_ptr m_InterLayerMemoryGroup; std::shared_ptr CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity); virtual std::shared_ptr CreateMemoryGroup(const std::shared_ptr& memoryManager) = 0; void FinalizeMemoryManager(arm_compute::MemoryManagerOnDemand& memoryManager); #endif }; class NeonMemoryManager : public BaseMemoryManager { public: NeonMemoryManager() {} virtual ~NeonMemoryManager() {} #ifdef ARMCOMPUTENEON_ENABLED NeonMemoryManager(std::unique_ptr alloc, MemoryAffinity memoryAffinity) : BaseMemoryManager(std::move(alloc), memoryAffinity) { m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); } protected: virtual std::shared_ptr CreateMemoryGroup(const std::shared_ptr& memoryManager) override; #endif }; class ClMemoryManager : public BaseMemoryManager { public: ClMemoryManager() {} virtual ~ClMemoryManager() {} #ifdef ARMCOMPUTECL_ENABLED ClMemoryManager(std::unique_ptr alloc) : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer) { m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); } protected: virtual std::shared_ptr CreateMemoryGroup(const std::shared_ptr& memoryManager) override; #endif }; } //namespace armnn