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 <backendsCommon/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 namespace armnn 21 { 22 23 class BaseMemoryManager : public IMemoryManager 24 { 25 public: 26 enum class MemoryAffinity 27 { 28 Buffer, 29 Offset 30 }; 31 BaseMemoryManager()32 BaseMemoryManager() { } ~BaseMemoryManager()33 virtual ~BaseMemoryManager() { } 34 35 void Acquire() override; 36 void Release() override; 37 38 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) 39 BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity); 40 GetIntraLayerManager()41 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; } GetInterLayerManager()42 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; } GetInterLayerMemoryGroup()43 std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; } 44 45 protected: 46 std::unique_ptr<arm_compute::IAllocator> m_Allocator; 47 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr; 48 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr; 49 std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup; 50 51 std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity); 52 53 virtual std::shared_ptr<arm_compute::IMemoryGroup> 54 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0; 55 #endif 56 }; 57 58 #if defined(ARMCOMPUTENEON_ENABLED) 59 class NeonMemoryManager : public BaseMemoryManager 60 { 61 public: NeonMemoryManager()62 NeonMemoryManager() {} ~NeonMemoryManager()63 virtual ~NeonMemoryManager() {} 64 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc,MemoryAffinity memoryAffinity)65 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity) 66 : BaseMemoryManager(std::move(alloc), memoryAffinity) 67 { 68 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); 69 } 70 71 protected: 72 std::shared_ptr<arm_compute::IMemoryGroup> 73 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; 74 }; 75 #endif 76 77 #if defined(ARMCOMPUTECL_ENABLED) 78 class ClMemoryManager : public BaseMemoryManager 79 { 80 public: ClMemoryManager()81 ClMemoryManager() {} ~ClMemoryManager()82 virtual ~ClMemoryManager() {} 83 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)84 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc) 85 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer) 86 { 87 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); 88 } 89 90 protected: 91 std::shared_ptr<arm_compute::IMemoryGroup> 92 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; 93 }; 94 #endif 95 96 } //namespace armnn 97