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