blob: ffa440b3abd7602bd7fd1831317b1d0e424e93d9 [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-Tarc9cc8042018-11-01 16:15:57 +00007#include <backendsCommon/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
telsoa01c577f2c2018-08-31 09:22:23 +010046 void Acquire();
47 void Release();
48
49protected:
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;
59
telsoa01c577f2c2018-08-31 09:22:23 +010060#endif
61};
62
63class NeonMemoryManager : public BaseMemoryManager
64{
65public:
66 NeonMemoryManager() {}
67 virtual ~NeonMemoryManager() {}
68
69#ifdef ARMCOMPUTENEON_ENABLED
70 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity)
71 : BaseMemoryManager(std::move(alloc), memoryAffinity)
72 {
73 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
74 }
75
76protected:
77 virtual std::shared_ptr<arm_compute::IMemoryGroup>
78 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
79#endif
80};
81
82class ClMemoryManager : public BaseMemoryManager
83{
84public:
85 ClMemoryManager() {}
86 virtual ~ClMemoryManager() {}
87
88#ifdef ARMCOMPUTECL_ENABLED
89 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
90 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
91 {
92 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
93 }
94
95protected:
96 virtual std::shared_ptr<arm_compute::IMemoryGroup>
97 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
98#endif
99};
100
Aron Virginas-Tarf9aeef02018-10-12 15:18:03 +0100101} //namespace armnn