From 7bfd38a721360183f3392f9ab35db18a0dd7fef8 Mon Sep 17 00:00:00 2001 From: Nikhil Raj Date: Fri, 19 Aug 2022 15:23:36 +0100 Subject: Update Doxygen for 22.08 Release Signed-off-by: Nikhil Raj Change-Id: I4789fe868e0492839be1482e5cee3642ed90d756 --- 22.08/classarmnn_1_1_profiler_impl.xhtml | 886 +++++++++++++++++++++++++++++++ 1 file changed, 886 insertions(+) create mode 100644 22.08/classarmnn_1_1_profiler_impl.xhtml (limited to '22.08/classarmnn_1_1_profiler_impl.xhtml') diff --git a/22.08/classarmnn_1_1_profiler_impl.xhtml b/22.08/classarmnn_1_1_profiler_impl.xhtml new file mode 100644 index 0000000000..3962ff4a29 --- /dev/null +++ b/22.08/classarmnn_1_1_profiler_impl.xhtml @@ -0,0 +1,886 @@ + + + + + + + + + + + + + +ArmNN: ProfilerImpl Class Reference + + + + + + + + + + + + + + + + +
+
+ + + + ArmNN + + + +
+
+  22.08 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+ +
+
ProfilerImpl Class Reference
+
+
+ +

#include <Profiling.hpp>

+ + + + + + +

+Classes

struct  Marker
 
struct  ProfilingEventStats
 
+ + + + + + + +

+Public Types

using InstrumentPtr = std::unique_ptr< Instrument >
 
using EventPtr = std::unique_ptr< Event >
 
using DescPtr = std::unique_ptr< ProfilingDetails >
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 ProfilerImpl ()
 
 ~ProfilerImpl ()
 
EventBeginEvent (armnn::IProfiler *profiler, const BackendId &backendId, const std::string &name, std::vector< InstrumentPtr > &&instruments, const Optional< arm::pipe::ProfilingGuid > &guid)
 
template<typename DescriptorType >
void AddLayerDetails (const std::string &label, const DescriptorType &desc, const WorkloadInfo &infos, const arm::pipe::ProfilingGuid guid)
 
void EndEvent (Event *event)
 
void EnableProfiling (bool enableProfiling)
 
bool IsProfilingEnabled ()
 
void EnableNetworkDetailsToStdOut (ProfilingDetailsMethod detailsMethod)
 
void UpdateEventTag ()
 
void AnalyzeEventsAndWriteResults (std::ostream &outStream) const
 
void Print (std::ostream &outStream) const
 
uint32_t GetEventColor (const BackendId &backendId) const
 
template<typename EventIterType >
void AnalyzeEventSequenceAndWriteResults (EventIterType first, EventIterType last, std::ostream &outStream) const
 
std::map< std::string, ProfilingEventStatsCalculateProfilingEventStats () const
 
void PopulateParent (std::vector< const Event *> &outEvents, int &outBaseLevel, std::string parentName) const
 
void PopulateDescendants (std::map< const Event *, std::vector< const Event *>> &outDescendantsMap) const
 
template<typename ItertType >
void AnalyzeEventSequenceAndWriteResults (ItertType first, ItertType last, std::ostream &outStream) const
 
+ + + + + + + + + + + +

+Public Attributes

std::stack< Event * > m_Parents
 
std::vector< EventPtrm_EventSequence
 
DescPtr m_ProfilingDetails = std::make_unique<ProfilingDetails>()
 
bool m_ProfilingEnabled
 
ProfilingDetailsMethod m_DetailsToStdOutMethod
 
+

Detailed Description

+
+

Definition at line 29 of file Profiling.hpp.

+

Member Typedef Documentation

+ +

◆ DescPtr

+ +
+
+ + + + +
using DescPtr = std::unique_ptr<ProfilingDetails>
+
+ +

Definition at line 79 of file Profiling.hpp.

+ +
+
+ +

◆ EventPtr

+ +
+
+ + + + +
using EventPtr = std::unique_ptr<Event>
+
+ +

Definition at line 78 of file Profiling.hpp.

+ +
+
+ +

◆ InstrumentPtr

+ +
+
+ + + + +
using InstrumentPtr = std::unique_ptr<Instrument>
+
+ +

Definition at line 34 of file Profiling.hpp.

+ +
+
+

Constructor & Destructor Documentation

+ +

◆ ProfilerImpl()

+ +
+
+ + + + + + + +
ProfilerImpl ()
+
+ +

Definition at line 164 of file Profiling.cpp.

+ +

References ProfilerImpl::m_EventSequence.

+
165  : m_ProfilingEnabled(false),
167 {
169 
170 #if ARMNN_STREAMLINE_ENABLED
171  // Initialises streamline annotations.
172  ANNOTATE_SETUP;
173 #endif
174 }
constexpr std::size_t g_ProfilingEventCountHint
Definition: Profiling.cpp:29
+ +
ProfilingDetailsMethod m_DetailsToStdOutMethod
Definition: Profiling.hpp:105
+ +
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ ~ProfilerImpl()

+ +
+
+ + + + + + + +
~ProfilerImpl ()
+
+ +

Definition at line 176 of file Profiling.cpp.

+ +

References ProfilerManager::GetInstance(), ProfilerImpl::m_ProfilingEnabled, ProfilerImpl::Print(), and ProfilerManager::RegisterProfiler().

+
177 {
178  if (m_ProfilingEnabled)
179  {
181  {
182  Print(std::cout);
183  }
184  }
185 
186  // Un-register this profiler from the current thread.
188 }
constexpr bool g_WriteReportToStdOutOnProfilerDestruction
Definition: Profiling.cpp:41
+
static ProfilerManager & GetInstance()
Definition: Profiling.cpp:572
+
void Print(std::ostream &outStream) const
Definition: Profiling.cpp:360
+ +
void RegisterProfiler(IProfiler *profiler)
Definition: Profiling.cpp:579
+
+
+
+

Member Function Documentation

+ +

◆ AddLayerDetails()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void AddLayerDetails (const std::string & label,
const DescriptorType & desc,
const WorkloadInfoinfos,
const arm::pipe::ProfilingGuid guid 
)
+
+inline
+
+
+ +

◆ AnalyzeEventsAndWriteResults()

+ +
+
+ + + + + + + + +
void AnalyzeEventsAndWriteResults (std::ostream & outStream) const
+
+ +

Definition at line 460 of file Profiling.cpp.

+ +

References ProfilerImpl::AnalyzeEventSequenceAndWriteResults(), armnn::CalcLevel(), ProfilerImpl::m_EventSequence, ProfilerImpl::m_Parents, ProfilerImpl::PopulateDescendants(), and ProfilerImpl::PopulateParent().

+ +

Referenced by ProfilerImpl::AddLayerDetails().

+
461 {
462  // Stack should be empty now.
463  const bool saneMarkerSequence = m_Parents.empty();
464 
465  // Abort if the sequence of markers was found to have incorrect information:
466  // The stats cannot be trusted.
467  if (!saneMarkerSequence)
468  {
469  outStream << "Cannot write profiling stats. "
470  "Unexpected errors were found when analyzing the sequence of logged events, "
471  "which may lead to plainly wrong stats. The profiling system may contain implementation "
472  "issues or could have been used in an unsafe manner." << std::endl;
473  return;
474  }
475 
476  // Analyzes the full sequence of events.
478  m_EventSequence.cend(),
479  outStream);
480 
481  // Aggregates events by tag if requested (spams the output stream if done for all tags).
483  {
484  outStream << std::endl;
485  outStream << "***" << std::endl;
486  outStream << "*** Per Inference Stats" << std::endl;
487  outStream << "***" << std::endl;
488  outStream << std::endl;
489 
490  int baseLevel = -1;
491  std::vector<const Event*> inferences;
492  PopulateParent(inferences, baseLevel, "EnqueueWorkload");
493 
494  // Second map out descendants hierarchy
495  std::map<const Event*, std::vector<const Event*>> descendantsMap;
496  PopulateDescendants(descendantsMap);
497 
498  std::function<void(const Event*, std::vector<const Event*>&)>
499  FindDescendantEvents = [&](const Event* eventPtr, std::vector<const Event*>& sequence)
500  {
501  sequence.push_back(eventPtr);
502 
503  if (CalcLevel(eventPtr) > baseLevel+2) //We only care about levels as deep as workload executions.
504  {
505  return;
506  }
507 
508  auto children = descendantsMap.find(eventPtr);
509  if (children == descendantsMap.end())
510  {
511  return;
512  }
513 
514  if (!(children->second.empty()))
515  {
516  return FindDescendantEvents(children->second[0], sequence);
517  }
518  };
519 
520  // Third, find events belonging to each inference
521  int inferenceIdx = 0;
522  for (auto inference : inferences)
523  {
524  std::vector<const Event*> sequence;
525 
526  //build sequence, depth first
527  FindDescendantEvents(inference, sequence);
528 
529  outStream << "> Begin Inference: " << inferenceIdx << std::endl;
530  outStream << std::endl;
531  AnalyzeEventSequenceAndWriteResults(sequence.cbegin(),
532  sequence.cend(),
533  outStream);
534  outStream << std::endl;
535  outStream << "> End Inference: " << inferenceIdx << std::endl;
536 
537  inferenceIdx++;
538  }
539  }
540 }
int CalcLevel(const Event *eventPtr)
Definition: Profiling.cpp:246
+
void AnalyzeEventSequenceAndWriteResults(EventIterType first, EventIterType last, std::ostream &outStream) const
+
void PopulateParent(std::vector< const Event *> &outEvents, int &outBaseLevel, std::string parentName) const
Definition: Profiling.cpp:257
+
constexpr bool g_AggregateProfilingEventsByInference
Definition: Profiling.cpp:37
+ +
std::stack< Event * > m_Parents
Definition: Profiling.hpp:101
+
void PopulateDescendants(std::map< const Event *, std::vector< const Event *>> &outDescendantsMap) const
Definition: Profiling.cpp:271
+
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ AnalyzeEventSequenceAndWriteResults() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void AnalyzeEventSequenceAndWriteResults (EventIterType first,
EventIterType last,
std::ostream & outStream 
) const
+
+
+ +

◆ AnalyzeEventSequenceAndWriteResults() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void AnalyzeEventSequenceAndWriteResults (ItertType first,
ItertType last,
std::ostream & outStream 
) const
+
+ +

Definition at line 113 of file Profiling.cpp.

+ +

References ProfilerImpl::CalculateProfilingEventStats(), armnn::FindMeasurement(), BackendId::Get(), Event::GetBackendId(), armnn::GetEventPtr(), Event::GetName(), ProfilerImpl::ProfilingEventStats::m_Count, ProfilerImpl::ProfilingEventStats::m_MaxMs, ProfilerImpl::ProfilingEventStats::m_MinMs, ProfilerImpl::ProfilingEventStats::m_TotalMs, Measurement::m_Value, WallClockTimer::WALL_CLOCK_TIME, WallClockTimer::WALL_CLOCK_TIME_START, and WallClockTimer::WALL_CLOCK_TIME_STOP.

+
114 {
115  // Outputs event sequence, if needed.
117  {
118  // Makes sure timestamps are output with 6 decimals, and save old settings.
119  std::streamsize oldPrecision = outStream.precision();
120  outStream.precision(6);
121  std::ios_base::fmtflags oldFlags = outStream.flags();
122  outStream.setf(std::ios::fixed);
123  // Outputs fields.
124  outStream << "Event Sequence - Name | Duration (ms) | Start (ms) | Stop (ms) | Device" << std::endl;
125  for (auto event = first; event != last; ++event)
126  {
127  const Event* eventPtr = GetEventPtr((*event));
128  double startTimeMs = FindMeasurement(WallClockTimer::WALL_CLOCK_TIME_START, eventPtr).m_Value;
129  double stopTimeMs = FindMeasurement(WallClockTimer::WALL_CLOCK_TIME_STOP, eventPtr).m_Value;
130 
131  // Find the WallClock measurement if there is one.
132  double durationMs = FindMeasurement(WallClockTimer::WALL_CLOCK_TIME, eventPtr).m_Value;
133  outStream << std::setw(50) << eventPtr->GetName() << " "
134  << std::setw(20) << durationMs
135  << std::setw(20) << startTimeMs
136  << std::setw(20) << stopTimeMs
137  << std::setw(20) << eventPtr->GetBackendId().Get()
138  << std::endl;
139  }
140  outStream << std::endl;
141  // Restores previous precision settings.
142  outStream.flags(oldFlags);
143  outStream.precision(oldPrecision);
144  }
145 
146  // Aggregates results per event name.
147  std::map<std::string, ProfilingEventStats> nameToStatsMap = CalculateProfilingEventStats();
148 
149  // Outputs aggregated stats.
150  outStream << "Event Stats - Name | Avg (ms) | Min (ms) | Max (ms) | Total (ms) | Count" << std::endl;
151  for (const auto& pair : nameToStatsMap)
152  {
153  const std::string& eventLabel = pair.first;
154  const ProfilingEventStats& eventStats = pair.second;
155  const double avgMs = eventStats.m_TotalMs / double(eventStats.m_Count);
156 
157  outStream << "\t" << std::setw(50) << eventLabel << " " << std::setw(9) << avgMs << " "
158  << std::setw(9) << eventStats.m_MinMs << " " << std::setw(9) << eventStats.m_MaxMs << " "
159  << std::setw(9) << eventStats.m_TotalMs << " " << std::setw(9) << eventStats.m_Count << std::endl;
160  }
161  outStream << std::endl;
162 }
const Event * GetEventPtr(const Event *ptr)
Definition: Profiling.cpp:109
+
Measurement FindMeasurement(const std::string &name, const Event *event)
Definition: Profiling.cpp:43
+
std::map< std::string, ProfilingEventStats > CalculateProfilingEventStats() const
Definition: Profiling.cpp:82
+
static const std::string WALL_CLOCK_TIME_STOP
+
static const std::string WALL_CLOCK_TIME_START
+
static const std::string WALL_CLOCK_TIME
+
constexpr bool g_WriteProfilingEventSequence
Definition: Profiling.cpp:32
+ + +
+
+
+ +

◆ BeginEvent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Event * BeginEvent (armnn::IProfilerprofiler,
const BackendIdbackendId,
const std::string & name,
std::vector< InstrumentPtr > && instruments,
const Optional< arm::pipe::ProfilingGuid > & guid 
)
+
+ +

Definition at line 205 of file Profiling.cpp.

+ +

References ProfilerImpl::GetEventColor(), ProfilerImpl::m_EventSequence, and ProfilerImpl::m_Parents.

+
210 {
211  Event* parent = m_Parents.empty() ? nullptr : m_Parents.top();
212  m_EventSequence.push_back(std::make_unique<Event>(label,
213  profiler,
214  parent,
215  backendId,
216  std::move(instruments),
217  guid));
218  Event* event = m_EventSequence.back().get();
219  event->Start();
220 
221 #if ARMNN_STREAMLINE_ENABLED
222  ANNOTATE_CHANNEL_COLOR(uint32_t(m_Parents.size()), GetEventColor(backendId), label.c_str());
223 #endif
224 
225  m_Parents.push(event);
226  return event;
227 }
uint32_t GetEventColor(const BackendId &backendId) const
Definition: Profiling.cpp:542
+ +
std::stack< Event * > m_Parents
Definition: Profiling.hpp:101
+
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ CalculateProfilingEventStats()

+ +
+
+ + + + + + + +
std::map< std::string, ProfilerImpl::ProfilingEventStats > CalculateProfilingEventStats () const
+
+ +

Definition at line 82 of file Profiling.cpp.

+ +

References armnn::FindMeasurement(), ProfilerImpl::ProfilingEventStats::m_Count, ProfilerImpl::m_EventSequence, ProfilerImpl::ProfilingEventStats::m_MaxMs, ProfilerImpl::ProfilingEventStats::m_MinMs, ProfilerImpl::ProfilingEventStats::m_TotalMs, Measurement::m_Value, and WallClockTimer::WALL_CLOCK_TIME.

+ +

Referenced by ProfilerImpl::AnalyzeEventSequenceAndWriteResults().

+
83 {
84  std::map<std::string, ProfilingEventStats> nameToStatsMap;
85 
86  for (const auto& event : m_EventSequence)
87  {
89 
90  double durationMs = measurement.m_Value;
91  auto it = nameToStatsMap.find(event->GetName());
92  if (it != nameToStatsMap.end())
93  {
94  ProfilingEventStats& stats = it->second;
95  stats.m_TotalMs += durationMs;
96  stats.m_MinMs = std::min(stats.m_MinMs, durationMs);
97  stats.m_MaxMs = std::max(stats.m_MaxMs, durationMs);
98  ++stats.m_Count;
99  }
100  else
101  {
102  nameToStatsMap.emplace(event->GetName(), ProfilingEventStats{ durationMs, durationMs, durationMs, 1 });
103  }
104  }
105 
106  return nameToStatsMap;
107 }
Measurement FindMeasurement(const std::string &name, const Event *event)
Definition: Profiling.cpp:43
+
static const std::string WALL_CLOCK_TIME
+ + +
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ EnableNetworkDetailsToStdOut()

+ +
+
+ + + + + + + + +
void EnableNetworkDetailsToStdOut (ProfilingDetailsMethod detailsMethod)
+
+ +

Definition at line 200 of file Profiling.cpp.

+ +

References ProfilerImpl::m_DetailsToStdOutMethod.

+ +

Referenced by ProfilerImpl::AddLayerDetails().

+
201 {
202  m_DetailsToStdOutMethod = details;
203 }
ProfilingDetailsMethod m_DetailsToStdOutMethod
Definition: Profiling.hpp:105
+
+
+
+ +

◆ EnableProfiling()

+ +
+
+ + + + + + + + +
void EnableProfiling (bool enableProfiling)
+
+ +

Definition at line 195 of file Profiling.cpp.

+ +

References ProfilerImpl::m_ProfilingEnabled.

+ +

Referenced by ProfilerImpl::AddLayerDetails().

+
196 {
197  m_ProfilingEnabled = enableProfiling;
198 }
+
+
+
+ +

◆ EndEvent()

+ +
+
+ + + + + + + + +
void EndEvent (Eventevent)
+
+ +

Definition at line 229 of file Profiling.cpp.

+ +

References ARMNN_ASSERT, Event::GetParentEvent(), armnn::IgnoreUnused(), and ProfilerImpl::m_Parents.

+ +

Referenced by ProfilerImpl::AddLayerDetails().

+
230 {
231  event->Stop();
232 
233  ARMNN_ASSERT(!m_Parents.empty());
234  ARMNN_ASSERT(event == m_Parents.top());
235  m_Parents.pop();
236 
237  Event* parent = m_Parents.empty() ? nullptr : m_Parents.top();
238  IgnoreUnused(parent);
239  ARMNN_ASSERT(event->GetParentEvent() == parent);
240 
241 #if ARMNN_STREAMLINE_ENABLED
242  ANNOTATE_CHANNEL_END(uint32_t(m_Parents.size()));
243 #endif
244 }
void IgnoreUnused(Ts &&...)
+
#define ARMNN_ASSERT(COND)
Definition: Assert.hpp:14
+ +
std::stack< Event * > m_Parents
Definition: Profiling.hpp:101
+
+
+
+ +

◆ GetEventColor()

+ +
+
+ + + + + + + + +
std::uint32_t GetEventColor (const BackendIdbackendId) const
+
+ +

Definition at line 542 of file Profiling.cpp.

+ +

Referenced by ProfilerImpl::AddLayerDetails(), and ProfilerImpl::BeginEvent().

+
543 {
544  static BackendId cpuRef("CpuRef");
545  static BackendId cpuAcc("CpuAcc");
546  static BackendId gpuAcc("GpuAcc");
547  if (backendId == cpuRef)
548  {
549  // Cyan
550  return 0xffff001b;
551  }
552  else if (backendId == cpuAcc)
553  {
554  // Green
555  return 0x00ff001b;
556  }
557  else if (backendId == gpuAcc)
558  {
559  // Purple
560  return 0xff007f1b;
561  }
562  else
563  {
564  // Dark gray
565  return 0x5555551b;
566  }
567 }
+
+
+ +

◆ IsProfilingEnabled()

+ +
+
+ + + + + + + +
bool IsProfilingEnabled ()
+
+ +

Definition at line 190 of file Profiling.cpp.

+ +

References ProfilerImpl::m_ProfilingEnabled.

+ +

Referenced by ProfilerImpl::AddLayerDetails().

+
191 {
192  return m_ProfilingEnabled;
193 }
+
+
+
+ +

◆ PopulateDescendants()

+ +
+
+ + + + + + + + +
void PopulateDescendants (std::map< const Event *, std::vector< const Event *>> & outDescendantsMap) const
+
+ +

Definition at line 271 of file Profiling.cpp.

+ +

References Event::GetParentEvent(), and ProfilerImpl::m_EventSequence.

+ +

Referenced by ProfilerImpl::AnalyzeEventsAndWriteResults(), and ProfilerImpl::Print().

+
272 {
273  for (const auto& event : m_EventSequence)
274  {
275  const Event* eventPtrRaw = event.get();
276  const Event* parent = eventPtrRaw->GetParentEvent();
277 
278  if (!parent)
279  {
280  continue;
281  }
282 
283  auto it = outDescendantsMap.find(parent);
284  if (it == outDescendantsMap.end())
285  {
286  outDescendantsMap.emplace(parent, std::vector<const Event*>({ eventPtrRaw }));
287  }
288  else
289  {
290  it->second.push_back(eventPtrRaw);
291  }
292  }
293 }
+
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ PopulateParent()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
void PopulateParent (std::vector< const Event *> & outEvents,
int & outBaseLevel,
std::string parentName 
) const
+
+ +

Definition at line 257 of file Profiling.cpp.

+ +

References armnn::CalcLevel(), Event::GetName(), and ProfilerImpl::m_EventSequence.

+ +

Referenced by ProfilerImpl::AnalyzeEventsAndWriteResults(), and ProfilerImpl::Print().

+
258 {
259  outEvents.reserve(m_EventSequence.size());
260  for (const auto& event : m_EventSequence)
261  {
262  const Event* eventPtrRaw = event.get();
263  if (eventPtrRaw->GetName() == parentName)
264  {
265  outBaseLevel = (outBaseLevel == -1) ? CalcLevel(eventPtrRaw) : outBaseLevel;
266  outEvents.push_back(eventPtrRaw);
267  }
268  }
269 }
int CalcLevel(const Event *eventPtr)
Definition: Profiling.cpp:246
+ +
std::vector< EventPtr > m_EventSequence
Definition: Profiling.hpp:102
+
+
+
+ +

◆ Print()

+ +
+
+ + + + + + + + +
void Print (std::ostream & outStream) const
+
+ +

Definition at line 360 of file Profiling.cpp.

+ +

References armnn::DetailsOnly, armnn::DetailsWithEvents, JsonChildObject::EnableDetailsOnly(), armnn::ExecObjectDesc, armnn::ExtractJsonObjects(), ProfilerImpl::m_DetailsToStdOutMethod, ProfilerImpl::m_ProfilingDetails, ProfilerImpl::PopulateDescendants(), ProfilerImpl::PopulateParent(), JsonUtils::PrintArmNNHeader(), JsonUtils::PrintFooter(), JsonUtils::PrintHeader(), JsonPrinter::PrintJsonChildObject(), JsonUtils::PrintNewLine(), and JsonUtils::PrintSeparator().

+ +

Referenced by ProfilerImpl::AddLayerDetails(), and ProfilerImpl::~ProfilerImpl().

+
361 {
362  // Makes sure timestamps are output with 6 decimals, and save old settings.
363  std::streamsize oldPrecision = outStream.precision();
364  outStream.precision(6);
365  std::ios_base::fmtflags oldFlags = outStream.flags();
366  outStream.setf(std::ios::fixed);
367  JsonPrinter printer(outStream);
368 
369  // First find all the parent Events and print out duration measurements.
370  int baseLevel = -1;
371 
372  std::vector<const Event*> optimizations;
373  PopulateParent(optimizations, baseLevel, "Optimizer");
374 
375  std::vector<const Event*> loadedNetworks;
376  PopulateParent(loadedNetworks, baseLevel, "LoadedNetwork");
377 
378  std::vector<const Event*> inferences;
379  PopulateParent(inferences, baseLevel, "EnqueueWorkload");
380 
381  // Second map out descendants hierarchy
382  std::map<const Event*, std::vector<const Event*>> descendantsMap;
383  PopulateDescendants(descendantsMap);
384 
385  // Extract json objects for each parent event type
386  JsonChildObject optimizeObject{ "optimize_measurements" };
387 
388  for (unsigned int optimizeIndex = 0; optimizeIndex < optimizations.size(); ++optimizeIndex)
389  {
390  auto optimization = optimizations[optimizeIndex];
391  ExtractJsonObjects(optimizeIndex, optimization, optimizeObject, descendantsMap);
392  }
393 
394  JsonChildObject loadedNetworkObject{ "loaded_network_measurements" };
395 
396  for (unsigned int loadedNetworkIndex = 0; loadedNetworkIndex < loadedNetworks.size(); ++loadedNetworkIndex)
397  {
398  auto loadedNetwork = loadedNetworks[loadedNetworkIndex];
399  ExtractJsonObjects(loadedNetworkIndex, loadedNetwork, loadedNetworkObject, descendantsMap);
400  }
401 
402  JsonChildObject inferenceObject{ "inference_measurements" };
403 
404  for (unsigned int inferenceIndex = 0; inferenceIndex < inferences.size(); ++inferenceIndex)
405  {
406  auto inference = inferences[inferenceIndex];
407  ExtractJsonObjects(inferenceIndex, inference, inferenceObject, descendantsMap);
408  }
409 
410  printer.PrintHeader();
411  printer.PrintArmNNHeader();
412 
413  if (m_ProfilingDetails.get()->DetailsExist() &&
416  {
417  JsonChildObject detailsObject{ "layer_details" };
419  {
420  detailsObject.EnableDetailsOnly();
421  }
422  detailsObject.SetType(JsonObjectType::ExecObjectDesc);
423  detailsObject.SetAndParseDetails(m_ProfilingDetails.get()->GetProfilingDetails());
424 
425  size_t id = 0;
426  printer.PrintJsonChildObject(detailsObject, id);
427  }
428 
429  // print inference object, also prints child layer and kernel measurements
430  size_t id = 0;
432  {
433  printer.PrintJsonChildObject(optimizeObject, id);
434  printer.PrintSeparator();
435  printer.PrintNewLine();
436  printer.PrintJsonChildObject(loadedNetworkObject, id);
437  printer.PrintSeparator();
438  printer.PrintNewLine();
439  printer.PrintJsonChildObject(inferenceObject, id);
440  printer.PrintNewLine();
441  }
442  // end of ArmNN
443  printer.PrintFooter();
444 
445  // end of main JSON object
446  printer.PrintNewLine();
447  printer.PrintFooter();
448  printer.PrintNewLine();
449 
450  // Restores previous precision settings.
451  outStream.flags(oldFlags);
452  outStream.precision(oldPrecision);
453 
455  {
456  exit(0);
457  }
458 }
+ +
void ExtractJsonObjects(unsigned int inferenceIndex, const Event *parentEvent, JsonChildObject &parentObject, std::map< const Event *, std::vector< const Event *>> descendantsMap)
Definition: Profiling.cpp:303
+
void PopulateParent(std::vector< const Event *> &outEvents, int &outBaseLevel, std::string parentName) const
Definition: Profiling.cpp:257
+ +
ProfilingDetailsMethod m_DetailsToStdOutMethod
Definition: Profiling.hpp:105
+
DescPtr m_ProfilingDetails
Definition: Profiling.hpp:103
+
void PopulateDescendants(std::map< const Event *, std::vector< const Event *>> &outDescendantsMap) const
Definition: Profiling.cpp:271
+
+
+
+ +

◆ UpdateEventTag()

+ +
+
+ + + + + + + +
void UpdateEventTag ()
+
+ +

Referenced by ProfilerImpl::AddLayerDetails().

+ +
+
+

Member Data Documentation

+ +

◆ m_DetailsToStdOutMethod

+ +
+
+ + + + +
ProfilingDetailsMethod m_DetailsToStdOutMethod
+
+ +

Definition at line 105 of file Profiling.hpp.

+ +

Referenced by ProfilerImpl::EnableNetworkDetailsToStdOut(), and ProfilerImpl::Print().

+ +
+
+ +

◆ m_EventSequence

+ + + +

◆ m_Parents

+ +
+
+ + + + +
std::stack<Event*> m_Parents
+
+
+ +

◆ m_ProfilingDetails

+ +
+
+ + + + +
DescPtr m_ProfilingDetails = std::make_unique<ProfilingDetails>()
+
+ +

Definition at line 103 of file Profiling.hpp.

+ +

Referenced by ProfilerImpl::AddLayerDetails(), and ProfilerImpl::Print().

+ +
+
+ +

◆ m_ProfilingEnabled

+ +
+
+ + + + +
bool m_ProfilingEnabled
+
+
+
The documentation for this class was generated from the following files: +
+
+ + + + -- cgit v1.2.1