ArmNN
 22.08
BackendProfilingTests.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
7 #include "MockBackendId.hpp"
9 
10 #include <TestUtils.hpp>
11 
12 #include <armnn/BackendId.hpp>
13 #include <armnn/Logging.hpp>
14 
16 
18 
20 
21 #include <client/include/CounterIdMap.hpp>
22 #include <client/include/Holder.hpp>
23 #include <client/include/ISendTimelinePacket.hpp>
24 #include <client/include/ProfilingOptions.hpp>
25 
26 #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 
34 #include <common/include/CounterDirectory.hpp>
35 #include <common/include/PacketVersionResolver.hpp>
36 
37 #include <doctest/doctest.h>
38 
39 #include <vector>
40 #include <cstdint>
41 #include <limits>
42 
43 namespace arm
44 {
45 
46 namespace pipe
47 {
48 
49 struct LogLevelSwapper
50 {
51 public:
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 
68 using namespace arm::pipe;
69 
70 class ReadCounterVals : public IReadCounterValues
71 {
72  virtual bool IsCounterRegistered(uint16_t counterUid) const override
73  {
74  return (counterUid > 4 && counterUid < 11);
75  }
76  virtual bool IsCounterRegistered(const std::string& counterName) const override
77  {
78  armnn::IgnoreUnused(counterName);
79  return false;
80  }
81  virtual uint16_t GetCounterCount() const override
82  {
83  return 1;
84  }
85  virtual uint32_t GetAbsoluteCounterValue(uint16_t counterUid) const override
86  {
87  return counterUid;
88  }
89  virtual uint32_t GetDeltaCounterValue(uint16_t counterUid) override
90  {
91  return counterUid;
92  }
93 };
94 
95 class MockBackendSendCounterPacket : public ISendCounterPacket
96 {
97 public:
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  {
106  armnn::IgnoreUnused(counterDirectory);
107  }
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  {
119  armnn::IgnoreUnused(capturePeriod);
120  armnn::IgnoreUnused(selectedCounterIds);
121  }
122 
123  std::vector<Timestamp> GetTimestamps()
124  {
125  return m_timestamps;
126  }
127 
128  void ClearTimestamps()
129  {
130  m_timestamps.clear();
131  }
132 
133 private:
134  std::vector<Timestamp> m_timestamps;
135 };
136 
137 arm::pipe::Packet PacketWriter(uint32_t period, std::vector<uint16_t> countervalues)
138 {
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 
156 TEST_SUITE("BackendProfilingTestSuite")
157 {
158 TEST_CASE("BackendProfilingCounterRegisterMockBackendTest")
159 {
160  arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
161 
162  // Reset the profiling service to the uninitialized state
164  options.m_ProfilingOptions.m_EnableProfiling = true;
165 
166  armnn::MockBackendInitialiser initialiser;
167  // Create a runtime
168  armnn::RuntimeImpl runtime(options);
169 
170  unsigned int shiftedId = 0;
171 
172  if (armnn::BackendRegistry().IsBackendRegistered("EthosNAcc"))
173  {
174  shiftedId = 4;
175  }
176 
177  // Check if the MockBackends 3 dummy counters {0, 1, 2-5 (four cores)} are registered
179  const ICounterMappings& counterMap = GetProfilingService(&runtime).GetCounterMappings();
180  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);
186  options.m_ProfilingOptions.m_EnableProfiling = false;
187  GetProfilingService(&runtime).ResetExternalProfilingOptions(
189 }
190 
191 TEST_CASE("TestBackendCounters")
192 {
193  arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
194 
195  Holder holder;
196  arm::pipe::PacketVersionResolver packetVersionResolver;
197  ProfilingStateMachine stateMachine;
198  ReadCounterVals readCounterVals;
199  CounterIdMap counterIdMap;
200  MockBackendSendCounterPacket sendCounterPacket;
201 
202  const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
203  const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
204 
205  ProfilingOptions options;
206  options.m_EnableProfiling = true;
207 
209  std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
210  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);
215 
216  std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
217  std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
218  std::unique_ptr<IBackendProfiling> gpuBackendProfilingPtr =
219  std::make_unique<BackendProfiling>(options, *profilingService.get(), gpuAccId);
220 
221  std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
222  std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
223  std::shared_ptr<IBackendProfilingContext> gpuProfilingContextPtr =
224  std::make_shared<armnn::MockBackendProfilingContext>(gpuBackendProfilingPtr);
225 
226  std::unordered_map<std::string,
227  std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
228 
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 
275  std::set<std::string> activeIds = holder.GetCaptureData().GetActiveBackends();
276  CHECK(activeIds.size() == 1);
277  CHECK((activeIds.find(gpuAccId) != activeIds.end()));
278 
279  std::vector<Timestamp> recievedTimestamp = sendCounterPacket.GetTimestamps();
280 
281  CHECK(recievedTimestamp[0].timestamp == period);
282  CHECK(recievedTimestamp.size() == 1);
283  CHECK(recievedTimestamp[0].counterValues.size() == gpuCounters.size());
284  for (unsigned long i=0; i< gpuCounters.size(); ++i)
285  {
286  CHECK(recievedTimestamp[0].counterValues[i].counterId == gpuCounters[i]);
287  CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
288  }
289  sendCounterPacket.ClearTimestamps();
290 
291  // Request only cpu counters
292  periodicCounterSelectionCommandHandler(PacketWriter(period, cpuCounters));
293  periodicCounterCapture.Stop();
294 
295  activeIds = holder.GetCaptureData().GetActiveBackends();
296  CHECK(activeIds.size() == 1);
297  CHECK((activeIds.find(cpuAccId) != activeIds.end()));
298 
299  recievedTimestamp = sendCounterPacket.GetTimestamps();
300 
301  CHECK(recievedTimestamp[0].timestamp == period);
302  CHECK(recievedTimestamp.size() == 1);
303  CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
304  for (unsigned long i=0; i< cpuCounters.size(); ++i)
305  {
306  CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
307  CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
308  }
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();
318  CHECK(activeIds.size() == 2);
319  CHECK((activeIds.find(cpuAccId) != activeIds.end()));
320  CHECK((activeIds.find(gpuAccId) != activeIds.end()));
321 
322  recievedTimestamp = sendCounterPacket.GetTimestamps();
323 //
324  CHECK(recievedTimestamp[0].timestamp == period);
325  CHECK(recievedTimestamp[1].timestamp == period);
326 
327  CHECK(recievedTimestamp.size() == 2);
328  CHECK(recievedTimestamp[0].counterValues.size() == 2);
329  CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
330 
331  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);
335 
336  for (unsigned long i=0; i< gpuCounters.size(); ++i)
337  {
338  CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
339  CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
340  }
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();
353  CHECK(activeIds.size() == 2);
354  CHECK((activeIds.find(cpuAccId) != activeIds.end()));
355  CHECK((activeIds.find(gpuAccId) != activeIds.end()));
356 
357  recievedTimestamp = sendCounterPacket.GetTimestamps();
358 
359  CHECK(recievedTimestamp[0].counterValues.size() == cpuCounters.size());
360  for (unsigned long i=0; i< cpuCounters.size(); ++i)
361  {
362  CHECK(recievedTimestamp[0].counterValues[i].counterId == cpuCounters[i]);
363  CHECK(recievedTimestamp[0].counterValues[i].counterValue == i + 1u);
364  }
365 
366  CHECK(recievedTimestamp[1].counterValues.size() == gpuCounters.size());
367  for (unsigned long i=0; i< gpuCounters.size(); ++i)
368  {
369  CHECK(recievedTimestamp[1].counterValues[i].counterId == gpuCounters[i]);
370  CHECK(recievedTimestamp[1].counterValues[i].counterValue == i + 1u);
371  }
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();
382  CHECK(activeIds.size() == 2);
383  CHECK((activeIds.find(cpuAccId) != activeIds.end()));
384  CHECK((activeIds.find(gpuAccId) != activeIds.end()));
385 
386  recievedTimestamp = sendCounterPacket.GetTimestamps();
387 
388  CHECK(recievedTimestamp.size() == 2);
389 
390  CHECK(recievedTimestamp[0].counterValues.size() == 2);
391 
392  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);
396 
397  CHECK(recievedTimestamp[1].counterValues.size() == 2);
398 
399  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);
403 
404  sendCounterPacket.ClearTimestamps();
405 
406  // Request no counters
407  periodicCounterSelectionCommandHandler(PacketWriter(period, {}));
408  periodicCounterCapture.Stop();
409 
410  activeIds = holder.GetCaptureData().GetActiveBackends();
411  CHECK(activeIds.size() == 0);
412 
413  recievedTimestamp = sendCounterPacket.GetTimestamps();
414  CHECK(recievedTimestamp.size() == 0);
415 
416  sendCounterPacket.ClearTimestamps();
417 
418  // Request period of zero
419  periodicCounterSelectionCommandHandler(PacketWriter(0, counterValues));
420  periodicCounterCapture.Stop();
421 
422  activeIds = holder.GetCaptureData().GetActiveBackends();
423  CHECK(activeIds.size() == 0);
424 
425  recievedTimestamp = sendCounterPacket.GetTimestamps();
426  CHECK(recievedTimestamp.size() == 0);
427 }
428 
429 TEST_CASE("TestBackendCounterLogging")
430 {
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 
441  { m_Stream.rdbuf(m_BackupBuffer); }
442 
443  private:
444  std::ostream &m_Stream;
445  std::streambuf *m_BackupBuffer;
446  };
447 
448  Holder holder;
449  arm::pipe::PacketVersionResolver packetVersionResolver;
450  ProfilingStateMachine stateMachine;
451  ReadCounterVals readCounterVals;
452  StreamRedirector redirect(std::cout, ss.rdbuf());
453  CounterIdMap counterIdMap;
454  MockBackendSendCounterPacket sendCounterPacket;
455 
456  const std::string cpuAccId(GetComputeDeviceAsCString(armnn::Compute::CpuAcc));
457  const std::string gpuAccId(GetComputeDeviceAsCString(armnn::Compute::GpuAcc));
458 
459  ProfilingOptions options;
460  options.m_EnableProfiling = true;
461 
463  std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
464  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);
469 
470  std::unique_ptr<IBackendProfiling> cpuBackendProfilingPtr =
471  std::make_unique<BackendProfiling>(options, *profilingService.get(), cpuAccId);
472 
473  std::shared_ptr<IBackendProfilingContext> cpuProfilingContextPtr =
474  std::make_shared<armnn::MockBackendProfilingContext>(cpuBackendProfilingPtr);
475 
476  std::unordered_map<std::string,
477  std::shared_ptr<IBackendProfilingContext>> backendProfilingContexts;
478 
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 
506  arm::pipe::SetAllLoggingSinks(true, false, false);
507  arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Warning);
508  periodicCounterSelectionCommandHandler(PacketWriter(period, {5}));
509  periodicCounterCapture.Stop();
510  arm::pipe::SetLogFilter(arm::pipe::LogSeverity::Fatal);
511 
512  CHECK(ss.str().find("ActivateCounters example test error") != std::string::npos);
513 }
514 
515 TEST_CASE("BackendProfilingContextGetSendTimelinePacket")
516 {
517  arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
518 
519  // Reset the profiling service to the uninitialized state
521  options.m_ProfilingOptions.m_EnableProfiling = true;
522 
524  std::unique_ptr<IProfilingService> profilingService = arm::pipe::IProfilingService::CreateProfilingService(
525  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);
530 
531  profilingService->ConfigureProfilingService(
533 
534  armnn::MockBackendInitialiser initialiser;
535  // Create a runtime. During this the mock backend will be registered and context returned.
538  armnn::MockBackendProfilingContext* mockBackEndProfilingContext = mockProfilingService.GetContext();
539  // Check that there is a valid context set.
540  CHECK(mockBackEndProfilingContext);
541  armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
542  mockBackEndProfilingContext->GetBackendProfiling();
543  CHECK(backendProfilingIface);
544 
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.
547  std::unique_ptr<ISendTimelinePacket> timelinePacket =
548  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;
556  profilingService->ResetExternalProfilingOptions(
558 }
559 
560 TEST_CASE("GetProfilingGuidGenerator")
561 {
562  arm::pipe::LogLevelSwapper logLevelSwapper(arm::pipe::LogSeverity::Fatal);
563 
564  // Reset the profiling service to the uninitialized state
566  options.m_ProfilingOptions.m_EnableProfiling = true;
567 
568  armnn::MockBackendInitialiser initialiser;
569  // Create a runtime. During this the mock backend will be registered and context returned.
572  armnn::MockBackendProfilingContext *mockBackEndProfilingContext = mockProfilingService.GetContext();
573  // Check that there is a valid context set.
574  CHECK(mockBackEndProfilingContext);
575  armnn::IBackendInternal::IBackendProfilingPtr& backendProfilingIface =
576  mockBackEndProfilingContext->GetBackendProfiling();
577  CHECK(backendProfilingIface);
578 
579  // Get the Guid generator and check the getting two Guid's results in the second being greater than the first.
580  IProfilingGuidGenerator& guidGenerator = backendProfilingIface->GetProfilingGuidGenerator();
581  const ProfilingDynamicGuid& firstGuid = guidGenerator.NextGuid();
582  const ProfilingDynamicGuid& secondGuid = guidGenerator.NextGuid();
583  CHECK(secondGuid > firstGuid);
584 
585  // Reset the profiling servie after the test.
586  options.m_ProfilingOptions.m_EnableProfiling = false;
587 }
588 
589 }
static IRuntimePtr Create(const CreationOptions &options)
Definition: Runtime.cpp:49
void SetAllLoggingSinks(bool standardOut, bool debugOut, bool coloured)
Definition: Logging.cpp:191
void ConfigureLogging(bool printToStandardOutput, bool printToDebugOutput, LogSeverity severity)
Configures the logging behaviour of the ARMNN library.
Definition: Utils.cpp:18
std::unique_ptr< IRuntime, void(*)(IRuntime *runtime)> IRuntimePtr
Definition: IRuntime.hpp:33
constexpr const char * MockBackendId()
void IgnoreUnused(Ts &&...)
bool m_EnableProfiling
Indicates whether external profiling is enabled or not.
Definition: IRuntime.hpp:138
void SetLogFilter(LogSeverity level)
Definition: Logging.cpp:73
ProfilingOptions ConvertExternalProfilingOptions(const armnn::IRuntime::CreationOptions::ExternalProfilingOptions &options)
constexpr char const * GetComputeDeviceAsCString(Compute compute)
Deprecated function that will be removed together with the Compute enum.
Definition: BackendId.hpp:34
GPU Execution: OpenCL: ArmCompute.
static MockBackendProfilingService & Instance()
TEST_SUITE("BackendProfilingTestSuite")
arm::pipe::Packet PacketWriter(uint32_t period, std::vector< uint16_t > countervalues)
MockBackendProfilingContext * GetContext()
std::unique_ptr< arm::pipe::IBackendProfiling > IBackendProfilingPtr
CPU Execution: NEON: ArmCompute.
IBackendInternal::IBackendProfilingPtr & GetBackendProfiling()
ExternalProfilingOptions m_ProfilingOptions
Definition: IRuntime.hpp:153
arm::pipe::IProfilingService & GetProfilingService(armnn::RuntimeImpl *runtime)
Definition: TestUtils.cpp:59
LogSeverity
Definition: Utils.hpp:14