blob: e1570ff9202c211984d78b35b7b5785bab09adb8 [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 =
48 m_BackendProfiling->GetCounterRegistrationInterface(currentMaxGlobalCounterId);
49
Colm Donelanfcb802b2020-02-13 20:47:08 +000050 std::string categoryName("MockCounters");
51 counterRegistrar->RegisterCategory(categoryName);
52 uint16_t nextMaxGlobalCounterId =
53 counterRegistrar->RegisterCounter(0, categoryName, 0, 0, 1.f, "Mock Counter One", "Some notional counter");
David Monahanc1536d62020-02-12 15:52:35 +000054
Colm Donelanfcb802b2020-02-13 20:47:08 +000055 nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(1, categoryName, 0, 0, 1.f, "Mock Counter Two",
56 "Another notional counter");
David Monahanc1536d62020-02-12 15:52:35 +000057
Colm Donelanfcb802b2020-02-13 20:47:08 +000058 std::string units("microseconds");
59 nextMaxGlobalCounterId = counterRegistrar->RegisterCounter(2, categoryName, 0, 0, 1.f, "Mock MultiCore Counter",
60 "A dummy four core counter", units, 4);
61 return nextMaxGlobalCounterId;
David Monahanc1536d62020-02-12 15:52:35 +000062 }
63
Finn Williams032bc742020-02-12 11:02:34 +000064 Optional<std::string> ActivateCounters(uint32_t capturePeriod, const std::vector<uint16_t>& counterIds)
65 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000066 if (capturePeriod == 0 || counterIds.size() == 0)
Finn Williams032bc742020-02-12 11:02:34 +000067 {
68 m_ActiveCounters.clear();
69 }
70 else if (capturePeriod == 15939u)
71 {
72 return armnn::Optional<std::string>("ActivateCounters example test error");
73 }
Colm Donelanfcb802b2020-02-13 20:47:08 +000074 m_CapturePeriod = capturePeriod;
Finn Williams032bc742020-02-12 11:02:34 +000075 m_ActiveCounters = counterIds;
76 return armnn::Optional<std::string>();
77 }
David Monahanc1536d62020-02-12 15:52:35 +000078
79 std::vector<profiling::Timestamp> ReportCounterValues()
80 {
Finn Williams032bc742020-02-12 11:02:34 +000081 std::vector<profiling::CounterValue> counterValues;
82
Colm Donelanfcb802b2020-02-13 20:47:08 +000083 for (auto counterId : m_ActiveCounters)
Finn Williams032bc742020-02-12 11:02:34 +000084 {
Colm Donelanfcb802b2020-02-13 20:47:08 +000085 counterValues.emplace_back(profiling::CounterValue{ counterId, counterId + 1u });
Finn Williams032bc742020-02-12 11:02:34 +000086 }
87
88 uint64_t timestamp = m_CapturePeriod;
Colm Donelanfcb802b2020-02-13 20:47:08 +000089 return { profiling::Timestamp{ timestamp, counterValues } };
David Monahanc1536d62020-02-12 15:52:35 +000090 }
91
David Monahanb015e5d2020-02-26 10:24:03 +000092 bool EnableProfiling(bool)
93 {
94 return true;
95 }
David Monahanc1536d62020-02-12 15:52:35 +000096
Keith Davis33ed2212020-03-30 10:43:41 +010097 bool EnableTimelineReporting(bool isEnabled)
98 {
99 m_IsTimelineEnabled = isEnabled;
100 return isEnabled;
101 }
102
103 bool TimelineReportingEnabled()
104 {
105 return m_IsTimelineEnabled;
106 }
107
David Monahanc1536d62020-02-12 15:52:35 +0000108private:
Colm Donelanfcb802b2020-02-13 20:47:08 +0000109 IBackendInternal::IBackendProfilingPtr m_BackendProfiling;
Finn Williams032bc742020-02-12 11:02:34 +0000110 uint32_t m_CapturePeriod;
111 std::vector<uint16_t> m_ActiveCounters;
Keith Davis33ed2212020-03-30 10:43:41 +0100112 bool m_IsTimelineEnabled;
David Monahanc1536d62020-02-12 15:52:35 +0000113};
Colm Donelan1aff3932020-02-05 17:48:59 +0000114
Colm Donelanfcb802b2020-02-13 20:47:08 +0000115class MockBackendProfilingService
116{
117public:
118 // Getter for the singleton instance
119 static MockBackendProfilingService& Instance()
120 {
121 static MockBackendProfilingService instance;
122 return instance;
123 }
124
125 MockBackendProfilingContext* GetContext()
126 {
127 return m_sharedContext.get();
128 }
129
130 void SetProfilingContextPtr(std::shared_ptr<MockBackendProfilingContext> shared)
131 {
132 m_sharedContext = shared;
133 }
134
135private:
136 std::shared_ptr<MockBackendProfilingContext> m_sharedContext;
137};
138
Matteo Martincigh88054f82019-05-17 12:15:30 +0100139class MockBackend : public IBackendInternal
140{
141public:
142 MockBackend() = default;
143 ~MockBackend() = default;
144
145 static const BackendId& GetIdStatic();
Colm Donelan1aff3932020-02-05 17:48:59 +0000146 const BackendId& GetId() const override
147 {
148 return GetIdStatic();
149 }
Matteo Martincigh88054f82019-05-17 12:15:30 +0100150
151 IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
152
Colm Donelan1aff3932020-02-05 17:48:59 +0000153 IBackendInternal::IWorkloadFactoryPtr
154 CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100155
156 IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
Colm Donelan1aff3932020-02-05 17:48:59 +0000157 IBackendInternal::IBackendProfilingContextPtr
158 CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
159 IBackendProfilingPtr& backendProfiling) override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100160
161 IBackendInternal::Optimizations GetOptimizations() const override;
162 IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
163
164 OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
165};
166
Colm Donelan1aff3932020-02-05 17:48:59 +0000167class MockLayerSupport : public LayerSupportBase
168{
David Monahan7f2c35a2019-05-24 10:46:28 +0100169public:
Derek Lamberti901ea112019-12-10 22:07:09 +0000170 bool IsInputSupported(const TensorInfo& /*input*/,
171 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100172 {
173 return true;
174 }
175
Derek Lamberti901ea112019-12-10 22:07:09 +0000176 bool IsOutputSupported(const TensorInfo& /*input*/,
Colm Donelan1aff3932020-02-05 17:48:59 +0000177 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100178 {
179 return true;
180 }
181
Derek Lamberti901ea112019-12-10 22:07:09 +0000182 bool IsAdditionSupported(const TensorInfo& /*input0*/,
183 const TensorInfo& /*input1*/,
184 const TensorInfo& /*output*/,
185 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100186 {
187 return true;
188 }
189
Derek Lamberti901ea112019-12-10 22:07:09 +0000190 bool IsConvolution2dSupported(const TensorInfo& /*input*/,
191 const TensorInfo& /*output*/,
192 const Convolution2dDescriptor& /*descriptor*/,
193 const TensorInfo& /*weights*/,
194 const Optional<TensorInfo>& /*biases*/,
195 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100196 {
197 return true;
198 }
199};
200
Colm Donelan1aff3932020-02-05 17:48:59 +0000201} // namespace armnn