blob: 3227ce52fca9644c50e1af606bccada6f5b1e9ff [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
91 void EnableProfiling(bool)
92 {}
93
94private:
Colm Donelanfcb802b2020-02-13 20:47:08 +000095 IBackendInternal::IBackendProfilingPtr m_BackendProfiling;
Finn Williams032bc742020-02-12 11:02:34 +000096 uint32_t m_CapturePeriod;
97 std::vector<uint16_t> m_ActiveCounters;
David Monahanc1536d62020-02-12 15:52:35 +000098};
Colm Donelan1aff3932020-02-05 17:48:59 +000099
Colm Donelanfcb802b2020-02-13 20:47:08 +0000100class MockBackendProfilingService
101{
102public:
103 // Getter for the singleton instance
104 static MockBackendProfilingService& Instance()
105 {
106 static MockBackendProfilingService instance;
107 return instance;
108 }
109
110 MockBackendProfilingContext* GetContext()
111 {
112 return m_sharedContext.get();
113 }
114
115 void SetProfilingContextPtr(std::shared_ptr<MockBackendProfilingContext> shared)
116 {
117 m_sharedContext = shared;
118 }
119
120private:
121 std::shared_ptr<MockBackendProfilingContext> m_sharedContext;
122};
123
Matteo Martincigh88054f82019-05-17 12:15:30 +0100124class MockBackend : public IBackendInternal
125{
126public:
127 MockBackend() = default;
128 ~MockBackend() = default;
129
130 static const BackendId& GetIdStatic();
Colm Donelan1aff3932020-02-05 17:48:59 +0000131 const BackendId& GetId() const override
132 {
133 return GetIdStatic();
134 }
Matteo Martincigh88054f82019-05-17 12:15:30 +0100135
136 IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override;
137
Colm Donelan1aff3932020-02-05 17:48:59 +0000138 IBackendInternal::IWorkloadFactoryPtr
139 CreateWorkloadFactory(const IBackendInternal::IMemoryManagerSharedPtr& memoryManager = nullptr) const override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100140
141 IBackendInternal::IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const override;
Colm Donelan1aff3932020-02-05 17:48:59 +0000142 IBackendInternal::IBackendProfilingContextPtr
143 CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
144 IBackendProfilingPtr& backendProfiling) override;
Matteo Martincigh88054f82019-05-17 12:15:30 +0100145
146 IBackendInternal::Optimizations GetOptimizations() const override;
147 IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override;
148
149 OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const override;
150};
151
Colm Donelan1aff3932020-02-05 17:48:59 +0000152class MockLayerSupport : public LayerSupportBase
153{
David Monahan7f2c35a2019-05-24 10:46:28 +0100154public:
Derek Lamberti901ea112019-12-10 22:07:09 +0000155 bool IsInputSupported(const TensorInfo& /*input*/,
156 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100157 {
158 return true;
159 }
160
Derek Lamberti901ea112019-12-10 22:07:09 +0000161 bool IsOutputSupported(const TensorInfo& /*input*/,
Colm Donelan1aff3932020-02-05 17:48:59 +0000162 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100163 {
164 return true;
165 }
166
Derek Lamberti901ea112019-12-10 22:07:09 +0000167 bool IsAdditionSupported(const TensorInfo& /*input0*/,
168 const TensorInfo& /*input1*/,
169 const TensorInfo& /*output*/,
170 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100171 {
172 return true;
173 }
174
Derek Lamberti901ea112019-12-10 22:07:09 +0000175 bool IsConvolution2dSupported(const TensorInfo& /*input*/,
176 const TensorInfo& /*output*/,
177 const Convolution2dDescriptor& /*descriptor*/,
178 const TensorInfo& /*weights*/,
179 const Optional<TensorInfo>& /*biases*/,
180 Optional<std::string&> /*reasonIfUnsupported = EmptyOptional()*/) const override
David Monahan7f2c35a2019-05-24 10:46:28 +0100181 {
182 return true;
183 }
184};
185
Colm Donelan1aff3932020-02-05 17:48:59 +0000186} // namespace armnn