blob: 916a5864adfb4325de3013b51483963289af48ce [file] [log] [blame]
David Monahanc1536d62020-02-12 15:52:35 +00001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
David Monahanc1536d62020-02-12 15:52:35 +00003// SPDX-License-Identifier: MIT
4//
5
Jim Flynn34430252022-03-04 15:03:58 +00006#include "ArmNNProfilingServiceInitialiser.hpp"
David Monahanc1536d62020-02-12 15:52:35 +00007#include "MockBackendId.hpp"
Jim Flynn4c9ed1d2022-01-23 23:57:20 +00008#include "ProfilingOptionsConverter.hpp"
David Monahanc1536d62020-02-12 15:52:35 +00009
Sadik Armagana097d2a2021-11-24 15:47:28 +000010#include <TestUtils.hpp>
Sadik Armagan3184c902020-03-18 10:57:30 +000011
David Monahanc1536d62020-02-12 15:52:35 +000012#include <armnn/BackendId.hpp>
Finn Williams032bc742020-02-12 11:02:34 +000013#include <armnn/Logging.hpp>
Jim Flynnc454ac92022-03-16 18:43:18 +000014
15#include <armnn/profiling/ArmNNProfiling.hpp>
Jim Flynnc454ac92022-03-16 18:43:18 +000016
17#include <armnn/utility/IgnoreUnused.hpp>
18
Cathal Corbett3464ba12022-03-04 11:36:39 +000019#include <armnnTestUtils/MockBackend.hpp>
Finn Williams032bc742020-02-12 11:02:34 +000020
Jim Flynn27761832022-03-20 21:52:17 +000021#include <client/include/CounterIdMap.hpp>
22#include <client/include/Holder.hpp>
23#include <client/include/ISendTimelinePacket.hpp>
24#include <client/include/ProfilingOptions.hpp>
25
Jim Flynn3e9bc192022-03-23 23:01:26 +000026#include <client/src/PeriodicCounterCapture.hpp>
27#include <client/src/PeriodicCounterSelectionCommandHandler.hpp>
28#include <client/src/ProfilingStateMachine.hpp>
29#include <client/src/ProfilingUtils.hpp>
30#include <client/src/RequestCounterDirectoryCommandHandler.hpp>
31
32#include <client/src/backends/BackendProfiling.hpp>
33
Jim Flynnc454ac92022-03-16 18:43:18 +000034#include <common/include/CounterDirectory.hpp>
Jim Flynn3e9bc192022-03-23 23:01:26 +000035#include <common/include/PacketVersionResolver.hpp>
Jim Flynnc454ac92022-03-16 18:43:18 +000036
37#include <doctest/doctest.h>
38
39#include <vector>
40#include <cstdint>
41#include <limits>
Jim Flynn6c9f17d2022-03-10 23:13:01 +000042
43namespace arm
44{
45
46namespace pipe
47{
48
49struct LogLevelSwapper
50{
51public:
52 LogLevelSwapper(arm::pipe::LogSeverity severity)
53 {
54 // Set the new log level
55 arm::pipe::ConfigureLogging(true, true, severity);
56 }
57 ~LogLevelSwapper()
58 {
59 // The default log level for unit tests is "Fatal"
60 arm::pipe::ConfigureLogging(true, true, arm::pipe::LogSeverity::Fatal);
61 }
62};
63
64} // namespace pipe
65
66} // namespace arm
67
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000068using namespace arm::pipe;
Finn Williams032bc742020-02-12 11:02:34 +000069
70class ReadCounterVals : public IReadCounterValues
71{
72 virtual bool IsCounterRegistered(uint16_t counterUid) const override
73 {
74 return (counterUid > 4 && counterUid < 11);
75 }
Jim Flynn34430252022-03-04 15:03:58 +000076 virtual bool IsCounterRegistered(const std::string& counterName) const override
77 {
78 armnn::IgnoreUnused(counterName);
79 return false;
80 }
Finn Williams032bc742020-02-12 11:02:34 +000081 virtual uint16_t GetCounterCount() const override
82 {
83 return 1;
84 }
Finn Williamsf3fcf322020-05-11 14:38:02 +010085 virtual uint32_t GetAbsoluteCounterValue(uint16_t counterUid) const override
86 {
87 return counterUid;
88 }
89 virtual uint32_t GetDeltaCounterValue(uint16_t counterUid) override
Finn Williams032bc742020-02-12 11:02:34 +000090 {
91 return counterUid;
92 }
93};
94
95class MockBackendSendCounterPacket : public ISendCounterPacket
96{
97public:
98 using IndexValuePairsVector = std::vector<CounterValue>;
99
100 /// Create and write a StreamMetaDataPacket in the buffer
101 virtual void SendStreamMetaDataPacket() {}
102
103 /// Create and write a CounterDirectoryPacket from the parameters to the buffer.
104 virtual void SendCounterDirectoryPacket(const ICounterDirectory& counterDirectory)
105 {
Jan Eilers8eb25602020-03-09 12:13:48 +0000106 armnn::IgnoreUnused(counterDirectory);
Finn Williams032bc742020-02-12 11:02:34 +0000107 }
108
109 /// Create and write a PeriodicCounterCapturePacket from the parameters to the buffer.
110 virtual void SendPeriodicCounterCapturePacket(uint64_t timestamp, const IndexValuePairsVector& values)
111 {
112 m_timestamps.emplace_back(Timestamp{timestamp, values});
113 }
114
115 /// Create and write a PeriodicCounterSelectionPacket from the parameters to the buffer.
116 virtual void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,
117 const std::vector<uint16_t>& selectedCounterIds)
118 {
Jan Eilers8eb25602020-03-09 12:13:48 +0000119 armnn::IgnoreUnused(capturePeriod);
120 armnn::IgnoreUnused(selectedCounterIds);
Finn Williams032bc742020-02-12 11:02:34 +0000121 }
122
123 std::vector<Timestamp> GetTimestamps()
124 {
125 return m_timestamps;
126 }
127
128 void ClearTimestamps()
129 {
130 m_timestamps.clear();
131 }
132
133private:
134 std::vector<Timestamp> m_timestamps;
135};
136
Jim Flynnbbfe6032020-07-20 16:57:44 +0100137arm::pipe::Packet PacketWriter(uint32_t period, std::vector<uint16_t> countervalues)
Finn Williams032bc742020-02-12 11:02:34 +0000138{
139 const uint32_t packetId = 0x40000;
140 uint32_t offset = 0;
141 uint32_t dataLength = static_cast<uint32_t>(4 + countervalues.size() * 2);
142 std::unique_ptr<unsigned char[]> uniqueData = std::make_unique<unsigned char[]>(dataLength);
143 unsigned char* data1 = reinterpret_cast<unsigned char*>(uniqueData.get());
144
145 WriteUint32(data1, offset, period);
146 offset += 4;
147 for (auto countervalue : countervalues)
148 {
149 WriteUint16(data1, offset, countervalue);
150 offset += 2;
151 }
152
153 return {packetId, dataLength, uniqueData};
154}
155
Sadik Armagan1625efc2021-06-10 18:24:34 +0100156TEST_SUITE("BackendProfilingTestSuite")
157{
158TEST_CASE("BackendProfilingCounterRegisterMockBackendTest")
David Monahanc1536d62020-02-12 15:52:35 +0000159{
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000160 arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
161
David Monahanc1536d62020-02-12 15:52:35 +0000162 // Reset the profiling service to the uninitialized state
163 armnn::IRuntime::CreationOptions options;
Finn Williams45a73622020-05-15 18:41:05 +0100164 options.m_ProfilingOptions.m_EnableProfiling = true;
David Monahanc1536d62020-02-12 15:52:35 +0000165
166 armnn::MockBackendInitialiser initialiser;
167 // Create a runtime
Kevin Mayd92a6e42021-02-04 10:27:41 +0000168 armnn::RuntimeImpl runtime(options);
David Monahanc1536d62020-02-12 15:52:35 +0000169
Narumol Prangnawarat060bad52020-11-20 16:17:48 +0000170 unsigned int shiftedId = 0;
171
Nikhil Raj01bc02d2021-05-07 17:07:09 +0100172 if (armnn::BackendRegistry().IsBackendRegistered("EthosNAcc"))
173 {
174 shiftedId = 4;
175 }
Narumol Prangnawarat060bad52020-11-20 16:17:48 +0000176
David Monahanc1536d62020-02-12 15:52:35 +0000177 // Check if the MockBackends 3 dummy counters {0, 1, 2-5 (four cores)} are registered
178 armnn::BackendId mockId = armnn::MockBackendId();
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000179 const ICounterMappings& counterMap = GetProfilingService(&runtime).GetCounterMappings();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100180 CHECK(counterMap.GetGlobalId(0, mockId) == 5 + shiftedId);
181 CHECK(counterMap.GetGlobalId(1, mockId) == 6 + shiftedId);
182 CHECK(counterMap.GetGlobalId(2, mockId) == 7 + shiftedId);
183 CHECK(counterMap.GetGlobalId(3, mockId) == 8 + shiftedId);
184 CHECK(counterMap.GetGlobalId(4, mockId) == 9 + shiftedId);
185 CHECK(counterMap.GetGlobalId(5, mockId) == 10 + shiftedId);
David Monahanc1536d62020-02-12 15:52:35 +0000186 options.m_ProfilingOptions.m_EnableProfiling = false;
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000187 GetProfilingService(&runtime).ResetExternalProfilingOptions(
188 ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
David Monahanc1536d62020-02-12 15:52:35 +0000189}
190
Sadik Armagan1625efc2021-06-10 18:24:34 +0100191TEST_CASE("TestBackendCounters")
Finn Williams032bc742020-02-12 11:02:34 +0000192{
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000193 arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
194
Finn Williams032bc742020-02-12 11:02:34 +0000195 Holder holder;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100196 arm::pipe::PacketVersionResolver packetVersionResolver;
Finn Williams032bc742020-02-12 11:02:34 +0000197 ProfilingStateMachine stateMachine;
198 ReadCounterVals readCounterVals;
199 CounterIdMap counterIdMap;
200 MockBackendSendCounterPacket sendCounterPacket;
201
Cathal Corbett6f073722022-03-04 12:11:09 +0000202 const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
203 const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
Finn Williams032bc742020-02-12 11:02:34 +0000204
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000205 ProfilingOptions options;
206 options.m_EnableProfiling = true;
Finn Williams032bc742020-02-12 11:02:34 +0000207
Jim Flynn34430252022-03-04 15:03:58 +0000208 armnn::ArmNNProfilingServiceInitialiser initialiser;
209 std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
Jim Flynn9c85b412022-03-16 00:27:43 +0000210 arm::pipe::MAX_ARMNN_COUNTER,
211 initialiser,
212 arm::pipe::ARMNN_SOFTWARE_INFO,
213 arm::pipe::ARMNN_SOFTWARE_VERSION,
214 arm::pipe::ARMNN_HARDWARE_VERSION);
Finn Williams032bc742020-02-12 11:02:34 +0000215
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000216 std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
Jim Flynn34430252022-03-04 15:03:58 +0000217 std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000218 std::unique_ptr<IBackendProfiling> gpuBackendProfilingPtr =
Jim Flynn34430252022-03-04 15:03:58 +0000219 std::make_unique<BackendProfiling>(options, *profilingService.get(), gpuAccId);
Finn Williams032bc742020-02-12 11:02:34 +0000220
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000221 std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
Finn Williams032bc742020-02-12 11:02:34 +0000222 std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000223 std::shared_ptr<IBackendProfilingContext> gpuProfilingContextPtr =
Finn Williams032bc742020-02-12 11:02:34 +0000224 std::make_shared<armnn::MockBackendProfilingContext>(gpuBackendProfilingPtr);
225
Cathal Corbett6f073722022-03-04 12:11:09 +0000226 std::unordered_map<std::string,
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000227 std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
Finn Williams032bc742020-02-12 11:02:34 +0000228
229 backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
230 backendProfilingContexts[gpuAccId] = gpuProfilingContextPtr;
231
232 uint16_t globalId = 5;
233
234 counterIdMap.RegisterMapping(globalId++, 0, cpuAccId);
235 counterIdMap.RegisterMapping(globalId++, 1, cpuAccId);
236 counterIdMap.RegisterMapping(globalId++, 2, cpuAccId);
237
238 counterIdMap.RegisterMapping(globalId++, 0, gpuAccId);
239 counterIdMap.RegisterMapping(globalId++, 1, gpuAccId);
240 counterIdMap.RegisterMapping(globalId++, 2, gpuAccId);
241
242 backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
243 backendProfilingContexts[gpuAccId] = gpuProfilingContextPtr;
244
245 PeriodicCounterCapture periodicCounterCapture(holder, sendCounterPacket, readCounterVals,
246 counterIdMap, backendProfilingContexts);
247
248 uint16_t maxArmnnCounterId = 4;
249
250 PeriodicCounterSelectionCommandHandler periodicCounterSelectionCommandHandler(0,
251 4,
252 packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(),
253 backendProfilingContexts,
254 counterIdMap,
255 holder,
256 maxArmnnCounterId,
257 periodicCounterCapture,
258 readCounterVals,
259 sendCounterPacket,
260 stateMachine);
261
262 stateMachine.TransitionToState(ProfilingState::NotConnected);
263 stateMachine.TransitionToState(ProfilingState::WaitingForAck);
264 stateMachine.TransitionToState(ProfilingState::Active);
265
266 uint32_t period = 12345u;
267
268 std::vector<uint16_t> cpuCounters{5, 6, 7};
269 std::vector<uint16_t> gpuCounters{8, 9, 10};
270
271 // Request only gpu counters
272 periodicCounterSelectionCommandHandler(PacketWriter(period, gpuCounters));
273 periodicCounterCapture.Stop();
274
Cathal Corbett6f073722022-03-04 12:11:09 +0000275 std::set<std::string> activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100276 CHECK(activeIds.size() == 1);
277 CHECK((activeIds.find(gpuAccId) != activeIds.end()));
Finn Williams032bc742020-02-12 11:02:34 +0000278
279 std::vector<Timestamp> recievedTimestamp = sendCounterPacket.GetTimestamps();
280
Sadik Armagan1625efc2021-06-10 18:24:34 +0100281 CHECK(recievedTimestamp[0].timestamp == period);
282 CHECK(recievedTimestamp.size() == 1);
283 CHECK(recievedTimestamp[0].counterValues.size() == gpuCounters.size());
Finn Williams032bc742020-02-12 11:02:34 +0000284 for (unsigned long i=0; i< gpuCounters.size(); ++i)
285 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100286 CHECK(recievedTimestamp[0].counterValues[i].counterId == gpuCounters[i]);
287 CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
Finn Williams032bc742020-02-12 11:02:34 +0000288 }
289 sendCounterPacket.ClearTimestamps();
290
291 // Request only cpu counters
292 periodicCounterSelectionCommandHandler(PacketWriter(period, cpuCounters));
293 periodicCounterCapture.Stop();
294
295 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100296 CHECK(activeIds.size() == 1);
297 CHECK((activeIds.find(cpuAccId) != activeIds.end()));
Finn Williams032bc742020-02-12 11:02:34 +0000298
299 recievedTimestamp = sendCounterPacket.GetTimestamps();
300
Sadik Armagan1625efc2021-06-10 18:24:34 +0100301 CHECK(recievedTimestamp[0].timestamp == period);
302 CHECK(recievedTimestamp.size() == 1);
303 CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
Finn Williams032bc742020-02-12 11:02:34 +0000304 for (unsigned long i=0; i< cpuCounters.size(); ++i)
305 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100306 CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
307 CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
Finn Williams032bc742020-02-12 11:02:34 +0000308 }
309 sendCounterPacket.ClearTimestamps();
310
311 // Request combination of cpu & gpu counters with new period
312 period = 12222u;
313 periodicCounterSelectionCommandHandler(PacketWriter(period, {cpuCounters[0], gpuCounters[2],
314 gpuCounters[1], cpuCounters[1], gpuCounters[0]}));
315 periodicCounterCapture.Stop();
316
317 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100318 CHECK(activeIds.size() == 2);
319 CHECK((activeIds.find(cpuAccId) != activeIds.end()));
320 CHECK((activeIds.find(gpuAccId) != activeIds.end()));
Finn Williams032bc742020-02-12 11:02:34 +0000321
322 recievedTimestamp = sendCounterPacket.GetTimestamps();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100323//
324 CHECK(recievedTimestamp[0].timestamp == period);
325 CHECK(recievedTimestamp[1].timestamp == period);
Finn Williams032bc742020-02-12 11:02:34 +0000326
Sadik Armagan1625efc2021-06-10 18:24:34 +0100327 CHECK(recievedTimestamp.size() == 2);
328 CHECK(recievedTimestamp[0].counterValues.size() == 2);
329 CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
Finn Williams032bc742020-02-12 11:02:34 +0000330
Sadik Armagan1625efc2021-06-10 18:24:34 +0100331 CHECK(recievedTimestamp[0].counterValues[0].counterId == cpuCounters[0]);
332 CHECK(recievedTimestamp[0].counterValues[0].counterValue == 1u);
333 CHECK(recievedTimestamp[0].counterValues[1].counterId == cpuCounters[1]);
334 CHECK(recievedTimestamp[0].counterValues[1].counterValue == 2u);
Finn Williams032bc742020-02-12 11:02:34 +0000335
336 for (unsigned long i=0; i< gpuCounters.size(); ++i)
337 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100338 CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
339 CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
Finn Williams032bc742020-02-12 11:02:34 +0000340 }
341
342 sendCounterPacket.ClearTimestamps();
343
344 // Request all counters
345 std::vector<uint16_t> counterValues;
346 counterValues.insert(counterValues.begin(), cpuCounters.begin(), cpuCounters.end());
347 counterValues.insert(counterValues.begin(), gpuCounters.begin(), gpuCounters.end());
348
349 periodicCounterSelectionCommandHandler(PacketWriter(period, counterValues));
350 periodicCounterCapture.Stop();
351
352 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100353 CHECK(activeIds.size() == 2);
354 CHECK((activeIds.find(cpuAccId) != activeIds.end()));
355 CHECK((activeIds.find(gpuAccId) != activeIds.end()));
Finn Williams032bc742020-02-12 11:02:34 +0000356
357 recievedTimestamp = sendCounterPacket.GetTimestamps();
358
Sadik Armagan1625efc2021-06-10 18:24:34 +0100359 CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
Finn Williams032bc742020-02-12 11:02:34 +0000360 for (unsigned long i=0; i< cpuCounters.size(); ++i)
361 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100362 CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
363 CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
Finn Williams032bc742020-02-12 11:02:34 +0000364 }
365
Sadik Armagan1625efc2021-06-10 18:24:34 +0100366 CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
Finn Williams032bc742020-02-12 11:02:34 +0000367 for (unsigned long i=0; i< gpuCounters.size(); ++i)
368 {
Sadik Armagan1625efc2021-06-10 18:24:34 +0100369 CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
370 CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
Finn Williams032bc742020-02-12 11:02:34 +0000371 }
372 sendCounterPacket.ClearTimestamps();
373
374 // Request random counters with duplicates and invalid counters
375 counterValues = {0, 0, 200, cpuCounters[2], gpuCounters[0],3 ,30, cpuCounters[0],cpuCounters[2], gpuCounters[1], 3,
376 90, 0, 30, gpuCounters[0], gpuCounters[0]};
377
378 periodicCounterSelectionCommandHandler(PacketWriter(period, counterValues));
379 periodicCounterCapture.Stop();
380
381 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100382 CHECK(activeIds.size() == 2);
383 CHECK((activeIds.find(cpuAccId) != activeIds.end()));
384 CHECK((activeIds.find(gpuAccId) != activeIds.end()));
Finn Williams032bc742020-02-12 11:02:34 +0000385
386 recievedTimestamp = sendCounterPacket.GetTimestamps();
387
Sadik Armagan1625efc2021-06-10 18:24:34 +0100388 CHECK(recievedTimestamp.size() == 2);
Finn Williams032bc742020-02-12 11:02:34 +0000389
Sadik Armagan1625efc2021-06-10 18:24:34 +0100390 CHECK(recievedTimestamp[0].counterValues.size() == 2);
Finn Williams032bc742020-02-12 11:02:34 +0000391
Sadik Armagan1625efc2021-06-10 18:24:34 +0100392 CHECK(recievedTimestamp[0].counterValues[0].counterId == cpuCounters[0]);
393 CHECK(recievedTimestamp[0].counterValues[0].counterValue == 1u);
394 CHECK(recievedTimestamp[0].counterValues[1].counterId == cpuCounters[2]);
395 CHECK(recievedTimestamp[0].counterValues[1].counterValue == 3u);
Finn Williams032bc742020-02-12 11:02:34 +0000396
Sadik Armagan1625efc2021-06-10 18:24:34 +0100397 CHECK(recievedTimestamp[1].counterValues.size() == 2);
Finn Williams032bc742020-02-12 11:02:34 +0000398
Sadik Armagan1625efc2021-06-10 18:24:34 +0100399 CHECK(recievedTimestamp[1].counterValues[0].counterId == gpuCounters[0]);
400 CHECK(recievedTimestamp[1].counterValues[0].counterValue == 1u);
401 CHECK(recievedTimestamp[1].counterValues[1].counterId == gpuCounters[1]);
402 CHECK(recievedTimestamp[1].counterValues[1].counterValue == 2u);
Finn Williams032bc742020-02-12 11:02:34 +0000403
404 sendCounterPacket.ClearTimestamps();
405
406 // Request no counters
407 periodicCounterSelectionCommandHandler(PacketWriter(period, {}));
408 periodicCounterCapture.Stop();
409
410 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100411 CHECK(activeIds.size() == 0);
Finn Williams032bc742020-02-12 11:02:34 +0000412
413 recievedTimestamp = sendCounterPacket.GetTimestamps();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100414 CHECK(recievedTimestamp.size() == 0);
Finn Williams032bc742020-02-12 11:02:34 +0000415
416 sendCounterPacket.ClearTimestamps();
417
418 // Request period of zero
419 periodicCounterSelectionCommandHandler(PacketWriter(0, counterValues));
420 periodicCounterCapture.Stop();
421
422 activeIds = holder.GetCaptureData().GetActiveBackends();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100423 CHECK(activeIds.size() == 0);
Finn Williams032bc742020-02-12 11:02:34 +0000424
425 recievedTimestamp = sendCounterPacket.GetTimestamps();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100426 CHECK(recievedTimestamp.size() == 0);
Finn Williams032bc742020-02-12 11:02:34 +0000427}
428
Sadik Armagan1625efc2021-06-10 18:24:34 +0100429TEST_CASE("TestBackendCounterLogging")
Finn Williams032bc742020-02-12 11:02:34 +0000430{
431 std::stringstream ss;
432
433 struct StreamRedirector
434 {
435 public:
436 StreamRedirector(std::ostream &stream, std::streambuf *newStreamBuffer)
437 : m_Stream(stream), m_BackupBuffer(m_Stream.rdbuf(newStreamBuffer))
438 {}
439
440 ~StreamRedirector()
441 { m_Stream.rdbuf(m_BackupBuffer); }
442
443 private:
444 std::ostream &m_Stream;
445 std::streambuf *m_BackupBuffer;
446 };
447
448 Holder holder;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100449 arm::pipe::PacketVersionResolver packetVersionResolver;
Finn Williams032bc742020-02-12 11:02:34 +0000450 ProfilingStateMachine stateMachine;
451 ReadCounterVals readCounterVals;
452 StreamRedirector redirect(std::cout, ss.rdbuf());
453 CounterIdMap counterIdMap;
454 MockBackendSendCounterPacket sendCounterPacket;
455
Cathal Corbett6f073722022-03-04 12:11:09 +0000456 const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
457 const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
Finn Williams032bc742020-02-12 11:02:34 +0000458
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000459 ProfilingOptions options;
460 options.m_EnableProfiling = true;
Finn Williams032bc742020-02-12 11:02:34 +0000461
Jim Flynn34430252022-03-04 15:03:58 +0000462 armnn::ArmNNProfilingServiceInitialiser initialiser;
463 std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
Jim Flynn9c85b412022-03-16 00:27:43 +0000464 arm::pipe::MAX_ARMNN_COUNTER,
465 initialiser,
466 arm::pipe::ARMNN_SOFTWARE_INFO,
467 arm::pipe::ARMNN_SOFTWARE_VERSION,
468 arm::pipe::ARMNN_HARDWARE_VERSION);
Finn Williams032bc742020-02-12 11:02:34 +0000469
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000470 std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
Jim Flynn34430252022-03-04 15:03:58 +0000471 std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
Finn Williams032bc742020-02-12 11:02:34 +0000472
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000473 std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
Finn Williams032bc742020-02-12 11:02:34 +0000474 std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
475
Cathal Corbett6f073722022-03-04 12:11:09 +0000476 std::unordered_map<std::string,
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000477 std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
Finn Williams032bc742020-02-12 11:02:34 +0000478
479 uint16_t globalId = 5;
480 counterIdMap.RegisterMapping(globalId, 0, cpuAccId);
481 backendProfilingContexts[cpuAccId] = cpuProfilingContextPtr;
482
483 PeriodicCounterCapture periodicCounterCapture(holder, sendCounterPacket, readCounterVals,
484 counterIdMap, backendProfilingContexts);
485
486 uint16_t maxArmnnCounterId = 4;
487
488 PeriodicCounterSelectionCommandHandler periodicCounterSelectionCommandHandler(0,
489 4,
490 packetVersionResolver.ResolvePacketVersion(0, 4).GetEncodedValue(),
491 backendProfilingContexts,
492 counterIdMap,
493 holder,
494 maxArmnnCounterId,
495 periodicCounterCapture,
496 readCounterVals,
497 sendCounterPacket,
498 stateMachine);
499
500 stateMachine.TransitionToState(ProfilingState::NotConnected);
501 stateMachine.TransitionToState(ProfilingState::WaitingForAck);
502 stateMachine.TransitionToState(ProfilingState::Active);
503
504 uint32_t period = 15939u;
505
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000506 arm::pipe::SetAllLoggingSinks(true, false, false);
507 arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Warning);
Finn Williams032bc742020-02-12 11:02:34 +0000508 periodicCounterSelectionCommandHandler(PacketWriter(period, {5}));
509 periodicCounterCapture.Stop();
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000510 arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Fatal);
Finn Williams032bc742020-02-12 11:02:34 +0000511
Sadik Armagan1625efc2021-06-10 18:24:34 +0100512 CHECK(ss.str().find("ActivateCounters example test error") != std::string::npos);
Finn Williams032bc742020-02-12 11:02:34 +0000513}
514
Sadik Armagan1625efc2021-06-10 18:24:34 +0100515TEST_CASE("BackendProfilingContextGetSendTimelinePacket")
Colm Donelanfcb802b2020-02-13 20:47:08 +0000516{
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000517 arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
518
Colm Donelanfcb802b2020-02-13 20:47:08 +0000519 // Reset the profiling service to the uninitialized state
520 armnn::IRuntime::CreationOptions options;
521 options.m_ProfilingOptions.m_EnableProfiling = true;
Jim Flynn34430252022-03-04 15:03:58 +0000522
523 armnn::ArmNNProfilingServiceInitialiser psInitialiser;
524 std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
Jim Flynn9c85b412022-03-16 00:27:43 +0000525 arm::pipe::MAX_ARMNN_COUNTER,
526 psInitialiser,
527 arm::pipe::ARMNN_SOFTWARE_INFO,
528 arm::pipe::ARMNN_SOFTWARE_VERSION,
529 arm::pipe::ARMNN_HARDWARE_VERSION);
Jim Flynn34430252022-03-04 15:03:58 +0000530
531 profilingService->ConfigureProfilingService(
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000532 ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000533
534 armnn::MockBackendInitialiser initialiser;
535 // Create a runtime. During this the mock backend will be registered and context returned.
536 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
537 armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
Jim Flynn34430252022-03-04 15:03:58 +0000538 armnn::MockBackendProfilingContext* mockBackEndProfilingContext = mockProfilingService.GetContext();
Colm Donelanfcb802b2020-02-13 20:47:08 +0000539 // Check that there is a valid context set.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100540 CHECK(mockBackEndProfilingContext);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000541 armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
542 mockBackEndProfilingContext->GetBackendProfiling();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100543 CHECK(backendProfilingIface);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000544
545 // Now for the meat of the test. We're just going to send a random packet and make sure there
546 // are no exceptions or errors. The sending of packets is already tested in SendTimelinePacketTests.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000547 std::unique_ptr<ISendTimelinePacket> timelinePacket =
Colm Donelanfcb802b2020-02-13 20:47:08 +0000548 backendProfilingIface->GetSendTimelinePacket();
549 // Send TimelineEntityClassBinaryPacket
550 const uint64_t entityBinaryPacketProfilingGuid = 123456u;
551 timelinePacket->SendTimelineEntityBinaryPacket(entityBinaryPacketProfilingGuid);
552 timelinePacket->Commit();
553
554 // Reset the profiling servie after the test.
555 options.m_ProfilingOptions.m_EnableProfiling = false;
Jim Flynn34430252022-03-04 15:03:58 +0000556 profilingService->ResetExternalProfilingOptions(
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000557 ConvertExternalProfilingOptions(options.m_ProfilingOptions), true);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000558}
559
Sadik Armagan1625efc2021-06-10 18:24:34 +0100560TEST_CASE("GetProfilingGuidGenerator")
Colm Donelanfcb802b2020-02-13 20:47:08 +0000561{
Jim Flynn6c9f17d2022-03-10 23:13:01 +0000562 arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
563
Colm Donelanfcb802b2020-02-13 20:47:08 +0000564 // Reset the profiling service to the uninitialized state
565 armnn::IRuntime::CreationOptions options;
566 options.m_ProfilingOptions.m_EnableProfiling = true;
Colm Donelanfcb802b2020-02-13 20:47:08 +0000567
568 armnn::MockBackendInitialiser initialiser;
569 // Create a runtime. During this the mock backend will be registered and context returned.
570 armnn::IRuntimePtr runtime(armnn::IRuntime::Create(options));
571 armnn::MockBackendProfilingService mockProfilingService = armnn::MockBackendProfilingService::Instance();
572 armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext();
573 // Check that there is a valid context set.
Sadik Armagan1625efc2021-06-10 18:24:34 +0100574 CHECK(mockBackEndProfilingContext);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000575 armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
576 mockBackEndProfilingContext->GetBackendProfiling();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100577 CHECK(backendProfilingIface);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000578
579 // Get the Guid generator and check the getting two Guid's results in the second being greater than the first.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000580 IProfilingGuidGenerator& guidGenerator = backendProfilingIface->GetProfilingGuidGenerator();
581 const ProfilingDynamicGuid& firstGuid = guidGenerator.NextGuid();
582 const ProfilingDynamicGuid& secondGuid = guidGenerator.NextGuid();
Sadik Armagan1625efc2021-06-10 18:24:34 +0100583 CHECK(secondGuid > firstGuid);
Colm Donelanfcb802b2020-02-13 20:47:08 +0000584
585 // Reset the profiling servie after the test.
586 options.m_ProfilingOptions.m_EnableProfiling = false;
Colm Donelanfcb802b2020-02-13 20:47:08 +0000587}
588
Sadik Armagan1625efc2021-06-10 18:24:34 +0100589}