blob: 6e415b9b52798c8ba1dd8d7073c3821d133118a4 [file] [log] [blame]
Matteo Martincigh88054f82019-05-17 12:15:30 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Colm Donelanfcb802b2020-02-13 20:47:08 +00008#include "MockBackendId.hpp"
David Monahanc1536d62020-02-12 15:52:35 +00009#include "armnn/backends/profiling/IBackendProfiling.hpp"
10#include "armnn/backends/profiling/IBackendProfilingContext.hpp"
David Monahanc1536d62020-02-12 15:52:35 +000011
Colm Donelan1aff3932020-02-05 17:48:59 +000012#include <LayerSupportCommon.hpp>
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000013#include <armnn/backends/IBackendInternal.hpp>
14#include <armnn/backends/OptimizationViews.hpp>
Finn Williams032bc742020-02-12 11:02:34 +000015#include <armnn/backends/profiling/IBackendProfiling.hpp>
16#include <backends/BackendProfiling.hpp>
Colm Donelanfcb802b2020-02-13 20:47:08 +000017#include <backendsCommon/LayerSupportBase.hpp>
Matteo Martincigh88054f82019-05-17 12:15:30 +010018
19namespace armnn
20{
21
David Monahanc1536d62020-02-12 15:52:35 +000022class MockBackendInitialiser
23{
24public:
25 MockBackendInitialiser();
26 ~MockBackendInitialiser();
27};
28
David Monahanc1536d62020-02-12 15:52:35 +000029class MockBackendProfilingContext : public profiling::IBackendProfilingContext
30{
31public:
32 MockBackendProfilingContext(IBackendInternal::IBackendProfilingPtr& backendProfiling)
Colm Donelanfcb802b2020-02-13 20:47:08 +000033 : m_BackendProfiling(std::move(backendProfiling))
Finn Williams032bc742020-02-12 11:02:34 +000034 , m_CapturePeriod(0)
David Monahanc1536d62020-02-12 15:52:35 +000035 {}
36
37 ~MockBackendProfilingContext() = default;
38
39 IBackendInternal::IBackendProfilingPtr& GetBackendProfiling()
40 {
41 return m_BackendProfiling;
42 }
43
44 uint16_t RegisterCounters(uint16_t currentMaxGlobalCounterId)
45 {
46 std::unique_ptr<profiling::IRegisterBackendCounters> counterRegistrar =
47 m_BackendProfiling->GetCounterRegistrationInterface(currentMaxGlobalCounterId);
48
Colm Donelanfcb802b2020-02-13 20:47:08 +000049 std::string categoryName("MockCounters");
50 counterRegistrar->RegisterCategory(categoryName);
51 uint16_t nextMaxGlobalCounterId =
52 counterRegistrar->RegisterCounter(0, categoryName, 0, 0, 1.f, "Mock Counter One", "Some notional counter");
David Monahanc1536d62020-02-12 15:52:35 +000053
Colm Donelanfcb802b2020-02-13 20:47:08 +000054 nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(1, categoryName, 0, 0, 1.f, "Mock Counter Two",
55 "Another notional counter");
David Monahanc1536d62020-02-12 15:52:35 +000056
Colm Donelanfcb802b2020-02-13 20:47:08 +000057 std::string units("microseconds");
58 nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(2, categoryName, 0, 0, 1.f, "Mock MultiCore Counter",
59 "A dummy four core counter", units, 4);
60 return nextMaxGlobalCounterId;
David Monahanc1536d62020-02-12 15:52:35 +000061 }
62
Finn Williams032bc742020-02-12 11:02:34 +000063 Optional<std::string> ActivateCounters(uint32_t capturePeriod, const std::vector<uint16_t>& counterIds)
64 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000065 if (capturePeriod == 0 || counterIds.size() == 0)
Finn Williams032bc742020-02-12 11:02:34 +000066 {
67 m_ActiveCounters.clear();
68 }
69 else if (capturePeriod == 15939u)
70 {
71 return armnn::Optional<std::string>("ActivateCounters example test error");
72 }
Colm Donelanfcb802b2020-02-13 20:47:08 +000073 m_CapturePeriod = capturePeriod;
Finn Williams032bc742020-02-12 11:02:34 +000074 m_ActiveCounters = counterIds;
75 return armnn::Optional<std::string>();
76 }
David Monahanc1536d62020-02-12 15:52:35 +000077
78 std::vector<profiling::Timestamp> ReportCounterValues()
79 {
Finn Williams032bc742020-02-12 11:02:34 +000080 std::vector<profiling::CounterValue> counterValues;
81
Colm Donelanfcb802b2020-02-13 20:47:08 +000082 for (auto counterId : m_ActiveCounters)
Finn Williams032bc742020-02-12 11:02:34 +000083 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000084 counterValues.emplace_back(profiling::CounterValue{ counterId, counterId + 1u });
Finn Williams032bc742020-02-12 11:02:34 +000085 }
86
87 uint64_t timestamp = m_CapturePeriod;
Colm Donelanfcb802b2020-02-13 20:47:08 +000088 return { profiling::Timestamp{ timestamp, counterValues } };
David Monahanc1536d62020-02-12 15:52:35 +000089 }
90
David Monahanb015e5d2020-02-26 10:24:03 +000091 bool EnableProfiling(bool)
92 {
93 return true;
94 }
David Monahanc1536d62020-02-12 15:52:35 +000095
96private:
Colm Donelanfcb802b2020-02-13 20:47:08 +000097 IBackendInternal::IBackendProfilingPtr m_BackendProfiling;
Finn Williams032bc742020-02-12 11:02:34 +000098 uint32_t m_CapturePeriod;
99 std::vector<uint16_t> m_ActiveCounters;
David Monahanc1536d62020-02-12 15:52:35 +0000100};
Colm Donelan1aff3932020-02-05 17:48:59 +0000101
Colm Donelanfcb802b2020-02-13 20:47:08 +0000102class MockBackendProfilingService
103{
104public:
105 // Getter for the singleton instance
106 static MockBackendProfilingService& Instance()
107 {
108 static MockBackendProfilingService instance;
109 return instance;
110 }
111
112 MockBackendProfilingContext* GetContext()
113 {
114 return m_sharedContext.get();
115 }
116
117 void SetProfilingContextPtr(std::shared_ptr<MockBackendProfilingContext> shared)
118 {
119 m_sharedContext = shared;
120 }
121
122private:
123 std::shared_ptr<MockBackendProfilingContext> m_sharedContext;
124};
125
Matteo Martincigh88054f82019-05-17 12:15:30 +0100126class MockBackend : public IBackendInternal
127{
128public:
129 MockBackend() = default;
130 ~MockBackend() = default;
131
132 static const BackendId& GetIdStatic();
Colm Donelan1aff3932020-02-05 17:48:59 +0000133 const BackendId& GetId() const override
134 {
135 return GetIdStatic();
136 }
Matteo Martincigh88054f82019-05-17 12:15:30 +0100137
138 IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
139
Colm Donelan1aff3932020-02-05 17:48:59 +0000140 IBackendInternal::IWorkloadFactoryPtr
141 CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100142
143 IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
Colm Donelan1aff3932020-02-05 17:48:59 +0000144 IBackendInternal::IBackendProfilingContextPtr
145 CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
146 IBackendProfilingPtr& backendProfiling) override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100147
148 IBackendInternal::Optimizations GetOptimizations() const override;
149 IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
150
151 OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
152};
153
Colm Donelan1aff3932020-02-05 17:48:59 +0000154class MockLayerSupport : public LayerSupportBase
155{
David Monahan7f2c35a2019-05-24 10:46:28 +0100156public:
Derek Lamberti901ea112019-12-10 22:07:09 +0000157 bool IsInputSupported(const TensorInfo& /*input*/,
158 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100159 {
160 return true;
161 }
162
Derek Lamberti901ea112019-12-10 22:07:09 +0000163 bool IsOutputSupported(const TensorInfo& /*input*/,
Colm Donelan1aff3932020-02-05 17:48:59 +0000164 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100165 {
166 return true;
167 }
168
Derek Lamberti901ea112019-12-10 22:07:09 +0000169 bool IsAdditionSupported(const TensorInfo& /*input0*/,
170 const TensorInfo& /*input1*/,
171 const TensorInfo& /*output*/,
172 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100173 {
174 return true;
175 }
176
Derek Lamberti901ea112019-12-10 22:07:09 +0000177 bool IsConvolution2dSupported(const TensorInfo& /*input*/,
178 const TensorInfo& /*output*/,
179 const Convolution2dDescriptor& /*descriptor*/,
180 const TensorInfo& /*weights*/,
181 const Optional<TensorInfo>& /*biases*/,
182 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100183 {
184 return true;
185 }
186};
187
Colm Donelan1aff3932020-02-05 17:48:59 +0000188} // namespace armnn