xref: /aosp_15_r20/external/armnn/src/backends/aclCommon/BaseMemoryManager.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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)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 
24     m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
25     m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
26 }
27 
28 std::shared_ptr<arm_compute::MemoryManagerOnDemand>
CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)29 BaseMemoryManager::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()48 void 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()65 void 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)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>
CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand> & memoryManager)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 }
108