blob: df133dfed2c3d5e1bdc06525db5f84c0b1fecc72 [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)
Keith Davis33ed2212020-03-30 10:43:41 +010035 , m_IsTimelineEnabled(true)
David Monahanc1536d62020-02-12 15:52:35 +000036 {}
37
38 ~MockBackendProfilingContext() = default;
39
40 IBackendInternal::IBackendProfilingPtr& GetBackendProfiling()
41 {
42 return m_BackendProfiling;
43 }
44
45 uint16_t RegisterCounters(uint16_t currentMaxGlobalCounterId)
46 {
47 std::unique_ptr<profiling::IRegisterBackendCounters> counterRegistrar =
Finn Williamsfe5a24b2020-04-09 16:05:28 +010048 m_BackendProfiling->GetCounterRegistrationInterface(static_cast<uint16_t>(currentMaxGlobalCounterId));
David Monahanc1536d62020-02-12 15:52:35 +000049
Colm Donelanfcb802b2020-02-13 20:47:08 +000050 std::string categoryName("MockCounters");
51 counterRegistrar->RegisterCategory(categoryName);
David Monahanc1536d62020-02-12 15:52:35 +000052
Finn Williamsfe5a24b2020-04-09 16:05:28 +010053 counterRegistrar->RegisterCounter(0, categoryName, 0, 0, 1.f, "Mock Counter One", "Some notional counter");
54
55 counterRegistrar->RegisterCounter(1, categoryName, 0, 0, 1.f, "Mock Counter Two",
Colm Donelanfcb802b2020-02-13 20:47:08 +000056 "Another notional counter");
David Monahanc1536d62020-02-12 15:52:35 +000057
Colm Donelanfcb802b2020-02-13 20:47:08 +000058 std::string units("microseconds");
Finn Williamsfe5a24b2020-04-09 16:05:28 +010059 uint16_t nextMaxGlobalCounterId =
60 counterRegistrar->RegisterCounter(2, categoryName, 0, 0, 1.f, "Mock MultiCore Counter",
Colm Donelanfcb802b2020-02-13 20:47:08 +000061 "A dummy four core counter", units, 4);
62 return nextMaxGlobalCounterId;
David Monahanc1536d62020-02-12 15:52:35 +000063 }
64
Finn Williams032bc742020-02-12 11:02:34 +000065 Optional<std::string> ActivateCounters(uint32_t capturePeriod, const std::vector<uint16_t>& counterIds)
66 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000067 if (capturePeriod == 0 || counterIds.size() == 0)
Finn Williams032bc742020-02-12 11:02:34 +000068 {
69 m_ActiveCounters.clear();
70 }
71 else if (capturePeriod == 15939u)
72 {
73 return armnn::Optional<std::string>("ActivateCounters example test error");
74 }
Colm Donelanfcb802b2020-02-13 20:47:08 +000075 m_CapturePeriod = capturePeriod;
Finn Williams032bc742020-02-12 11:02:34 +000076 m_ActiveCounters = counterIds;
77 return armnn::Optional<std::string>();
78 }
David Monahanc1536d62020-02-12 15:52:35 +000079
80 std::vector<profiling::Timestamp> ReportCounterValues()
81 {
Finn Williams032bc742020-02-12 11:02:34 +000082 std::vector<profiling::CounterValue> counterValues;
83
Colm Donelanfcb802b2020-02-13 20:47:08 +000084 for (auto counterId : m_ActiveCounters)
Finn Williams032bc742020-02-12 11:02:34 +000085 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000086 counterValues.emplace_back(profiling::CounterValue{ counterId, counterId + 1u });
Finn Williams032bc742020-02-12 11:02:34 +000087 }
88
89 uint64_t timestamp = m_CapturePeriod;
Colm Donelanfcb802b2020-02-13 20:47:08 +000090 return { profiling::Timestamp{ timestamp, counterValues } };
David Monahanc1536d62020-02-12 15:52:35 +000091 }
92
David Monahanb015e5d2020-02-26 10:24:03 +000093 bool EnableProfiling(bool)
94 {
Finn Williamsfe5a24b2020-04-09 16:05:28 +010095 auto sendTimelinePacket = m_BackendProfiling->GetSendTimelinePacket();
96 sendTimelinePacket->SendTimelineEntityBinaryPacket(4256);
97 sendTimelinePacket->Commit();
David Monahanb015e5d2020-02-26 10:24:03 +000098 return true;
99 }
David Monahanc1536d62020-02-12 15:52:35 +0000100
Keith Davis33ed2212020-03-30 10:43:41 +0100101 bool EnableTimelineReporting(bool isEnabled)
102 {
103 m_IsTimelineEnabled = isEnabled;
104 return isEnabled;
105 }
106
107 bool TimelineReportingEnabled()
108 {
109 return m_IsTimelineEnabled;
110 }
111
David Monahanc1536d62020-02-12 15:52:35 +0000112private:
Colm Donelanfcb802b2020-02-13 20:47:08 +0000113 IBackendInternal::IBackendProfilingPtr m_BackendProfiling;
Finn Williams032bc742020-02-12 11:02:34 +0000114 uint32_t m_CapturePeriod;
115 std::vector<uint16_t> m_ActiveCounters;
Matthew Bentham6ae43c42022-01-10 13:34:12 +0000116 std::atomic<bool> m_IsTimelineEnabled;
David Monahanc1536d62020-02-12 15:52:35 +0000117};
Colm Donelan1aff3932020-02-05 17:48:59 +0000118
Colm Donelanfcb802b2020-02-13 20:47:08 +0000119class MockBackendProfilingService
120{
121public:
122 // Getter for the singleton instance
123 static MockBackendProfilingService& Instance()
124 {
125 static MockBackendProfilingService instance;
126 return instance;
127 }
128
129 MockBackendProfilingContext* GetContext()
130 {
131 return m_sharedContext.get();
132 }
133
134 void SetProfilingContextPtr(std::shared_ptr<MockBackendProfilingContext> shared)
135 {
136 m_sharedContext = shared;
137 }
138
139private:
140 std::shared_ptr<MockBackendProfilingContext> m_sharedContext;
141};
142
Matteo Martincigh88054f82019-05-17 12:15:30 +0100143class MockBackend : public IBackendInternal
144{
145public:
146 MockBackend() = default;
147 ~MockBackend() = default;
148
149 static const BackendId& GetIdStatic();
Colm Donelan1aff3932020-02-05 17:48:59 +0000150 const BackendId& GetId() const override
151 {
152 return GetIdStatic();
153 }
Matteo Martincigh88054f82019-05-17 12:15:30 +0100154
155 IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
156
Colm Donelan1aff3932020-02-05 17:48:59 +0000157 IBackendInternal::IWorkloadFactoryPtr
158 CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100159
160 IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
Colm Donelan1aff3932020-02-05 17:48:59 +0000161 IBackendInternal::IBackendProfilingContextPtr
162 CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
163 IBackendProfilingPtr& backendProfiling) override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100164
Matteo Martincigh88054f82019-05-17 12:15:30 +0100165 IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
166
167 OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
Francis Murtaghe8d7ccb2021-10-14 17:30:24 +0100168
169 std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100170};
171
Colm Donelan1aff3932020-02-05 17:48:59 +0000172class MockLayerSupport : public LayerSupportBase
173{
David Monahan7f2c35a2019-05-24 10:46:28 +0100174public:
Cathal Corbett34b429c2021-12-24 12:24:40 +0000175 bool IsLayerSupported(const LayerType& type,
176 const std::vector<TensorInfo>& infos,
177 const BaseDescriptor& descriptor,
178 const Optional<LstmInputParamsInfo>& /*lstmParamsInfo*/,
179 const Optional<QuantizedLstmInputParamsInfo>& /*quantizedLstmParamsInfo*/,
180 Optional<std::string&> reasonIfUnsupported) const override
181 {
182 switch(type)
183 {
184 case LayerType::Input:
185 return IsInputSupported(infos[0], reasonIfUnsupported);
186 case LayerType::Output:
187 return IsOutputSupported(infos[0], reasonIfUnsupported);
188 case LayerType::Addition:
189 return IsAdditionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported);
190 case LayerType::Convolution2d:
191 {
192 if (infos.size() != 4)
193 {
194 throw InvalidArgumentException("Invalid number of TransposeConvolution2d "
195 "TensorInfos. TensorInfos should be of format: "
196 "{input, output, weights, biases}.");
197 }
198
199 auto desc = *(PolymorphicDowncast<const Convolution2dDescriptor*>(&descriptor));
200 if (infos[3] == TensorInfo())
201 {
202 return IsConvolution2dSupported(infos[0],
203 infos[1],
204 desc,
205 infos[2],
206 EmptyOptional(),
207 reasonIfUnsupported);
208 }
209 else
210 {
211 return IsConvolution2dSupported(infos[0],
212 infos[1],
213 desc,
214 infos[2],
215 infos[3],
216 reasonIfUnsupported);
217 }
218 }
219 default:
220 return false;
221 }
222 }
223
Derek Lamberti901ea112019-12-10 22:07:09 +0000224 bool IsInputSupported(const TensorInfo& /*input*/,
225 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100226 {
227 return true;
228 }
229
Derek Lamberti901ea112019-12-10 22:07:09 +0000230 bool IsOutputSupported(const TensorInfo& /*input*/,
Colm Donelan1aff3932020-02-05 17:48:59 +0000231 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100232 {
233 return true;
234 }
235
Derek Lamberti901ea112019-12-10 22:07:09 +0000236 bool IsAdditionSupported(const TensorInfo& /*input0*/,
237 const TensorInfo& /*input1*/,
238 const TensorInfo& /*output*/,
239 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100240 {
241 return true;
242 }
243
Derek Lamberti901ea112019-12-10 22:07:09 +0000244 bool IsConvolution2dSupported(const TensorInfo& /*input*/,
245 const TensorInfo& /*output*/,
246 const Convolution2dDescriptor& /*descriptor*/,
247 const TensorInfo& /*weights*/,
248 const Optional<TensorInfo>& /*biases*/,
249 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100250 {
251 return true;
252 }
253};
254
Colm Donelan1aff3932020-02-05 17:48:59 +0000255} // namespace armnn