IVGCVSW-3882 Update ACL pin
[platform/upstream/armnn.git] / src / backends / aclCommon / BaseMemoryManager.hpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6
7 #include <backendsCommon/IMemoryManager.hpp>
8 #include <backendsCommon/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 namespace armnn
21 {
22
23 class BaseMemoryManager : public IMemoryManager
24 {
25 public:
26     enum class MemoryAffinity
27     {
28         Buffer,
29         Offset
30     };
31
32     BaseMemoryManager() { }
33     virtual ~BaseMemoryManager() { }
34
35     void Acquire() override;
36     void Release() override;
37
38 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
39     BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity);
40
41     std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
42     std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
43     std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup()      { return m_InterLayerMemoryGroup; }
44
45 protected:
46     std::unique_ptr<arm_compute::IAllocator>            m_Allocator;
47     std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr;
48     std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr;
49     std::shared_ptr<arm_compute::IMemoryGroup>          m_InterLayerMemoryGroup;
50
51     std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity);
52
53     virtual std::shared_ptr<arm_compute::IMemoryGroup>
54     CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0;
55 #endif
56 };
57
58 #if defined(ARMCOMPUTENEON_ENABLED)
59 class NeonMemoryManager : public BaseMemoryManager
60 {
61 public:
62     NeonMemoryManager() {}
63     virtual ~NeonMemoryManager() {}
64
65     NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity)
66     : BaseMemoryManager(std::move(alloc), memoryAffinity)
67     {
68         m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
69     }
70
71 protected:
72     std::shared_ptr<arm_compute::IMemoryGroup>
73     CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
74 };
75 #endif
76
77 #if defined(ARMCOMPUTECL_ENABLED)
78 class ClMemoryManager : public BaseMemoryManager
79 {
80 public:
81     ClMemoryManager() {}
82     virtual ~ClMemoryManager() {}
83
84     ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
85     : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
86     {
87         m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
88     }
89
90 protected:
91     std::shared_ptr<arm_compute::IMemoryGroup>
92     CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
93 };
94 #endif
95
96 } //namespace armnn