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