blob: b8d1922d62c73c7ec6cbc7dfa686eaaa79038ca3 [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
Matteo Martincighd95e9062019-01-31 15:35:59 +000010#if defined(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
Matteo Martincighd95e9062019-01-31 15:35:59 +000014#if defined(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)
telsoa01c577f2c2018-08-31 09:22:23 +010043 BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity);
44
45 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
46 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
47 std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; }
48
telsoa01c577f2c2018-08-31 09:22:23 +010049protected:
telsoa01c577f2c2018-08-31 09:22:23 +010050 std::unique_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;
telsoa01c577f2c2018-08-31 09:22:23 +010059#endif
60};
61
Matteo Martincighd95e9062019-01-31 15:35:59 +000062#if defined(ARMCOMPUTENEON_ENABLED)
telsoa01c577f2c2018-08-31 09:22:23 +010063class NeonMemoryManager : public BaseMemoryManager
64{
65public:
66 NeonMemoryManager() {}
67 virtual ~NeonMemoryManager() {}
68
telsoa01c577f2c2018-08-31 09:22:23 +010069 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
75protected:
Matteo Martincighd95e9062019-01-31 15:35:59 +000076 std::shared_ptr<arm_compute::IMemoryGroup>
telsoa01c577f2c2018-08-31 09:22:23 +010077 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
telsoa01c577f2c2018-08-31 09:22:23 +010078};
Matteo Martincighd95e9062019-01-31 15:35:59 +000079#endif
telsoa01c577f2c2018-08-31 09:22:23 +010080
Matteo Martincighd95e9062019-01-31 15:35:59 +000081#if defined(ARMCOMPUTECL_ENABLED)
telsoa01c577f2c2018-08-31 09:22:23 +010082class ClMemoryManager : public BaseMemoryManager
83{
84public:
85 ClMemoryManager() {}
86 virtual ~ClMemoryManager() {}
87
telsoa01c577f2c2018-08-31 09:22:23 +010088 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
89 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
90 {
91 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
92 }
93
94protected:
Matteo Martincighd95e9062019-01-31 15:35:59 +000095 std::shared_ptr<arm_compute::IMemoryGroup>
telsoa01c577f2c2018-08-31 09:22:23 +010096 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
telsoa01c577f2c2018-08-31 09:22:23 +010097};
Matteo Martincighd95e9062019-01-31 15:35:59 +000098#endif
telsoa01c577f2c2018-08-31 09:22:23 +010099
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +0100100} //namespace armnn