1 // 2 // Copyright © 2017 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #include "BaseMemoryManager.hpp" 6 7 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) 8 #include "arm_compute/runtime/BlobLifetimeManager.h" 9 #include "arm_compute/runtime/PoolManager.h" 10 #include "arm_compute/runtime/OffsetLifetimeManager.h" 11 #endif 12 13 14 namespace armnn 15 { 16 17 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) BaseMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc,MemoryAffinity memoryAffinity)18BaseMemoryManager::BaseMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc, 19 MemoryAffinity memoryAffinity) 20 { 21 ARMNN_ASSERT(alloc); 22 m_Allocator = std::move(alloc); 23 24 m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity); 25 m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity); 26 } 27 28 std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)29BaseMemoryManager::CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity) 30 { 31 std::shared_ptr<arm_compute::ILifetimeManager> lifetimeManager = nullptr; 32 33 if (memoryAffinity == MemoryAffinity::Buffer) 34 { 35 lifetimeManager = std::make_shared<arm_compute::BlobLifetimeManager>(); 36 } 37 else 38 { 39 lifetimeManager = std::make_shared<arm_compute::OffsetLifetimeManager>(); 40 } 41 42 auto poolManager = std::make_shared<arm_compute::PoolManager>(); 43 auto memoryManager = std::make_shared<arm_compute::MemoryManagerOnDemand>(lifetimeManager, poolManager); 44 45 return memoryManager; 46 } 47 Acquire()48void BaseMemoryManager::Acquire() 49 { 50 static const size_t s_NumPools = 1; 51 52 // Allocate memory pools for intra-layer memory manager 53 ARMNN_ASSERT(m_IntraLayerMemoryMgr); 54 m_IntraLayerMemoryMgr->populate(*m_Allocator, s_NumPools); 55 56 // Allocate memory pools for inter-layer memory manager 57 ARMNN_ASSERT(m_InterLayerMemoryMgr); 58 m_InterLayerMemoryMgr->populate(*m_Allocator, s_NumPools); 59 60 // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools 61 ARMNN_ASSERT(m_InterLayerMemoryGroup); 62 m_InterLayerMemoryGroup->acquire(); 63 } 64 Release()65void BaseMemoryManager::Release() 66 { 67 // Release inter-layer memory group. NOTE: This has to come before releasing the pools 68 ARMNN_ASSERT(m_InterLayerMemoryGroup); 69 m_InterLayerMemoryGroup->release(); 70 71 // Release memory pools managed by intra-layer memory manager 72 ARMNN_ASSERT(m_IntraLayerMemoryMgr); 73 m_IntraLayerMemoryMgr->clear(); 74 75 // Release memory pools managed by inter-layer memory manager 76 ARMNN_ASSERT(m_InterLayerMemoryMgr); 77 m_InterLayerMemoryMgr->clear(); 78 } 79 #else 80 void BaseMemoryManager::Acquire() 81 { 82 // No-op if neither NEON nor CL enabled 83 } 84 85 void BaseMemoryManager::Release() 86 { 87 // No-op if neither NEON nor CL enabled 88 } 89 #endif 90 91 #if defined(ARMCOMPUTENEON_ENABLED) 92 std::shared_ptr<arm_compute::IMemoryGroup> CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand> & memoryManager)93NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) 94 { 95 return std::make_shared<arm_compute::MemoryGroup>(memoryManager); 96 } 97 #endif 98 99 #if defined(ARMCOMPUTECL_ENABLED) 100 std::shared_ptr<arm_compute::IMemoryGroup> CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand> & memoryManager)101ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) 102 { 103 return std::make_shared<arm_compute::MemoryGroup>(memoryManager); 104 } 105 #endif 106 107 } 108