• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <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 
BaseMemoryManager()32     BaseMemoryManager() { }
~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 
GetIntraLayerManager()41     std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
GetInterLayerManager()42     std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
GetInterLayerMemoryGroup()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:
NeonMemoryManager()62     NeonMemoryManager() {}
~NeonMemoryManager()63     virtual ~NeonMemoryManager() {}
64 
NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc,MemoryAffinity memoryAffinity)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:
ClMemoryManager()81     ClMemoryManager() {}
~ClMemoryManager()82     virtual ~ClMemoryManager() {}
83 
ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)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
97