xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/BackendProfilingTests.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #include "ArmNNProfilingServiceInitialiser.hpp"
7*89c4ff92SAndroid Build Coastguard Worker #include "MockBackendId.hpp"
8*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingOptionsConverter.hpp"
9*89c4ff92SAndroid Build Coastguard Worker 
10*89c4ff92SAndroid Build Coastguard Worker #include <TestUtils.hpp>
11*89c4ff92SAndroid Build Coastguard Worker 
12*89c4ff92SAndroid Build Coastguard Worker #include <armnn/BackendId.hpp>
13*89c4ff92SAndroid Build Coastguard Worker #include <armnn/Logging.hpp>
14*89c4ff92SAndroid Build Coastguard Worker 
15*89c4ff92SAndroid Build Coastguard Worker #include <armnn/profiling/ArmNNProfiling.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/IgnoreUnused.hpp>
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker #include <armnnTestUtils/MockBackend.hpp>
20*89c4ff92SAndroid Build Coastguard Worker 
21*89c4ff92SAndroid Build Coastguard Worker #include <client/include/CounterIdMap.hpp>
22*89c4ff92SAndroid Build Coastguard Worker #include <client/include/Holder.hpp>
23*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ISendTimelinePacket.hpp>
24*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ProfilingOptions.hpp>
25*89c4ff92SAndroid Build Coastguard Worker 
26*89c4ff92SAndroid Build Coastguard Worker #include <client/src/PeriodicCounterCapture.hpp>
27*89c4ff92SAndroid Build Coastguard Worker #include <client/src/PeriodicCounterSelectionCommandHandler.hpp>
28*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingStateMachine.hpp>
29*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp>
30*89c4ff92SAndroid Build Coastguard Worker #include <client/src/RequestCounterDirectoryCommandHandler.hpp>
31*89c4ff92SAndroid Build Coastguard Worker 
32*89c4ff92SAndroid Build Coastguard Worker #include <client/src/backends/BackendProfiling.hpp>
33*89c4ff92SAndroid Build Coastguard Worker 
34*89c4ff92SAndroid Build Coastguard Worker #include <common/include/CounterDirectory.hpp>
35*89c4ff92SAndroid Build Coastguard Worker #include <common/include/PacketVersionResolver.hpp>
36*89c4ff92SAndroid Build Coastguard Worker 
37*89c4ff92SAndroid Build Coastguard Worker #include <doctest/doctest.h>
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker #include <vector>
40*89c4ff92SAndroid Build Coastguard Worker #include <cstdint>
41*89c4ff92SAndroid Build Coastguard Worker #include <limits>
42*89c4ff92SAndroid Build Coastguard Worker 
43*89c4ff92SAndroid Build Coastguard Worker namespace arm
44*89c4ff92SAndroid Build Coastguard Worker {
45*89c4ff92SAndroid Build Coastguard Worker 
46*89c4ff92SAndroid Build Coastguard Worker namespace pipe
47*89c4ff92SAndroid Build Coastguard Worker {
48*89c4ff92SAndroid Build Coastguard Worker 
49*89c4ff92SAndroid Build Coastguard Worker struct LogLevelSwapper
50*89c4ff92SAndroid Build Coastguard Worker {
51*89c4ff92SAndroid Build Coastguard Worker public:
LogLevelSwapperarm::pipe::LogLevelSwapper52*89c4ff92SAndroid Build Coastguard Worker     LogLevelSwapper(arm::pipe::LogSeverity severity)
53*89c4ff92SAndroid Build Coastguard Worker     {
54*89c4ff92SAndroid Build Coastguard Worker         // Set the new log level
55*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ConfigureLogging(true, true, severity);
56*89c4ff92SAndroid Build Coastguard Worker     }
~LogLevelSwapperarm::pipe::LogLevelSwapper57*89c4ff92SAndroid Build Coastguard Worker     ~LogLevelSwapper()
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker         // The default log level for unit tests is "Fatal"
60*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ConfigureLogging(true, true, arm::pipe::LogSeverity::Fatal);
61*89c4ff92SAndroid Build Coastguard Worker     }
62*89c4ff92SAndroid Build Coastguard Worker };
63*89c4ff92SAndroid Build Coastguard Worker 
64*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
65*89c4ff92SAndroid Build Coastguard Worker 
66*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
67*89c4ff92SAndroid Build Coastguard Worker 
68*89c4ff92SAndroid Build Coastguard Worker using namespace arm::pipe;
69*89c4ff92SAndroid Build Coastguard Worker 
70*89c4ff92SAndroid Build Coastguard Worker class ReadCounterVals : public IReadCounterValues
71*89c4ff92SAndroid Build Coastguard Worker {
IsCounterRegistered(uint16_t counterUid) const72*89c4ff92SAndroid Build Coastguard Worker     virtual bool IsCounterRegistered(uint16_t counterUid) const override
73*89c4ff92SAndroid Build Coastguard Worker     {
74*89c4ff92SAndroid Build Coastguard Worker         return (counterUid > 4 && counterUid < 11);
75*89c4ff92SAndroid Build Coastguard Worker     }
IsCounterRegistered(const std::string & counterName) const76*89c4ff92SAndroid Build Coastguard Worker     virtual bool IsCounterRegistered(const std::string& counterName) const override
77*89c4ff92SAndroid Build Coastguard Worker     {
78*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(counterName);
79*89c4ff92SAndroid Build Coastguard Worker         return false;
80*89c4ff92SAndroid Build Coastguard Worker     }
GetCounterCount() const81*89c4ff92SAndroid Build Coastguard Worker     virtual uint16_t GetCounterCount() const override
82*89c4ff92SAndroid Build Coastguard Worker     {
83*89c4ff92SAndroid Build Coastguard Worker         return 1;
84*89c4ff92SAndroid Build Coastguard Worker     }
GetAbsoluteCounterValue(uint16_t counterUid) const85*89c4ff92SAndroid Build Coastguard Worker     virtual uint32_t GetAbsoluteCounterValue(uint16_t counterUid) const override
86*89c4ff92SAndroid Build Coastguard Worker     {
87*89c4ff92SAndroid Build Coastguard Worker         return counterUid;
88*89c4ff92SAndroid Build Coastguard Worker     }
GetDeltaCounterValue(uint16_t counterUid)89*89c4ff92SAndroid Build Coastguard Worker     virtual uint32_t GetDeltaCounterValue(uint16_t counterUid) override
90*89c4ff92SAndroid Build Coastguard Worker     {
91*89c4ff92SAndroid Build Coastguard Worker         return counterUid;
92*89c4ff92SAndroid Build Coastguard Worker     }
93*89c4ff92SAndroid Build Coastguard Worker };
94*89c4ff92SAndroid Build Coastguard Worker 
95*89c4ff92SAndroid Build Coastguard Worker class MockBackendSendCounterPacket : public ISendCounterPacket
96*89c4ff92SAndroid Build Coastguard Worker {
97*89c4ff92SAndroid Build Coastguard Worker public:
98*89c4ff92SAndroid Build Coastguard Worker     using IndexValuePairsVector = std::vector<CounterValue>;
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     /// Create and write a StreamMetaDataPacket in the buffer
SendStreamMetaDataPacket()101*89c4ff92SAndroid Build Coastguard Worker     virtual void SendStreamMetaDataPacket() {}
102*89c4ff92SAndroid Build Coastguard Worker 
103*89c4ff92SAndroid Build Coastguard Worker     /// Create and write a CounterDirectoryPacket from the parameters to the buffer.
SendCounterDirectoryPacket(const ICounterDirectory & counterDirectory)104*89c4ff92SAndroid Build Coastguard Worker     virtual void SendCounterDirectoryPacket(const ICounterDirectory& counterDirectory)
105*89c4ff92SAndroid Build Coastguard Worker     {
106*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(counterDirectory);
107*89c4ff92SAndroid Build Coastguard Worker     }
108*89c4ff92SAndroid Build Coastguard Worker 
109*89c4ff92SAndroid Build Coastguard Worker     /// Create and write a PeriodicCounterCapturePacket from the parameters to the buffer.
SendPeriodicCounterCapturePacket(uint64_t timestamp,const IndexValuePairsVector & values)110*89c4ff92SAndroid Build Coastguard Worker     virtual void SendPeriodicCounterCapturePacket(uint64_t timestamp, const IndexValuePairsVector& values)
111*89c4ff92SAndroid Build Coastguard Worker     {
112*89c4ff92SAndroid Build Coastguard Worker         m_timestamps.emplace_back(Timestamp{timestamp, values});
113*89c4ff92SAndroid Build Coastguard Worker     }
114*89c4ff92SAndroid Build Coastguard Worker 
115*89c4ff92SAndroid Build Coastguard Worker     /// Create and write a PeriodicCounterSelectionPacket from the parameters to the buffer.
SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,const std::vector<uint16_t> & selectedCounterIds)116*89c4ff92SAndroid Build Coastguard Worker     virtual void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,
117*89c4ff92SAndroid Build Coastguard Worker                                                     const std::vector<uint16_t>& selectedCounterIds)
118*89c4ff92SAndroid Build Coastguard Worker     {
119*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(capturePeriod);
120*89c4ff92SAndroid Build Coastguard Worker         armnn::IgnoreUnused(selectedCounterIds);
121*89c4ff92SAndroid Build Coastguard Worker     }
122*89c4ff92SAndroid Build Coastguard Worker 
GetTimestamps()123*89c4ff92SAndroid Build Coastguard Worker     std::vector<Timestamp> GetTimestamps()
124*89c4ff92SAndroid Build Coastguard Worker     {
125*89c4ff92SAndroid Build Coastguard Worker         return  m_timestamps;
126*89c4ff92SAndroid Build Coastguard Worker     }
127*89c4ff92SAndroid Build Coastguard Worker 
ClearTimestamps()128*89c4ff92SAndroid Build Coastguard Worker     void ClearTimestamps()
129*89c4ff92SAndroid Build Coastguard Worker     {
130*89c4ff92SAndroid Build Coastguard Worker         m_timestamps.clear();
131*89c4ff92SAndroid Build Coastguard Worker     }
132*89c4ff92SAndroid Build Coastguard Worker 
133*89c4ff92SAndroid Build Coastguard Worker private:
134*89c4ff92SAndroid Build Coastguard Worker     std::vector<Timestamp> m_timestamps;
135*89c4ff92SAndroid Build Coastguard Worker };
136*89c4ff92SAndroid Build Coastguard Worker 
PacketWriter(uint32_t period,std::vector<uint16_t> countervalues)137*89c4ff92SAndroid Build Coastguard Worker arm::pipe::Packet PacketWriter(uint32_t period, std::vector<uint16_t> countervalues)
138*89c4ff92SAndroid Build Coastguard Worker {
139*89c4ff92SAndroid Build Coastguard Worker     const uint32_t packetId = 0x40000;
140*89c4ff92SAndroid Build Coastguard Worker     uint32_t offset = 0;
141*89c4ff92SAndroid Build Coastguard Worker     uint32_t dataLength = static_cast<uint32_t>(4 + countervalues.size() * 2);
142*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<unsigned char[]> uniqueData = std::make_unique<unsigned char[]>(dataLength);
143*89c4ff92SAndroid Build Coastguard Worker     unsigned char* data1                        = reinterpret_cast<unsigned char*>(uniqueData.get());
144*89c4ff92SAndroid Build Coastguard Worker 
145*89c4ff92SAndroid Build Coastguard Worker     WriteUint32(data1, offset, period);
146*89c4ff92SAndroid Build Coastguard Worker     offset += 4;
147*89c4ff92SAndroid Build Coastguard Worker     for (auto countervalue : countervalues)
148*89c4ff92SAndroid Build Coastguard Worker     {
149*89c4ff92SAndroid Build Coastguard Worker         WriteUint16(data1, offset, countervalue);
150*89c4ff92SAndroid Build Coastguard Worker         offset += 2;
151*89c4ff92SAndroid Build Coastguard Worker     }
152*89c4ff92SAndroid Build Coastguard Worker 
153*89c4ff92SAndroid Build Coastguard Worker     return {packetId, dataLength, uniqueData};
154*89c4ff92SAndroid Build Coastguard Worker }
155*89c4ff92SAndroid Build Coastguard Worker 
156*89c4ff92SAndroid Build Coastguard Worker TEST_SUITE("BackendProfilingTestSuite")
157*89c4ff92SAndroid Build Coastguard Worker {
158*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BackendProfilingCounterRegisterMockBackendTest")
159*89c4ff92SAndroid Build Coastguard Worker {
160*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
161*89c4ff92SAndroid Build Coastguard Worker 
162*89c4ff92SAndroid Build Coastguard Worker     // Reset the profiling service to the uninitialized state
163*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions options;
164*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = true;
165*89c4ff92SAndroid Build Coastguard Worker 
166*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendInitialiser initialiser;
167*89c4ff92SAndroid Build Coastguard Worker     // Create a runtime
168*89c4ff92SAndroid Build Coastguard Worker     armnn::RuntimeImpl runtime(options);
169*89c4ff92SAndroid Build Coastguard Worker 
170*89c4ff92SAndroid Build Coastguard Worker     unsigned int shiftedId = 0;
171*89c4ff92SAndroid Build Coastguard Worker 
172*89c4ff92SAndroid Build Coastguard Worker     // Check if the MockBackends 3 dummy counters {0, 1, 2-5 (four cores)} are registered
173*89c4ff92SAndroid Build Coastguard Worker     armnn::BackendId mockId = armnn::MockBackendId();
174*89c4ff92SAndroid Build Coastguard Worker     const ICounterMappings& counterMap = GetProfilingService(&runtime).GetCounterMappings();
175*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(0, mockId) == 5 + shiftedId);
176*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(1, mockId) == 6 + shiftedId);
177*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(2, mockId) == 7 + shiftedId);
178*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(3, mockId) == 8 + shiftedId);
179*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(4, mockId) == 9 + shiftedId);
180*89c4ff92SAndroid Build Coastguard Worker     CHECK(counterMap.GetGlobalId(5, mockId) == 10 + shiftedId);
181*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = false;
182*89c4ff92SAndroid Build Coastguard Worker     GetProfilingService(&runtime).ResetExternalProfilingOptions(
183*89c4ff92SAndroid Build Coastguard Worker         ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
184*89c4ff92SAndroid Build Coastguard Worker }
185*89c4ff92SAndroid Build Coastguard Worker 
186*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("TestBackendCounters")
187*89c4ff92SAndroid Build Coastguard Worker {
188*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
189*89c4ff92SAndroid Build Coastguard Worker 
190*89c4ff92SAndroid Build Coastguard Worker     Holder holder;
191*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::PacketVersionResolver packetVersionResolver;
192*89c4ff92SAndroid Build Coastguard Worker     ProfilingStateMachine stateMachine;
193*89c4ff92SAndroid Build Coastguard Worker     ReadCounterVals readCounterVals;
194*89c4ff92SAndroid Build Coastguard Worker     CounterIdMap counterIdMap;
195*89c4ff92SAndroid Build Coastguard Worker     MockBackendSendCounterPacket sendCounterPacket;
196*89c4ff92SAndroid Build Coastguard Worker 
197*89c4ff92SAndroid Build Coastguard Worker     const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
198*89c4ff92SAndroid Build Coastguard Worker     const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
199*89c4ff92SAndroid Build Coastguard Worker 
200*89c4ff92SAndroid Build Coastguard Worker     ProfilingOptions options;
201*89c4ff92SAndroid Build Coastguard Worker     options.m_EnableProfiling = true;
202*89c4ff92SAndroid Build Coastguard Worker 
203*89c4ff92SAndroid Build Coastguard Worker     armnn::ArmNNProfilingServiceInitialiser initialiser;
204*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
205*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::MAX_ARMNN_COUNTER,
206*89c4ff92SAndroid Build Coastguard Worker         initialiser,
207*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_INFO,
208*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_VERSION,
209*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_HARDWARE_VERSION);
210*89c4ff92SAndroid Build Coastguard Worker 
211*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
212*89c4ff92SAndroid Build Coastguard Worker         std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
213*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IBackendProfiling> gpuBackendProfilingPtr =
214*89c4ff92SAndroid Build Coastguard Worker         std::make_unique<BackendProfiling>(options, *profilingService.get(), gpuAccId);
215*89c4ff92SAndroid Build Coastguard Worker 
216*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
217*89c4ff92SAndroid Build Coastguard Worker             std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
218*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<IBackendProfilingContext> gpuProfilingContextPtr =
219*89c4ff92SAndroid Build Coastguard Worker             std::make_shared<armnn::MockBackendProfilingContext>(gpuBackendProfilingPtr);
220*89c4ff92SAndroid Build Coastguard Worker 
221*89c4ff92SAndroid Build Coastguard Worker     std::unordered_map<std::string,
222*89c4ff92SAndroid Build Coastguard Worker             std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
223*89c4ff92SAndroid Build Coastguard Worker 
224*89c4ff92SAndroid Build Coastguard Worker     backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
225*89c4ff92SAndroid Build Coastguard Worker     backendProfilingContexts[gpuAccId] = gpuProfilingContextPtr;
226*89c4ff92SAndroid Build Coastguard Worker 
227*89c4ff92SAndroid Build Coastguard Worker     uint16_t globalId = 5;
228*89c4ff92SAndroid Build Coastguard Worker 
229*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 0, cpuAccId);
230*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 1, cpuAccId);
231*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 2, cpuAccId);
232*89c4ff92SAndroid Build Coastguard Worker 
233*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 0, gpuAccId);
234*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 1, gpuAccId);
235*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId++, 2, gpuAccId);
236*89c4ff92SAndroid Build Coastguard Worker 
237*89c4ff92SAndroid Build Coastguard Worker     backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
238*89c4ff92SAndroid Build Coastguard Worker     backendProfilingContexts[gpuAccId] = gpuProfilingContextPtr;
239*89c4ff92SAndroid Build Coastguard Worker 
240*89c4ff92SAndroid Build Coastguard Worker     PeriodicCounterCapture periodicCounterCapture(holder, sendCounterPacket, readCounterVals,
241*89c4ff92SAndroid Build Coastguard Worker                                                   counterIdMap, backendProfilingContexts);
242*89c4ff92SAndroid Build Coastguard Worker 
243*89c4ff92SAndroid Build Coastguard Worker     uint16_t maxArmnnCounterId = 4;
244*89c4ff92SAndroid Build Coastguard Worker 
245*89c4ff92SAndroid Build Coastguard Worker     PeriodicCounterSelectionCommandHandler periodicCounterSelectionCommandHandler(0,
246*89c4ff92SAndroid Build Coastguard Worker                                                   4,
247*89c4ff92SAndroid Build Coastguard Worker                                                   packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(),
248*89c4ff92SAndroid Build Coastguard Worker                                                   backendProfilingContexts,
249*89c4ff92SAndroid Build Coastguard Worker                                                   counterIdMap,
250*89c4ff92SAndroid Build Coastguard Worker                                                   holder,
251*89c4ff92SAndroid Build Coastguard Worker                                                   maxArmnnCounterId,
252*89c4ff92SAndroid Build Coastguard Worker                                                   periodicCounterCapture,
253*89c4ff92SAndroid Build Coastguard Worker                                                   readCounterVals,
254*89c4ff92SAndroid Build Coastguard Worker                                                   sendCounterPacket,
255*89c4ff92SAndroid Build Coastguard Worker                                                   stateMachine);
256*89c4ff92SAndroid Build Coastguard Worker 
257*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::NotConnected);
258*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::WaitingForAck);
259*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::Active);
260*89c4ff92SAndroid Build Coastguard Worker 
261*89c4ff92SAndroid Build Coastguard Worker     uint32_t period = 12345u;
262*89c4ff92SAndroid Build Coastguard Worker 
263*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint16_t> cpuCounters{5, 6, 7};
264*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint16_t> gpuCounters{8, 9, 10};
265*89c4ff92SAndroid Build Coastguard Worker 
266*89c4ff92SAndroid Build Coastguard Worker     // Request only gpu counters
267*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, gpuCounters));
268*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
269*89c4ff92SAndroid Build Coastguard Worker 
270*89c4ff92SAndroid Build Coastguard Worker     std::set<std::string> activeIds = holder.GetCaptureData().GetActiveBackends();
271*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 1);
272*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(gpuAccId) != activeIds.end()));
273*89c4ff92SAndroid Build Coastguard Worker 
274*89c4ff92SAndroid Build Coastguard Worker     std::vector<Timestamp> recievedTimestamp = sendCounterPacket.GetTimestamps();
275*89c4ff92SAndroid Build Coastguard Worker 
276*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].timestamp == period);
277*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 1);
278*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues.size() == gpuCounters.size());
279*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i=0; i< gpuCounters.size(); ++i)
280*89c4ff92SAndroid Build Coastguard Worker     {
281*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterId == gpuCounters[i]);
282*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
283*89c4ff92SAndroid Build Coastguard Worker     }
284*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
285*89c4ff92SAndroid Build Coastguard Worker 
286*89c4ff92SAndroid Build Coastguard Worker     // Request only cpu counters
287*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, cpuCounters));
288*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
289*89c4ff92SAndroid Build Coastguard Worker 
290*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
291*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 1);
292*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(cpuAccId) != activeIds.end()));
293*89c4ff92SAndroid Build Coastguard Worker 
294*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
295*89c4ff92SAndroid Build Coastguard Worker 
296*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].timestamp == period);
297*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 1);
298*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
299*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i=0; i< cpuCounters.size(); ++i)
300*89c4ff92SAndroid Build Coastguard Worker     {
301*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
302*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
303*89c4ff92SAndroid Build Coastguard Worker     }
304*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
305*89c4ff92SAndroid Build Coastguard Worker 
306*89c4ff92SAndroid Build Coastguard Worker     // Request combination of cpu & gpu counters with new period
307*89c4ff92SAndroid Build Coastguard Worker     period = 12222u;
308*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, {cpuCounters[0], gpuCounters[2],
309*89c4ff92SAndroid Build Coastguard Worker                                                                  gpuCounters[1], cpuCounters[1], gpuCounters[0]}));
310*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
311*89c4ff92SAndroid Build Coastguard Worker 
312*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
313*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 2);
314*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(cpuAccId) != activeIds.end()));
315*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(gpuAccId) != activeIds.end()));
316*89c4ff92SAndroid Build Coastguard Worker 
317*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
318*89c4ff92SAndroid Build Coastguard Worker //
319*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].timestamp == period);
320*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].timestamp == period);
321*89c4ff92SAndroid Build Coastguard Worker 
322*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 2);
323*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues.size() == 2);
324*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
325*89c4ff92SAndroid Build Coastguard Worker 
326*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[0].counterId == cpuCounters[0]);
327*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[0].counterValue == 1u);
328*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[1].counterId == cpuCounters[1]);
329*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[1].counterValue == 2u);
330*89c4ff92SAndroid Build Coastguard Worker 
331*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i=0; i< gpuCounters.size(); ++i)
332*89c4ff92SAndroid Build Coastguard Worker     {
333*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
334*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
335*89c4ff92SAndroid Build Coastguard Worker     }
336*89c4ff92SAndroid Build Coastguard Worker 
337*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
338*89c4ff92SAndroid Build Coastguard Worker 
339*89c4ff92SAndroid Build Coastguard Worker     // Request all counters
340*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint16_t> counterValues;
341*89c4ff92SAndroid Build Coastguard Worker     counterValues.insert(counterValues.begin(), cpuCounters.begin(), cpuCounters.end());
342*89c4ff92SAndroid Build Coastguard Worker     counterValues.insert(counterValues.begin(), gpuCounters.begin(), gpuCounters.end());
343*89c4ff92SAndroid Build Coastguard Worker 
344*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, counterValues));
345*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
346*89c4ff92SAndroid Build Coastguard Worker 
347*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
348*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 2);
349*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(cpuAccId) != activeIds.end()));
350*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(gpuAccId) != activeIds.end()));
351*89c4ff92SAndroid Build Coastguard Worker 
352*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
353*89c4ff92SAndroid Build Coastguard Worker 
354*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
355*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i=0; i< cpuCounters.size(); ++i)
356*89c4ff92SAndroid Build Coastguard Worker     {
357*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
358*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
359*89c4ff92SAndroid Build Coastguard Worker     }
360*89c4ff92SAndroid Build Coastguard Worker 
361*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
362*89c4ff92SAndroid Build Coastguard Worker     for (unsigned long i=0; i< gpuCounters.size(); ++i)
363*89c4ff92SAndroid Build Coastguard Worker     {
364*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
365*89c4ff92SAndroid Build Coastguard Worker         CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
366*89c4ff92SAndroid Build Coastguard Worker     }
367*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
368*89c4ff92SAndroid Build Coastguard Worker 
369*89c4ff92SAndroid Build Coastguard Worker     // Request random counters with duplicates and invalid counters
370*89c4ff92SAndroid Build Coastguard Worker     counterValues = {0, 0, 200, cpuCounters[2], gpuCounters[0],3 ,30, cpuCounters[0],cpuCounters[2], gpuCounters[1], 3,
371*89c4ff92SAndroid Build Coastguard Worker                      90, 0, 30, gpuCounters[0], gpuCounters[0]};
372*89c4ff92SAndroid Build Coastguard Worker 
373*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, counterValues));
374*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
375*89c4ff92SAndroid Build Coastguard Worker 
376*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
377*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 2);
378*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(cpuAccId) != activeIds.end()));
379*89c4ff92SAndroid Build Coastguard Worker     CHECK((activeIds.find(gpuAccId) != activeIds.end()));
380*89c4ff92SAndroid Build Coastguard Worker 
381*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
382*89c4ff92SAndroid Build Coastguard Worker 
383*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 2);
384*89c4ff92SAndroid Build Coastguard Worker 
385*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues.size() == 2);
386*89c4ff92SAndroid Build Coastguard Worker 
387*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[0].counterId == cpuCounters[0]);
388*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[0].counterValue == 1u);
389*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[1].counterId == cpuCounters[2]);
390*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[0].counterValues[1].counterValue == 3u);
391*89c4ff92SAndroid Build Coastguard Worker 
392*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues.size() == 2);
393*89c4ff92SAndroid Build Coastguard Worker 
394*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues[0].counterId == gpuCounters[0]);
395*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues[0].counterValue == 1u);
396*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues[1].counterId == gpuCounters[1]);
397*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp[1].counterValues[1].counterValue == 2u);
398*89c4ff92SAndroid Build Coastguard Worker 
399*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
400*89c4ff92SAndroid Build Coastguard Worker 
401*89c4ff92SAndroid Build Coastguard Worker     // Request no counters
402*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, {}));
403*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
404*89c4ff92SAndroid Build Coastguard Worker 
405*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
406*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 0);
407*89c4ff92SAndroid Build Coastguard Worker 
408*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
409*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 0);
410*89c4ff92SAndroid Build Coastguard Worker 
411*89c4ff92SAndroid Build Coastguard Worker     sendCounterPacket.ClearTimestamps();
412*89c4ff92SAndroid Build Coastguard Worker 
413*89c4ff92SAndroid Build Coastguard Worker     // Request period of zero
414*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(0, counterValues));
415*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
416*89c4ff92SAndroid Build Coastguard Worker 
417*89c4ff92SAndroid Build Coastguard Worker     activeIds = holder.GetCaptureData().GetActiveBackends();
418*89c4ff92SAndroid Build Coastguard Worker     CHECK(activeIds.size() == 0);
419*89c4ff92SAndroid Build Coastguard Worker 
420*89c4ff92SAndroid Build Coastguard Worker     recievedTimestamp = sendCounterPacket.GetTimestamps();
421*89c4ff92SAndroid Build Coastguard Worker     CHECK(recievedTimestamp.size() == 0);
422*89c4ff92SAndroid Build Coastguard Worker }
423*89c4ff92SAndroid Build Coastguard Worker 
424*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("TestBackendCounterLogging")
425*89c4ff92SAndroid Build Coastguard Worker {
426*89c4ff92SAndroid Build Coastguard Worker     std::stringstream ss;
427*89c4ff92SAndroid Build Coastguard Worker 
428*89c4ff92SAndroid Build Coastguard Worker     struct StreamRedirector
429*89c4ff92SAndroid Build Coastguard Worker     {
430*89c4ff92SAndroid Build Coastguard Worker     public:
StreamRedirectorStreamRedirector431*89c4ff92SAndroid Build Coastguard Worker         StreamRedirector(std::ostream &stream, std::streambuf *newStreamBuffer)
432*89c4ff92SAndroid Build Coastguard Worker                 : m_Stream(stream), m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer))
433*89c4ff92SAndroid Build Coastguard Worker         {}
434*89c4ff92SAndroid Build Coastguard Worker 
~StreamRedirectorStreamRedirector435*89c4ff92SAndroid Build Coastguard Worker         ~StreamRedirector()
436*89c4ff92SAndroid Build Coastguard Worker         { m_Stream.rdbuf(m_BackupBuffer); }
437*89c4ff92SAndroid Build Coastguard Worker 
438*89c4ff92SAndroid Build Coastguard Worker     private:
439*89c4ff92SAndroid Build Coastguard Worker         std::ostream &m_Stream;
440*89c4ff92SAndroid Build Coastguard Worker         std::streambuf *m_BackupBuffer;
441*89c4ff92SAndroid Build Coastguard Worker     };
442*89c4ff92SAndroid Build Coastguard Worker 
443*89c4ff92SAndroid Build Coastguard Worker     Holder holder;
444*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::PacketVersionResolver packetVersionResolver;
445*89c4ff92SAndroid Build Coastguard Worker     ProfilingStateMachine stateMachine;
446*89c4ff92SAndroid Build Coastguard Worker     ReadCounterVals readCounterVals;
447*89c4ff92SAndroid Build Coastguard Worker     StreamRedirector redirect(std::cout, ss.rdbuf());
448*89c4ff92SAndroid Build Coastguard Worker     CounterIdMap counterIdMap;
449*89c4ff92SAndroid Build Coastguard Worker     MockBackendSendCounterPacket sendCounterPacket;
450*89c4ff92SAndroid Build Coastguard Worker 
451*89c4ff92SAndroid Build Coastguard Worker     const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
452*89c4ff92SAndroid Build Coastguard Worker     const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
453*89c4ff92SAndroid Build Coastguard Worker 
454*89c4ff92SAndroid Build Coastguard Worker     ProfilingOptions options;
455*89c4ff92SAndroid Build Coastguard Worker     options.m_EnableProfiling = true;
456*89c4ff92SAndroid Build Coastguard Worker 
457*89c4ff92SAndroid Build Coastguard Worker     armnn::ArmNNProfilingServiceInitialiser initialiser;
458*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
459*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::MAX_ARMNN_COUNTER,
460*89c4ff92SAndroid Build Coastguard Worker         initialiser,
461*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_INFO,
462*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_VERSION,
463*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_HARDWARE_VERSION);
464*89c4ff92SAndroid Build Coastguard Worker 
465*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
466*89c4ff92SAndroid Build Coastguard Worker         std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
467*89c4ff92SAndroid Build Coastguard Worker 
468*89c4ff92SAndroid Build Coastguard Worker     std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
469*89c4ff92SAndroid Build Coastguard Worker             std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
470*89c4ff92SAndroid Build Coastguard Worker 
471*89c4ff92SAndroid Build Coastguard Worker     std::unordered_map<std::string,
472*89c4ff92SAndroid Build Coastguard Worker             std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
473*89c4ff92SAndroid Build Coastguard Worker 
474*89c4ff92SAndroid Build Coastguard Worker     uint16_t globalId = 5;
475*89c4ff92SAndroid Build Coastguard Worker     counterIdMap.RegisterMapping(globalId, 0, cpuAccId);
476*89c4ff92SAndroid Build Coastguard Worker     backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
477*89c4ff92SAndroid Build Coastguard Worker 
478*89c4ff92SAndroid Build Coastguard Worker     PeriodicCounterCapture periodicCounterCapture(holder, sendCounterPacket, readCounterVals,
479*89c4ff92SAndroid Build Coastguard Worker                                                   counterIdMap, backendProfilingContexts);
480*89c4ff92SAndroid Build Coastguard Worker 
481*89c4ff92SAndroid Build Coastguard Worker     uint16_t maxArmnnCounterId = 4;
482*89c4ff92SAndroid Build Coastguard Worker 
483*89c4ff92SAndroid Build Coastguard Worker     PeriodicCounterSelectionCommandHandler periodicCounterSelectionCommandHandler(0,
484*89c4ff92SAndroid Build Coastguard Worker                                                   4,
485*89c4ff92SAndroid Build Coastguard Worker                                                   packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(),
486*89c4ff92SAndroid Build Coastguard Worker                                                   backendProfilingContexts,
487*89c4ff92SAndroid Build Coastguard Worker                                                   counterIdMap,
488*89c4ff92SAndroid Build Coastguard Worker                                                   holder,
489*89c4ff92SAndroid Build Coastguard Worker                                                   maxArmnnCounterId,
490*89c4ff92SAndroid Build Coastguard Worker                                                   periodicCounterCapture,
491*89c4ff92SAndroid Build Coastguard Worker                                                   readCounterVals,
492*89c4ff92SAndroid Build Coastguard Worker                                                   sendCounterPacket,
493*89c4ff92SAndroid Build Coastguard Worker                                                   stateMachine);
494*89c4ff92SAndroid Build Coastguard Worker 
495*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::NotConnected);
496*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::WaitingForAck);
497*89c4ff92SAndroid Build Coastguard Worker     stateMachine.TransitionToState(ProfilingState::Active);
498*89c4ff92SAndroid Build Coastguard Worker 
499*89c4ff92SAndroid Build Coastguard Worker     uint32_t period = 15939u;
500*89c4ff92SAndroid Build Coastguard Worker 
501*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::SetAllLoggingSinks(true, false, false);
502*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Warning);
503*89c4ff92SAndroid Build Coastguard Worker     periodicCounterSelectionCommandHandler(PacketWriter(period, {5}));
504*89c4ff92SAndroid Build Coastguard Worker     periodicCounterCapture.Stop();
505*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Fatal);
506*89c4ff92SAndroid Build Coastguard Worker 
507*89c4ff92SAndroid Build Coastguard Worker     CHECK(ss.str().find("ActivateCounters example test error") != std::string::npos);
508*89c4ff92SAndroid Build Coastguard Worker }
509*89c4ff92SAndroid Build Coastguard Worker 
510*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("BackendProfilingContextGetSendTimelinePacket")
511*89c4ff92SAndroid Build Coastguard Worker {
512*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
513*89c4ff92SAndroid Build Coastguard Worker 
514*89c4ff92SAndroid Build Coastguard Worker     // Reset the profiling service to the uninitialized state
515*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions options;
516*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = true;
517*89c4ff92SAndroid Build Coastguard Worker 
518*89c4ff92SAndroid Build Coastguard Worker     armnn::ArmNNProfilingServiceInitialiser psInitialiser;
519*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
520*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::MAX_ARMNN_COUNTER,
521*89c4ff92SAndroid Build Coastguard Worker         psInitialiser,
522*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_INFO,
523*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_SOFTWARE_VERSION,
524*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::ARMNN_HARDWARE_VERSION);
525*89c4ff92SAndroid Build Coastguard Worker 
526*89c4ff92SAndroid Build Coastguard Worker     profilingService->ConfigureProfilingService(
527*89c4ff92SAndroid Build Coastguard Worker         ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
528*89c4ff92SAndroid Build Coastguard Worker 
529*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendInitialiser initialiser;
530*89c4ff92SAndroid Build Coastguard Worker     // Create a runtime. During this the mock backend will be registered and context returned.
531*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
532*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
533*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendProfilingContext* mockBackEndProfilingContext = mockProfilingService.GetContext();
534*89c4ff92SAndroid Build Coastguard Worker     // Check that there is a valid context set.
535*89c4ff92SAndroid Build Coastguard Worker     CHECK(mockBackEndProfilingContext);
536*89c4ff92SAndroid Build Coastguard Worker     armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
537*89c4ff92SAndroid Build Coastguard Worker         mockBackEndProfilingContext->GetBackendProfiling();
538*89c4ff92SAndroid Build Coastguard Worker     CHECK(backendProfilingIface);
539*89c4ff92SAndroid Build Coastguard Worker 
540*89c4ff92SAndroid Build Coastguard Worker     // Now for the meat of the test. We're just going to send a random packet and make sure there
541*89c4ff92SAndroid Build Coastguard Worker     // are no exceptions or errors. The sending of packets is already tested in SendTimelinePacketTests.
542*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<ISendTimelinePacket> timelinePacket =
543*89c4ff92SAndroid Build Coastguard Worker         backendProfilingIface->GetSendTimelinePacket();
544*89c4ff92SAndroid Build Coastguard Worker     // Send TimelineEntityClassBinaryPacket
545*89c4ff92SAndroid Build Coastguard Worker     const uint64_t entityBinaryPacketProfilingGuid = 123456u;
546*89c4ff92SAndroid Build Coastguard Worker     timelinePacket->SendTimelineEntityBinaryPacket(entityBinaryPacketProfilingGuid);
547*89c4ff92SAndroid Build Coastguard Worker     timelinePacket->Commit();
548*89c4ff92SAndroid Build Coastguard Worker 
549*89c4ff92SAndroid Build Coastguard Worker     // Reset the profiling servie after the test.
550*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = false;
551*89c4ff92SAndroid Build Coastguard Worker     profilingService->ResetExternalProfilingOptions(
552*89c4ff92SAndroid Build Coastguard Worker         ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
553*89c4ff92SAndroid Build Coastguard Worker }
554*89c4ff92SAndroid Build Coastguard Worker 
555*89c4ff92SAndroid Build Coastguard Worker TEST_CASE("GetProfilingGuidGenerator")
556*89c4ff92SAndroid Build Coastguard Worker {
557*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
558*89c4ff92SAndroid Build Coastguard Worker 
559*89c4ff92SAndroid Build Coastguard Worker     // Reset the profiling service to the uninitialized state
560*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntime::CreationOptions options;
561*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = true;
562*89c4ff92SAndroid Build Coastguard Worker 
563*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendInitialiser initialiser;
564*89c4ff92SAndroid Build Coastguard Worker     // Create a runtime. During this the mock backend will be registered and context returned.
565*89c4ff92SAndroid Build Coastguard Worker     armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
566*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
567*89c4ff92SAndroid Build Coastguard Worker     armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext();
568*89c4ff92SAndroid Build Coastguard Worker     // Check that there is a valid context set.
569*89c4ff92SAndroid Build Coastguard Worker     CHECK(mockBackEndProfilingContext);
570*89c4ff92SAndroid Build Coastguard Worker     armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
571*89c4ff92SAndroid Build Coastguard Worker         mockBackEndProfilingContext->GetBackendProfiling();
572*89c4ff92SAndroid Build Coastguard Worker     CHECK(backendProfilingIface);
573*89c4ff92SAndroid Build Coastguard Worker 
574*89c4ff92SAndroid Build Coastguard Worker     // Get the Guid generator and check the getting two Guid's results in the second being greater than the first.
575*89c4ff92SAndroid Build Coastguard Worker     IProfilingGuidGenerator& guidGenerator = backendProfilingIface->GetProfilingGuidGenerator();
576*89c4ff92SAndroid Build Coastguard Worker     const ProfilingDynamicGuid& firstGuid = guidGenerator.NextGuid();
577*89c4ff92SAndroid Build Coastguard Worker     const ProfilingDynamicGuid& secondGuid = guidGenerator.NextGuid();
578*89c4ff92SAndroid Build Coastguard Worker     CHECK(secondGuid > firstGuid);
579*89c4ff92SAndroid Build Coastguard Worker 
580*89c4ff92SAndroid Build Coastguard Worker     // Reset the profiling servie after the test.
581*89c4ff92SAndroid Build Coastguard Worker     options.m_ProfilingOptions.m_EnableProfiling = false;
582*89c4ff92SAndroid Build Coastguard Worker }
583*89c4ff92SAndroid Build Coastguard Worker 
584*89c4ff92SAndroid Build Coastguard Worker }
585