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