1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/IMemoryManager.hpp> 8*89c4ff92SAndroid Build Coastguard Worker #include <armnn/backends/WorkloadFactory.hpp> 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) 11*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/MemoryGroup.h> 12*89c4ff92SAndroid Build Coastguard Worker #endif 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) 15*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/IAllocator.h> 16*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/IMemoryGroup.h> 17*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/MemoryManagerOnDemand.h> 18*89c4ff92SAndroid Build Coastguard Worker #endif 19*89c4ff92SAndroid Build Coastguard Worker 20*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTECL_ENABLED) 21*89c4ff92SAndroid Build Coastguard Worker #include <arm_compute/runtime/CL/CLTensorAllocator.h> 22*89c4ff92SAndroid Build Coastguard Worker #endif 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker namespace armnn 25*89c4ff92SAndroid Build Coastguard Worker { 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker class BaseMemoryManager : public IMemoryManager 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker public: 30*89c4ff92SAndroid Build Coastguard Worker enum class MemoryAffinity 31*89c4ff92SAndroid Build Coastguard Worker { 32*89c4ff92SAndroid Build Coastguard Worker Buffer, 33*89c4ff92SAndroid Build Coastguard Worker Offset 34*89c4ff92SAndroid Build Coastguard Worker }; 35*89c4ff92SAndroid Build Coastguard Worker BaseMemoryManager()36*89c4ff92SAndroid Build Coastguard Worker BaseMemoryManager() { } ~BaseMemoryManager()37*89c4ff92SAndroid Build Coastguard Worker virtual ~BaseMemoryManager() { } 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker void Acquire() override; 40*89c4ff92SAndroid Build Coastguard Worker void Release() override; 41*89c4ff92SAndroid Build Coastguard Worker 42*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) 43*89c4ff92SAndroid Build Coastguard Worker BaseMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity); 44*89c4ff92SAndroid Build Coastguard Worker GetIntraLayerManager()45*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; } GetInterLayerManager()46*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; } GetInterLayerMemoryGroup()47*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; } 48*89c4ff92SAndroid Build Coastguard Worker 49*89c4ff92SAndroid Build Coastguard Worker protected: 50*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::IAllocator> m_Allocator; 51*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr; 52*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr; 53*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup; 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity); 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker virtual std::shared_ptr<arm_compute::IMemoryGroup> 58*89c4ff92SAndroid Build Coastguard Worker CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0; 59*89c4ff92SAndroid Build Coastguard Worker #endif 60*89c4ff92SAndroid Build Coastguard Worker }; 61*89c4ff92SAndroid Build Coastguard Worker 62*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTENEON_ENABLED) 63*89c4ff92SAndroid Build Coastguard Worker class NeonMemoryManager : public BaseMemoryManager 64*89c4ff92SAndroid Build Coastguard Worker { 65*89c4ff92SAndroid Build Coastguard Worker public: NeonMemoryManager()66*89c4ff92SAndroid Build Coastguard Worker NeonMemoryManager() {} ~NeonMemoryManager()67*89c4ff92SAndroid Build Coastguard Worker virtual ~NeonMemoryManager() {} 68*89c4ff92SAndroid Build Coastguard Worker NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc,MemoryAffinity memoryAffinity)69*89c4ff92SAndroid Build Coastguard Worker NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity) 70*89c4ff92SAndroid Build Coastguard Worker : BaseMemoryManager(std::move(alloc), memoryAffinity) 71*89c4ff92SAndroid Build Coastguard Worker { 72*89c4ff92SAndroid Build Coastguard Worker m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); 73*89c4ff92SAndroid Build Coastguard Worker } 74*89c4ff92SAndroid Build Coastguard Worker 75*89c4ff92SAndroid Build Coastguard Worker protected: 76*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::IMemoryGroup> 77*89c4ff92SAndroid Build Coastguard Worker CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; 78*89c4ff92SAndroid Build Coastguard Worker }; 79*89c4ff92SAndroid Build Coastguard Worker #endif 80*89c4ff92SAndroid Build Coastguard Worker 81*89c4ff92SAndroid Build Coastguard Worker #if defined(ARMCOMPUTECL_ENABLED) 82*89c4ff92SAndroid Build Coastguard Worker class ClMemoryManager : public BaseMemoryManager 83*89c4ff92SAndroid Build Coastguard Worker { 84*89c4ff92SAndroid Build Coastguard Worker public: ClMemoryManager()85*89c4ff92SAndroid Build Coastguard Worker ClMemoryManager() {} ~ClMemoryManager()86*89c4ff92SAndroid Build Coastguard Worker virtual ~ClMemoryManager() {} 87*89c4ff92SAndroid Build Coastguard Worker ClMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc)88*89c4ff92SAndroid Build Coastguard Worker ClMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc) 89*89c4ff92SAndroid Build Coastguard Worker : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer) 90*89c4ff92SAndroid Build Coastguard Worker { 91*89c4ff92SAndroid Build Coastguard Worker arm_compute::CLTensorAllocator::set_global_allocator(alloc.get()); 92*89c4ff92SAndroid Build Coastguard Worker m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); 93*89c4ff92SAndroid Build Coastguard Worker } 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker protected: 96*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<arm_compute::IMemoryGroup> 97*89c4ff92SAndroid Build Coastguard Worker CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; 98*89c4ff92SAndroid Build Coastguard Worker }; 99*89c4ff92SAndroid Build Coastguard Worker #endif 100*89c4ff92SAndroid Build Coastguard Worker 101*89c4ff92SAndroid Build Coastguard Worker } //namespace armnn 102