blob: 2afc1cb130e9e4d76b72d9416da76f995650b64b [file] [log] [blame]
telsoa01c577f2c2018-08-31 09:22:23 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa01c577f2c2018-08-31 09:22:23 +01004//
5#pragma once
6
David Beckac42efd2018-09-26 17:41:13 +01007#include <backends/WorkloadFactory.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01008
9#ifdef ARMCOMPUTENEON_ENABLED
David Beckac42efd2018-09-26 17:41:13 +010010#include <arm_compute/runtime/MemoryGroup.h>
telsoa01c577f2c2018-08-31 09:22:23 +010011#endif
12
13#ifdef ARMCOMPUTECL_ENABLED
David Beckac42efd2018-09-26 17:41:13 +010014#include <arm_compute/runtime/CL/CLMemoryGroup.h>
telsoa01c577f2c2018-08-31 09:22:23 +010015#endif
16
17#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
David Beckac42efd2018-09-26 17:41:13 +010018#include <arm_compute/runtime/IAllocator.h>
19#include <arm_compute/runtime/IMemoryGroup.h>
20#include <arm_compute/runtime/MemoryManagerOnDemand.h>
telsoa01c577f2c2018-08-31 09:22:23 +010021#endif
22
23namespace armnn
24{
25
26class BaseMemoryManager
27{
28public:
29 enum class MemoryAffinity
30 {
31 Buffer,
32 Offset
33 };
34
35 BaseMemoryManager() { }
36 virtual ~BaseMemoryManager() { }
37
38#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
39
40 BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity);
41
42 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
43 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
44 std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; }
45
46 void Finalize();
47 void Acquire();
48 void Release();
49
50protected:
51
52 std::unique_ptr<arm_compute::IAllocator> m_Allocator;
53 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr;
54 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr;
55 std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup;
56
57 std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity);
58
59 virtual std::shared_ptr<arm_compute::IMemoryGroup>
60 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0;
61
62 void FinalizeMemoryManager(arm_compute::MemoryManagerOnDemand& memoryManager);
63#endif
64};
65
66class NeonMemoryManager : public BaseMemoryManager
67{
68public:
69 NeonMemoryManager() {}
70 virtual ~NeonMemoryManager() {}
71
72#ifdef ARMCOMPUTENEON_ENABLED
73 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity)
74 : BaseMemoryManager(std::move(alloc), memoryAffinity)
75 {
76 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
77 }
78
79protected:
80 virtual std::shared_ptr<arm_compute::IMemoryGroup>
81 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
82#endif
83};
84
85class ClMemoryManager : public BaseMemoryManager
86{
87public:
88 ClMemoryManager() {}
89 virtual ~ClMemoryManager() {}
90
91#ifdef ARMCOMPUTECL_ENABLED
92 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
93 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
94 {
95 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
96 }
97
98protected:
99 virtual std::shared_ptr<arm_compute::IMemoryGroup>
100 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
101#endif
102};
103
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +0100104} //namespace armnn