ArmNN
 22.08
BaseMemoryManager.cpp
Go to the documentation of this file.
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)
18 BaseMemoryManager::BaseMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc,
19  MemoryAffinity memoryAffinity)
20 {
21  ARMNN_ASSERT(alloc);
22  m_Allocator = std::move(alloc);
23 
26 }
27 
28 std::shared_ptr<arm_compute::MemoryManagerOnDemand>
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 
49 {
50  static const size_t s_NumPools = 1;
51 
52  // Allocate memory pools for intra-layer memory manager
54  m_IntraLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
55 
56  // Allocate memory pools for inter-layer memory manager
58  m_InterLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
59 
60  // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools
62  m_InterLayerMemoryGroup->acquire();
63 }
64 
66 {
67  // Release inter-layer memory group. NOTE: This has to come before releasing the pools
69  m_InterLayerMemoryGroup->release();
70 
71  // Release memory pools managed by intra-layer memory manager
73  m_IntraLayerMemoryMgr->clear();
74 
75  // Release memory pools managed by inter-layer memory manager
77  m_InterLayerMemoryMgr->clear();
78 }
79 #else
81 {
82  // No-op if neither NEON nor CL enabled
83 }
84 
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>
93 NeonMemoryManager::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>
101 ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
102 {
103  return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
104 }
105 #endif
106 
107 }
std::shared_ptr< arm_compute::MemoryManagerOnDemand > CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)
std::shared_ptr< arm_compute::IMemoryGroup > CreateMemoryGroup(const std::shared_ptr< arm_compute::MemoryManagerOnDemand > &memoryManager) override
std::shared_ptr< arm_compute::MemoryManagerOnDemand > m_InterLayerMemoryMgr
std::shared_ptr< arm_compute::MemoryManagerOnDemand > m_IntraLayerMemoryMgr
Copyright (c) 2021 ARM Limited and Contributors.
std::shared_ptr< arm_compute::IMemoryGroup > CreateMemoryGroup(const std::shared_ptr< arm_compute::MemoryManagerOnDemand > &memoryManager) override
std::shared_ptr< arm_compute::IMemoryGroup > m_InterLayerMemoryGroup
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
std::shared_ptr< arm_compute::IAllocator > m_Allocator