blob: a880b9a1831906e9c266200a0db752c92ab2d6e1 [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
Aron Virginas-Tar56055192018-11-12 18:10:43 +00007#include <backendsCommon/IMemoryManager.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <backendsCommon/WorkloadFactory.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +01009
10#ifdef ARMCOMPUTENEON_ENABLED
David Beckac42efd2018-09-26 17:41:13 +010011#include <arm_compute/runtime/MemoryGroup.h>
telsoa01c577f2c2018-08-31 09:22:23 +010012#endif
13
14#ifdef ARMCOMPUTECL_ENABLED
David Beckac42efd2018-09-26 17:41:13 +010015#include <arm_compute/runtime/CL/CLMemoryGroup.h>
telsoa01c577f2c2018-08-31 09:22:23 +010016#endif
17
18#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
David Beckac42efd2018-09-26 17:41:13 +010019#include <arm_compute/runtime/IAllocator.h>
20#include <arm_compute/runtime/IMemoryGroup.h>
21#include <arm_compute/runtime/MemoryManagerOnDemand.h>
telsoa01c577f2c2018-08-31 09:22:23 +010022#endif
23
24namespace armnn
25{
26
Aron Virginas-Tar56055192018-11-12 18:10:43 +000027class BaseMemoryManager : public IMemoryManager
telsoa01c577f2c2018-08-31 09:22:23 +010028{
29public:
30 enum class MemoryAffinity
31 {
32 Buffer,
33 Offset
34 };
35
36 BaseMemoryManager() { }
37 virtual ~BaseMemoryManager() { }
38
Aron Virginas-Tar56055192018-11-12 18:10:43 +000039 void Acquire() override;
40 void Release() override;
41
telsoa01c577f2c2018-08-31 09:22:23 +010042#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
43
44 BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity);
45
46 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
47 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
48 std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; }
49
telsoa01c577f2c2018-08-31 09:22:23 +010050protected:
telsoa01c577f2c2018-08-31 09:22:23 +010051 std::unique_ptr<arm_compute::IAllocator> m_Allocator;
52 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr;
53 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr;
54 std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup;
55
56 std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity);
57
58 virtual std::shared_ptr<arm_compute::IMemoryGroup>
59 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0;
60
telsoa01c577f2c2018-08-31 09:22:23 +010061#endif
62};
63
64class NeonMemoryManager : public BaseMemoryManager
65{
66public:
67 NeonMemoryManager() {}
68 virtual ~NeonMemoryManager() {}
69
70#ifdef ARMCOMPUTENEON_ENABLED
71 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity)
72 : BaseMemoryManager(std::move(alloc), memoryAffinity)
73 {
74 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
75 }
76
77protected:
78 virtual std::shared_ptr<arm_compute::IMemoryGroup>
79 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
80#endif
81};
82
83class ClMemoryManager : public BaseMemoryManager
84{
85public:
86 ClMemoryManager() {}
87 virtual ~ClMemoryManager() {}
88
89#ifdef ARMCOMPUTECL_ENABLED
90 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
91 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
92 {
93 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
94 }
95
96protected:
97 virtual std::shared_ptr<arm_compute::IMemoryGroup>
98 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
99#endif
100};
101
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +0100102} //namespace armnn