aboutsummaryrefslogtreecommitdiff
path: root/21.02/_profiling_8cpp_source.xhtml
blob: d534d678ad34e3b59300060dab12d15bfee26a98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
<!-- Copyright (c) 2020 ARM Limited. -->
<!--                                 -->
<!-- SPDX-License-Identifier: MIT    -->
<!--                                 -->
<!-- HTML header for doxygen 1.8.13-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="robots" content="NOINDEX, NOFOLLOW" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>ArmNN: src/armnn/Profiling.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/x-mathjax-config">
  MathJax.Hub.Config({
    extensions: ["tex2jax.js"],
    jax: ["input/TeX","output/HTML-CSS"],
});
</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <img alt="ArmNN" src="Arm_NN_horizontal_blue.png" style="max-width: 10rem; margin-top: .5rem; margin-left 10px"/>
  <td style="padding-left: 0.5em;">
   <div id="projectname">
   &#160;<span id="projectnumber">21.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_profiling_8cpp_source.xhtml','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Profiling.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_profiling_8cpp.xhtml">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno">    1</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00002"></a><span class="lineno">    2</span>&#160;<span class="comment">// Copyright © 2017 Arm Ltd. All rights reserved.</span></div><div class="line"><a name="l00003"></a><span class="lineno">    3</span>&#160;<span class="comment">// SPDX-License-Identifier: MIT</span></div><div class="line"><a name="l00004"></a><span class="lineno">    4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno">    5</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_profiling_8hpp.xhtml">Profiling.hpp</a>&quot;</span></div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;</div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_backend_id_8hpp.xhtml">armnn/BackendId.hpp</a>&gt;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_assert_8hpp.xhtml">armnn/utility/Assert.hpp</a>&gt;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_ignore_unused_8hpp.xhtml">armnn/utility/IgnoreUnused.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;</div><div class="line"><a name="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_json_printer_8hpp.xhtml">JsonPrinter.hpp</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;streamline_annotate.h&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#include &lt;algorithm&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;iomanip&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;iostream&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;fstream&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;map&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="preprocessor">#include &lt;stack&gt;</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;{</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;</div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;<span class="comment">// Controls the amount of memory initially allocated to store profiling events.</span></div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="comment">// If chosen carefully, the profiling system will not make any additional allocations, thus minimizing its impact on</span></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="comment">// measured times.</span></div><div class="line"><a name="l00030"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a43ecd194778b7653578044060ba8695e">   30</a></span>&#160;constexpr std::size_t <a class="code" href="namespacearmnn.xhtml#a43ecd194778b7653578044060ba8695e">g_ProfilingEventCountHint</a> = 1024;</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="comment">// Whether profiling reports should include the sequence of events together with their timings.</span></div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a41794552ff67b0dad16de60f9b8e7d7c">   33</a></span>&#160;constexpr <span class="keywordtype">bool</span> <a class="code" href="namespacearmnn.xhtml#a41794552ff67b0dad16de60f9b8e7d7c">g_WriteProfilingEventSequence</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="comment">// Whether profiling reports should also report detailed information on events grouped by inference.</span></div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="comment">// This can spam the output stream, so use carefully (or adapt the code to just output information</span></div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;<span class="comment">// of interest).</span></div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#aacc0d11e271ebbfcff9d613dd17604aa">   38</a></span>&#160;constexpr <span class="keywordtype">bool</span> <a class="code" href="namespacearmnn.xhtml#aacc0d11e271ebbfcff9d613dd17604aa">g_AggregateProfilingEventsByInference</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;<span class="comment">// Whether a call to Profiler::AnalyzeEventsAndWriteResults() will be made when the Profiler is destroyed.</span></div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;<span class="comment">// It can be convenient for local tests.</span></div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a6ce7e56eb10e440463f09eee8f213adc">   42</a></span>&#160;constexpr <span class="keywordtype">bool</span> <a class="code" href="namespacearmnn.xhtml#a6ce7e56eb10e440463f09eee8f213adc">g_WriteReportToStdOutOnProfilerDestruction</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">   44</a></span>&#160;<a class="code" href="structarmnn_1_1_measurement.xhtml">Measurement</a> <a class="code" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<span class="keyword">const</span> std::string&amp; name, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* event)</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;{</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(event != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    <span class="comment">// Search though the measurements.</span></div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; measurement : event-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#aa75e3a38ab9fee7b2ad5522e746ad0af">GetMeasurements</a>())</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    {</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;        <span class="keywordflow">if</span> (measurement.m_Name == name)</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;        {</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;            <span class="comment">// Measurement found.</span></div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;            <span class="keywordflow">return</span> measurement;</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        }</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;    }</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    <span class="comment">// Measurement not found.</span></div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="structarmnn_1_1_measurement.xhtml">Measurement</a>{ <span class="stringliteral">&quot;&quot;</span>, 0.f, Measurement::Unit::TIME_MS };</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;}</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;</div><div class="line"><a name="l00063"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a1b90db39f6a9ebd11591e76fa364b06f">   63</a></span>&#160;std::vector&lt;Measurement&gt; <a class="code" href="namespacearmnn.xhtml#a1b90db39f6a9ebd11591e76fa364b06f">FindKernelMeasurements</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* event)</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;{</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(event != <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    std::vector&lt;Measurement&gt; measurements;</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    <span class="comment">// Search through the measurements.</span></div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; measurement : event-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#aa75e3a38ab9fee7b2ad5522e746ad0af">GetMeasurements</a>())</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    {</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;        <span class="keywordflow">if</span> (measurement.m_Name.rfind(<span class="stringliteral">&quot;OpenClKernelTimer&quot;</span>, 0) == 0</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;            || measurement.m_Name.rfind(<span class="stringliteral">&quot;NeonKernelTimer&quot;</span>, 0) == 0)</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;        {</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;            <span class="comment">// Measurement found.</span></div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;            measurements.push_back(measurement);</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;        }</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;    }</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    <span class="keywordflow">return</span> measurements;</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;}</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;</div><div class="line"><a name="l00083"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a0c14f9e9a75d1279acb6a4ea036b5b33">   83</a></span>&#160;std::map&lt;std::string, ProfilerImpl::ProfilingEventStats&gt; <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a0c14f9e9a75d1279acb6a4ea036b5b33">ProfilerImpl::CalculateProfilingEventStats</a>()<span class="keyword"> const</span></div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;    std::map&lt;std::string, ProfilingEventStats&gt; nameToStatsMap;</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; event : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>)</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    {</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;        <a class="code" href="structarmnn_1_1_measurement.xhtml">Measurement</a> measurement = <a class="code" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.xhtml#aece42eedfcac1aa046e0dff4763b300a">WallClockTimer::WALL_CLOCK_TIME</a>, event.get());</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;        <span class="keywordtype">double</span> durationMs = measurement.<a class="code" href="structarmnn_1_1_measurement.xhtml#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;        <span class="keyword">auto</span> it = nameToStatsMap.find(event-&gt;GetName());</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;        <span class="keywordflow">if</span> (it != nameToStatsMap.end())</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;        {</div><div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;            <a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml">ProfilingEventStats</a>&amp; stats = it-&gt;second;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;            stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a987e938e13b0c6d0864b7473497816a2">m_TotalMs</a> += durationMs;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;            stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#acf82cb43aa8ac450a64249b1339edcd6">m_MinMs</a> = std::min(stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#acf82cb43aa8ac450a64249b1339edcd6">m_MinMs</a>, durationMs);</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;            stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a7a2e04ecfcc33687bd52a9f57bb3c73b">m_MaxMs</a> = std::max(stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a7a2e04ecfcc33687bd52a9f57bb3c73b">m_MaxMs</a>, durationMs);</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;            ++stats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a1bf817b905316b6a2e823652eb156e5e">m_Count</a>;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;        }</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;        {</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;            nameToStatsMap.emplace(event-&gt;GetName(), <a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml">ProfilingEventStats</a>{ durationMs, durationMs, durationMs, 1 });</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;        }</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    }</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    <span class="keywordflow">return</span> nameToStatsMap;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;}</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;</div><div class="line"><a name="l00110"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#ab03dcfb3b4019d8f58a67c41681951ae">  110</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* <a class="code" href="namespacearmnn.xhtml#ab03dcfb3b4019d8f58a67c41681951ae">GetEventPtr</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* ptr) { <span class="keywordflow">return</span> ptr;}</div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a4b1e2158af2aedd3f00d2121c45b0f93">  111</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* <a class="code" href="namespacearmnn.xhtml#ab03dcfb3b4019d8f58a67c41681951ae">GetEventPtr</a>(<span class="keyword">const</span> std::unique_ptr&lt;Event&gt;&amp; ptr) {<span class="keywordflow">return</span> ptr.get(); }</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<span class="keyword">template</span>&lt;<span class="keyword">typename</span> ItertType&gt;</div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a949493a67655a79249dffa9bac9a5d0b">  114</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ae9462da7222b5d3315271e64bae6740b">ProfilerImpl::AnalyzeEventSequenceAndWriteResults</a>(ItertType first, ItertType last, std::ostream&amp; outStream)<span class="keyword"> const</span></div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;    <span class="comment">// Outputs event sequence, if needed.</span></div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;    <span class="keywordflow">if</span> (g_WriteProfilingEventSequence)</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;    {</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;        <span class="comment">// Makes sure timestamps are output with 6 decimals, and save old settings.</span></div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;        std::streamsize oldPrecision = outStream.precision();</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        outStream.precision(6);</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;        std::ios_base::fmtflags oldFlags = outStream.flags();</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;        outStream.setf(std::ios::fixed);</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;        <span class="comment">// Outputs fields.</span></div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;Event Sequence - Name | Duration (ms) | Start (ms) | Stop (ms) | Device&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> event = first; <span class="keyword">event</span> != last; ++event)</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;        {</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* eventPtr = <a class="code" href="namespacearmnn.xhtml#ab03dcfb3b4019d8f58a67c41681951ae">GetEventPtr</a>((*event));</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;            <span class="keywordtype">double</span> startTimeMs = <a class="code" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.xhtml#aef02e15721d757f07f3812f09fc892d4">WallClockTimer::WALL_CLOCK_TIME_START</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.xhtml#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;            <span class="keywordtype">double</span> stopTimeMs = <a class="code" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.xhtml#abd358345fde773d79e57461c1b062703">WallClockTimer::WALL_CLOCK_TIME_STOP</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.xhtml#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;            <span class="comment">// Find the WallClock measurement if there is one.</span></div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;            <span class="keywordtype">double</span> durationMs = <a class="code" href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.xhtml#aece42eedfcac1aa046e0dff4763b300a">WallClockTimer::WALL_CLOCK_TIME</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.xhtml#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;            outStream &lt;&lt; std::setw(50) &lt;&lt; eventPtr-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#a55466a39638bb671b24a82941aa37d77">GetName</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;                      &lt;&lt; std::setw(20) &lt;&lt; durationMs</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;                      &lt;&lt; std::setw(20) &lt;&lt; startTimeMs</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;                      &lt;&lt; std::setw(20) &lt;&lt; stopTimeMs</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;                      &lt;&lt; std::setw(20) &lt;&lt; eventPtr-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#aa58c448afeade37f3b23f4842d46d9b5">GetBackendId</a>().<a class="code" href="classarmnn_1_1_backend_id.xhtml#af7445617163d3f07c47b92ae56c6cf8b">Get</a>()</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;                      &lt;&lt; std::endl;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;        }</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;        outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;        <span class="comment">// Restores previous precision settings.</span></div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;        outStream.flags(oldFlags);</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        outStream.precision(oldPrecision);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    }</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    <span class="comment">// Aggregates results per event name.</span></div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;    std::map&lt;std::string, ProfilingEventStats&gt; nameToStatsMap = <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a0c14f9e9a75d1279acb6a4ea036b5b33">CalculateProfilingEventStats</a>();</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    <span class="comment">// Outputs aggregated stats.</span></div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;    outStream &lt;&lt; <span class="stringliteral">&quot;Event Stats - Name | Avg (ms) | Min (ms) | Max (ms) | Total (ms) | Count&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; pair : nameToStatsMap)</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;    {</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;        <span class="keyword">const</span> std::string&amp; eventLabel = pair.first;</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;        <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml">ProfilingEventStats</a>&amp; eventStats = pair.second;</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">double</span> avgMs = eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a987e938e13b0c6d0864b7473497816a2">m_TotalMs</a> / double(eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a1bf817b905316b6a2e823652eb156e5e">m_Count</a>);</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span> &lt;&lt; std::setw(50) &lt;&lt; eventLabel &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; std::setw(9) &lt;&lt; avgMs &lt;&lt; <span class="stringliteral">&quot; &quot;</span></div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;            &lt;&lt; std::setw(9) &lt;&lt; eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#acf82cb43aa8ac450a64249b1339edcd6">m_MinMs</a> &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; std::setw(9) &lt;&lt; eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a7a2e04ecfcc33687bd52a9f57bb3c73b">m_MaxMs</a> &lt;&lt; <span class="stringliteral">&quot; &quot;</span></div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;            &lt;&lt; std::setw(9) &lt;&lt; eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a987e938e13b0c6d0864b7473497816a2">m_TotalMs</a> &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; std::setw(9) &lt;&lt; eventStats.<a class="code" href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a1bf817b905316b6a2e823652eb156e5e">m_Count</a> &lt;&lt; std::endl;</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;    }</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;    outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;}</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;</div><div class="line"><a name="l00165"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#ab4a49101468246556a6652cedaa8d2f7">  165</a></span>&#160;<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ab4a49101468246556a6652cedaa8d2f7">ProfilerImpl::ProfilerImpl</a>()</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a1b1892da2aaf7eaedaa38671d56b7f19">m_ProfilingEnabled</a>(<a class="code" href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a>)</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;{</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.reserve(g_ProfilingEventCountHint);</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;<span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;    <span class="comment">// Initialises streamline annotations.</span></div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;    ANNOTATE_SETUP;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;}</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;</div><div class="line"><a name="l00176"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a6412388bcab05aee892066269fd4112d">  176</a></span>&#160;<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6412388bcab05aee892066269fd4112d">ProfilerImpl::~ProfilerImpl</a>()</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;{</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a1b1892da2aaf7eaedaa38671d56b7f19">m_ProfilingEnabled</a>)</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;    {</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;        <span class="keywordflow">if</span> (g_WriteReportToStdOutOnProfilerDestruction)</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;        {</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;            <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a038bb767bbc6abc0ee0d9b509616b896">Print</a>(std::cout);</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;        }</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;    }</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="comment">// Un-register this profiler from the current thread.</span></div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_manager.xhtml#a93857080c2523bf3395e7aa7e6024d5c">ProfilerManager::GetInstance</a>().<a class="code" href="classarmnn_1_1_profiler_manager.xhtml#a7b1e3e5bf386004541be2b5b22443208">RegisterProfiler</a>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;}</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">  190</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">ProfilerImpl::IsProfilingEnabled</a>()</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;{</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a1b1892da2aaf7eaedaa38671d56b7f19">m_ProfilingEnabled</a>;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;}</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;</div><div class="line"><a name="l00195"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#af556ae358458c476f8594b3bbb28d712">  195</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#af556ae358458c476f8594b3bbb28d712">ProfilerImpl::EnableProfiling</a>(<span class="keywordtype">bool</span> enableProfiling)</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;{</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a1b1892da2aaf7eaedaa38671d56b7f19">m_ProfilingEnabled</a> = enableProfiling;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;}</div><div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;</div><div class="line"><a name="l00200"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a792e2891575052735a77a04475d1908f">  200</a></span>&#160;<a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a792e2891575052735a77a04475d1908f">ProfilerImpl::BeginEvent</a>(<a class="code" href="classarmnn_1_1_i_profiler.xhtml">armnn::IProfiler</a>* profiler,</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;                            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a>&amp; backendId,</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;                            <span class="keyword">const</span> std::string&amp; label,</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;                            std::vector&lt;InstrumentPtr&gt;&amp;&amp; instruments)</div><div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;{</div><div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;    <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* parent = <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.empty() ? nullptr : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.top();</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.push_back(std::make_unique&lt;Event&gt;(label, profiler, parent, backendId, std::move(instruments)));</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* <span class="keyword">event</span> = <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.back().get();</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    <span class="keyword">event</span>-&gt;Start();</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;<span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    ANNOTATE_CHANNEL_COLOR(uint32_t(<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.size()), <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ac2afea56b7e3ffcc81f49f15febf88f1">GetEventColor</a>(backendId), label.c_str());</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.push(event);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;    <span class="keywordflow">return</span> event;</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;}</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;</div><div class="line"><a name="l00218"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a8ed16398e69bb7b0625e3cf4a279b1f3">  218</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a8ed16398e69bb7b0625e3cf4a279b1f3">ProfilerImpl::EndEvent</a>(<a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* event)</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;{</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    <span class="keyword">event</span>-&gt;Stop();</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(!<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.empty());</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(event == <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.top());</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.pop();</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* parent = <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.empty() ? nullptr : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.top();</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(parent);</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(event-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#a0ef4ff725b1ce859c6ef32e99e92dba3">GetParentEvent</a>() == parent);</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;<span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    ANNOTATE_CHANNEL_END(uint32_t(<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.size()));</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;<span class="preprocessor">#endif</span></div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;}</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a20f74b679d59b52e9fae3bbef8f10ffb">  235</a></span>&#160;<span class="keywordtype">int</span> <a class="code" href="namespacearmnn.xhtml#a20f74b679d59b52e9fae3bbef8f10ffb">CalcLevel</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* eventPtr)</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;{</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="keywordtype">int</span> level=0;</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    <span class="keywordflow">while</span> (eventPtr != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    {</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;        eventPtr = eventPtr-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#a0ef4ff725b1ce859c6ef32e99e92dba3">GetParentEvent</a>();</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        level++;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;    }</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;    <span class="keywordflow">return</span> level;</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;}</div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;</div><div class="line"><a name="l00246"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a0cb1635481cd63529a53c7818b5b6f26">  246</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a0cb1635481cd63529a53c7818b5b6f26">ProfilerImpl::PopulateInferences</a>(std::vector&lt;const Event*&gt;&amp; outInferences, <span class="keywordtype">int</span>&amp; outBaseLevel)<span class="keyword"> const</span></div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    outInferences.reserve(<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.size());</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; event : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>)</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;    {</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* eventPtrRaw = <span class="keyword">event</span>.get();</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;        <span class="keywordflow">if</span> (eventPtrRaw-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#a55466a39638bb671b24a82941aa37d77">GetName</a>() == <span class="stringliteral">&quot;EnqueueWorkload&quot;</span>)</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        {</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;            outBaseLevel = (outBaseLevel == -1) ? <a class="code" href="namespacearmnn.xhtml#a20f74b679d59b52e9fae3bbef8f10ffb">CalcLevel</a>(eventPtrRaw) : outBaseLevel;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;            outInferences.push_back(eventPtrRaw);</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;        }</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;    }</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;}</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;</div><div class="line"><a name="l00260"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#acf4d3bf8bcbc281fbff18a5d6ae41e20">  260</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#acf4d3bf8bcbc281fbff18a5d6ae41e20">ProfilerImpl::PopulateDescendants</a>(std::map&lt;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>*, std::vector&lt;const Event*&gt;&gt;&amp; outDescendantsMap)<span class="keyword"> const</span></div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; event : <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>)</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    {</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* eventPtrRaw = <span class="keyword">event</span>.get();</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* parent = eventPtrRaw-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#a0ef4ff725b1ce859c6ef32e99e92dba3">GetParentEvent</a>();</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        <span class="keywordflow">if</span> (!parent)</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        {</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        }</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        <span class="keyword">auto</span> it = outDescendantsMap.find(parent);</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        <span class="keywordflow">if</span> (it == outDescendantsMap.end())</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        {</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;            outDescendantsMap.emplace(parent, std::vector&lt;const Event*&gt;({eventPtrRaw}));</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;        }</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;        {</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;            it-&gt;second.push_back(eventPtrRaw);</div><div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;        }</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;    }</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;}</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;</div><div class="line"><a name="l00285"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a50805c29c35b9903c2dea301d8091711">  285</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn.xhtml#a50805c29c35b9903c2dea301d8091711">ExtractJsonObjects</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inferenceIndex,</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;                        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* parentEvent,</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;                        <a class="code" href="structarmnn_1_1_json_child_object.xhtml">JsonChildObject</a>&amp; parentObject,</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;                        std::map&lt;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>*, std::vector&lt;const Event*&gt;&gt; descendantsMap)</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;{</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(parentEvent);</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    std::vector&lt;Measurement&gt; instrumentMeasurements = parentEvent-&gt;<a class="code" href="classarmnn_1_1_event.xhtml#aa75e3a38ab9fee7b2ad5522e746ad0af">GetMeasurements</a>();</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> childIdx=0;</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    <span class="keywordflow">for</span>(<span class="keywordtype">size_t</span> measurementIndex = 0; measurementIndex &lt; instrumentMeasurements.size(); ++measurementIndex, ++childIdx)</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    {</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;        <span class="keywordflow">if</span> (inferenceIndex == 0)</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;        {</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;            <span class="comment">// Only add kernel measurement once, in case of multiple inferences</span></div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;            <a class="code" href="structarmnn_1_1_json_child_object.xhtml">JsonChildObject</a> measurementObject{instrumentMeasurements[measurementIndex].m_Name};</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;            measurementObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#abf603e1749215e9acda67cba1a107b7f">SetUnit</a>(instrumentMeasurements[measurementIndex].m_Unit);</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;            measurementObject.SetType(<a class="code" href="namespacearmnn.xhtml#a4e2dd387ba6f0dc5164b4cdf8de3262aa911842b19d8b2f9bbed8cfe909d52975">JsonObjectType::Measurement</a>);</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(parentObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#a1f7ec083be66d58a3e02e12956bf005e">NumChildren</a>() == childIdx);</div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;            parentObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#a4df32333fc1c0959e26ff65875316c19">AddChild</a>(measurementObject);</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        }</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;        parentObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#aa6fe48cf02c47c65b66d1d65ad3fa438">GetChild</a>(childIdx).<a class="code" href="structarmnn_1_1_json_child_object.xhtml#af52bfd578b9fc6d53775b87bc991a535">AddMeasurement</a>(instrumentMeasurements[measurementIndex].m_Value);</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;    }</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;    <span class="keyword">auto</span> childEventsIt = descendantsMap.find(parentEvent);</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    <span class="keywordflow">if</span> (childEventsIt != descendantsMap.end())</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;    {</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> childEvent : childEventsIt-&gt;second)</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;        {</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;            <span class="keywordflow">if</span> (inferenceIndex == 0)</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;            {</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;                <span class="comment">// Only add second level once, in case of multiple inferences</span></div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;                <a class="code" href="structarmnn_1_1_json_child_object.xhtml">JsonChildObject</a> childObject{childEvent-&gt;GetName()};</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;                childObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#a83535c5d2147efad73b55ec1b17428fb">SetType</a>(<a class="code" href="namespacearmnn.xhtml#a4e2dd387ba6f0dc5164b4cdf8de3262aaa4ecfc70574394990cf17bd83df499f7">JsonObjectType::Event</a>);</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;                parentObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#a4df32333fc1c0959e26ff65875316c19">AddChild</a>(childObject);</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;            }</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;            <span class="comment">// Recursively process children. In reality this won&#39;t be very deep recursion. ~4-6 levels deep.</span></div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a50805c29c35b9903c2dea301d8091711">ExtractJsonObjects</a>(inferenceIndex, childEvent, parentObject.<a class="code" href="structarmnn_1_1_json_child_object.xhtml#aa6fe48cf02c47c65b66d1d65ad3fa438">GetChild</a>(childIdx), descendantsMap);</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;            childIdx++;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;        }</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    }</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;}</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;</div><div class="line"><a name="l00331"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#a038bb767bbc6abc0ee0d9b509616b896">  331</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a038bb767bbc6abc0ee0d9b509616b896">ProfilerImpl::Print</a>(std::ostream&amp; outStream)<span class="keyword"> const</span></div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;    <span class="comment">// Makes sure timestamps are output with 6 decimals, and save old settings.</span></div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    std::streamsize oldPrecision = outStream.precision();</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;    outStream.precision(6);</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    std::ios_base::fmtflags oldFlags = outStream.flags();</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    outStream.setf(std::ios::fixed);</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;    <a class="code" href="classarmnn_1_1_json_printer.xhtml">JsonPrinter</a> printer(outStream);</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;    <span class="comment">// First find all the &quot;inference&quot; Events and print out duration measurements.</span></div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;    <span class="keywordtype">int</span> baseLevel = -1;</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;    std::vector&lt;const Event*&gt; inferences;</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a0cb1635481cd63529a53c7818b5b6f26">PopulateInferences</a>(inferences, baseLevel);</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    <span class="comment">// Second map out descendants hierarchy</span></div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;    std::map&lt;const Event*, std::vector&lt;const Event*&gt;&gt; descendantsMap;</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#acf4d3bf8bcbc281fbff18a5d6ae41e20">PopulateDescendants</a>(descendantsMap);</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;    <a class="code" href="structarmnn_1_1_json_child_object.xhtml">JsonChildObject</a> inferenceObject{<span class="stringliteral">&quot;inference_measurements&quot;</span>};</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;    <a class="code" href="structarmnn_1_1_json_child_object.xhtml">JsonChildObject</a> layerObject{<span class="stringliteral">&quot;layer_measurements&quot;</span>};</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;    std::vector&lt;JsonChildObject&gt; workloadObjects;</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;    std::map&lt;unsigned int, std::vector&lt;JsonChildObject&gt;&gt; workloadToKernelObjects;</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inferenceIndex = 0; inferenceIndex &lt; inferences.size(); ++inferenceIndex)</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    {</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;        <span class="keyword">auto</span> inference = inferences[inferenceIndex];</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;        <a class="code" href="namespacearmnn.xhtml#a50805c29c35b9903c2dea301d8091711">ExtractJsonObjects</a>(inferenceIndex, inference, inferenceObject, descendantsMap);</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;    }</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#adaa4d19c25f5fab4804cc8b1d38a68aa">PrintHeader</a>();</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#ad3566ce453b36aa0c4294d54980107ca">PrintArmNNHeader</a>();</div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;    <span class="comment">// print inference object, also prints child layer and kernel measurements</span></div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;    <span class="keywordtype">size_t</span> <span class="keywordtype">id</span>=0;</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#aeb76c875ee2792a79924bac85b9eacac">PrintJsonChildObject</a>(inferenceObject, <span class="keywordtype">id</span>);</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <span class="comment">// end of ArmNN</span></div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#abfd916a652a231df472d86da7e91d74b">PrintNewLine</a>();</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#ad4aadb70bfaa3b841d94a9508b2245d3">PrintFooter</a>();</div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    <span class="comment">// end of main JSON object</span></div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#abfd916a652a231df472d86da7e91d74b">PrintNewLine</a>();</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#ad4aadb70bfaa3b841d94a9508b2245d3">PrintFooter</a>();</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    printer.<a class="code" href="classarmnn_1_1_json_printer.xhtml#abfd916a652a231df472d86da7e91d74b">PrintNewLine</a>();</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;    <span class="comment">// Restores previous precision settings.</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    outStream.flags(oldFlags);</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    outStream.precision(oldPrecision);</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;}</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;</div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">  381</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">ProfilerImpl::AnalyzeEventsAndWriteResults</a>(std::ostream&amp; outStream)<span class="keyword"> const</span></div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    <span class="comment">// Stack should be empty now.</span></div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> saneMarkerSequence = <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">m_Parents</a>.empty();</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;    <span class="comment">// Abort if the sequence of markers was found to have incorrect information:</span></div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="comment">// The stats cannot be trusted.</span></div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;    <span class="keywordflow">if</span> (!saneMarkerSequence)</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;    {</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;Cannot write profiling stats. &quot;</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;            <span class="stringliteral">&quot;Unexpected errors were found when analyzing the sequence of logged events, which may lead to plainly &quot;</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;            <span class="stringliteral">&quot;wrong stats. The profiling system may contain implementation issues or could have been used in an &quot;</span></div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;            <span class="stringliteral">&quot;unsafe manner.&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;    }</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    <span class="comment">// Analyzes the full sequence of events.</span></div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ae9462da7222b5d3315271e64bae6740b">AnalyzeEventSequenceAndWriteResults</a>(<a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.cbegin(),</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;                                        <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">m_EventSequence</a>.cend(),</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                                        outStream);</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;    <span class="comment">// Aggregates events by tag if requested (spams the output stream if done for all tags).</span></div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="keywordflow">if</span> (g_AggregateProfilingEventsByInference)</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    {</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;        outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;***&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;*** Per Inference Stats&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;        outStream &lt;&lt; <span class="stringliteral">&quot;***&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;        outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;        <span class="keywordtype">int</span> baseLevel = -1;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;        std::vector&lt;const Event*&gt; inferences;</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;        <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#a0cb1635481cd63529a53c7818b5b6f26">PopulateInferences</a>(inferences, baseLevel);</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;        <span class="comment">// Second map out descendants hierarchy</span></div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;        std::map&lt;const Event*, std::vector&lt;const Event*&gt;&gt; descendantsMap;</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;        <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#acf4d3bf8bcbc281fbff18a5d6ae41e20">PopulateDescendants</a>(descendantsMap);</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;        std::function&lt;void (const Event*, std::vector&lt;const Event*&gt;&amp;)&gt;</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;            FindDescendantEvents = [&amp;](<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* eventPtr,</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;                std::vector&lt;const Event*&gt;&amp; sequence)</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;            {</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;                sequence.push_back(eventPtr);</div><div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;</div><div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;                <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a20f74b679d59b52e9fae3bbef8f10ffb">CalcLevel</a>(eventPtr) &gt; baseLevel+2) <span class="comment">//We only care about levels as deep as workload executions.</span></div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;                {</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;                    <span class="keywordflow">return</span>;</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;                }</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;                <span class="keyword">auto</span> children = descendantsMap.find(eventPtr);</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;                <span class="keywordflow">if</span> (children == descendantsMap.end())</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;                {</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;                    <span class="keywordflow">return</span>;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;                }</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;                <span class="keywordflow">if</span> (!(children-&gt;second.empty()))</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;                {</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;                    <span class="keywordflow">return</span> FindDescendantEvents(children-&gt;second[0], sequence);</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;                }</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;            };</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;        <span class="comment">// Third, find events belonging to each inference</span></div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        <span class="keywordtype">int</span> inferenceIdx = 0;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> inference : inferences)</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;        {</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;            std::vector&lt;const Event*&gt; sequence;</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;            <span class="comment">//build sequence, depth first</span></div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;            FindDescendantEvents(inference, sequence);</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;            outStream &lt;&lt; <span class="stringliteral">&quot;&gt; Begin Inference: &quot;</span> &lt;&lt; inferenceIdx &lt;&lt; std::endl;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;            outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;            <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ae9462da7222b5d3315271e64bae6740b">AnalyzeEventSequenceAndWriteResults</a>(sequence.cbegin(),</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;                                                sequence.cend(),</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;                                                outStream);</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;            outStream &lt;&lt; std::endl;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;            outStream &lt;&lt; <span class="stringliteral">&quot;&gt; End Inference: &quot;</span> &lt;&lt; inferenceIdx &lt;&lt; std::endl;</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;            inferenceIdx++;</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        }</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;    }</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;}</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;</div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_impl.xhtml#ac2afea56b7e3ffcc81f49f15febf88f1">  464</a></span>&#160;std::uint32_t <a class="code" href="classarmnn_1_1_profiler_impl.xhtml#ac2afea56b7e3ffcc81f49f15febf88f1">ProfilerImpl::GetEventColor</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a>&amp; backendId)<span class="keyword"> const</span></div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    <span class="keyword">static</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> cpuRef(<span class="stringliteral">&quot;CpuRef&quot;</span>);</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <span class="keyword">static</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> cpuAcc(<span class="stringliteral">&quot;CpuAcc&quot;</span>);</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    <span class="keyword">static</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> gpuAcc(<span class="stringliteral">&quot;GpuAcc&quot;</span>);</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;    <span class="keywordflow">if</span> (backendId == cpuRef) {</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;            <span class="comment">// Cyan</span></div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;            <span class="keywordflow">return</span> 0xffff001b;</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (backendId == cpuAcc) {</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;            <span class="comment">// Green</span></div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;            <span class="keywordflow">return</span> 0x00ff001b;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (backendId == gpuAcc) {</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;            <span class="comment">// Purple</span></div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;            <span class="keywordflow">return</span> 0xff007f1b;</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;            <span class="comment">// Dark gray</span></div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;            <span class="keywordflow">return</span> 0x5555551b;</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;    }</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;}</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="comment">// The thread_local pointer to the profiler instance.</span></div><div class="line"><a name="l00485"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#acb96b901eccb58267042c6bb7d41185f">  485</a></span>&#160;thread_local <a class="code" href="classarmnn_1_1_i_profiler.xhtml">IProfiler</a>* <a class="code" href="namespacearmnn.xhtml#acb96b901eccb58267042c6bb7d41185f">tl_Profiler</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;</div><div class="line"><a name="l00489"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_manager.xhtml#a93857080c2523bf3395e7aa7e6024d5c">  489</a></span>&#160;<a class="code" href="classarmnn_1_1_profiler_manager.xhtml">ProfilerManager</a>&amp; <a class="code" href="classarmnn_1_1_profiler_manager.xhtml#a93857080c2523bf3395e7aa7e6024d5c">ProfilerManager::GetInstance</a>()</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;{</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    <span class="comment">// Global reference to the single ProfileManager instance allowed.</span></div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;    <span class="keyword">static</span> <a class="code" href="classarmnn_1_1_profiler_manager.xhtml">ProfilerManager</a> s_ProfilerManager;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    <span class="keywordflow">return</span> s_ProfilerManager;</div><div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160;}</div><div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;</div><div class="line"><a name="l00496"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_manager.xhtml#a7b1e3e5bf386004541be2b5b22443208">  496</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_profiler_manager.xhtml#a7b1e3e5bf386004541be2b5b22443208">ProfilerManager::RegisterProfiler</a>(<a class="code" href="classarmnn_1_1_i_profiler.xhtml">IProfiler</a>* profiler)</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;{</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;    tl_Profiler = profiler;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;}</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;</div><div class="line"><a name="l00501"></a><span class="lineno"><a class="line" href="classarmnn_1_1_profiler_manager.xhtml#a3756986bc88b9b212d3f983c70c5c129">  501</a></span>&#160;<a class="code" href="classarmnn_1_1_i_profiler.xhtml">IProfiler</a>* <a class="code" href="classarmnn_1_1_profiler_manager.xhtml#a3756986bc88b9b212d3f983c70c5c129">ProfilerManager::GetProfiler</a>()</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;{</div><div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="namespacearmnn.xhtml#acb96b901eccb58267042c6bb7d41185f">tl_Profiler</a>;</div><div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;}</div><div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;</div><div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classarmnn_1_1_i_profiler.xhtml#af556ae358458c476f8594b3bbb28d712">  507</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_i_profiler.xhtml#af556ae358458c476f8594b3bbb28d712">IProfiler::EnableProfiling</a>(<span class="keywordtype">bool</span> enableProfiling)</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;{</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    pProfilerImpl-&gt;EnableProfiling(enableProfiling);</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;}</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;</div><div class="line"><a name="l00512"></a><span class="lineno"><a class="line" href="classarmnn_1_1_i_profiler.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">  512</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1_i_profiler.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">IProfiler::IsProfilingEnabled</a>()</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;{</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    <span class="keywordflow">return</span> pProfilerImpl-&gt;IsProfilingEnabled();</div><div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;}</div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;</div><div class="line"><a name="l00517"></a><span class="lineno"><a class="line" href="classarmnn_1_1_i_profiler.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">  517</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_i_profiler.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">IProfiler::AnalyzeEventsAndWriteResults</a>(std::ostream&amp; outStream)<span class="keyword"> const</span></div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;    pProfilerImpl-&gt;AnalyzeEventsAndWriteResults(outStream);</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;}</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;</div><div class="line"><a name="l00522"></a><span class="lineno"><a class="line" href="classarmnn_1_1_i_profiler.xhtml#a038bb767bbc6abc0ee0d9b509616b896">  522</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_i_profiler.xhtml#a038bb767bbc6abc0ee0d9b509616b896">IProfiler::Print</a>(std::ostream&amp; outStream)<span class="keyword"> const</span></div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;    pProfilerImpl-&gt;Print(outStream);</div><div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;}</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;<a class="code" href="classarmnn_1_1_event.xhtml">Event</a>* IProfiler::BeginEvent(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a>&amp; backendId,</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;                  <span class="keyword">const</span> std::string&amp; label,</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;                  std::vector&lt;InstrumentPtr&gt;&amp;&amp; instruments)</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;{</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    <span class="keywordflow">return</span> pProfilerImpl-&gt;BeginEvent(<span class="keyword">this</span>, backendId, label,  std::move(instruments));</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;}</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;<a class="code" href="classarmnn_1_1_i_profiler.xhtml#a3e96ca374a63bd8547fe68a5d9809df7">IProfiler::~IProfiler</a>() = <span class="keywordflow">default</span>;</div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classarmnn_1_1_i_profiler.xhtml#ac1f916bbd576830b5c35c9987581f301">  535</a></span>&#160;<a class="code" href="classarmnn_1_1_i_profiler.xhtml#ac1f916bbd576830b5c35c9987581f301">IProfiler::IProfiler</a>() : pProfilerImpl(new <a class="code" href="classarmnn_1_1_profiler_impl.xhtml">ProfilerImpl</a>()) {};</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;} <span class="comment">// namespace armnn</span></div><div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_aa6fe48cf02c47c65b66d1d65ad3fa438"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#aa6fe48cf02c47c65b66d1d65ad3fa438">armnn::JsonChildObject::GetChild</a></div><div class="ttdeci">JsonChildObject &amp; GetChild(const unsigned int index)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00041">JsonPrinter.hpp:41</a></div></div>
<div class="ttc" id="_ignore_unused_8hpp_xhtml"><div class="ttname"><a href="_ignore_unused_8hpp.xhtml">IgnoreUnused.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml">armnn::JsonPrinter</a></div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00078">JsonPrinter.hpp:78</a></div></div>
<div class="ttc" id="classarmnn_1_1_event_xhtml"><div class="ttname"><a href="classarmnn_1_1_event.xhtml">armnn::Event</a></div><div class="ttdoc">Event class records measurements reported by BeginEvent()/EndEvent() and returns measurements when Ev...</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_event_8hpp_source.xhtml#l00023">ProfilingEvent.hpp:23</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ab03dcfb3b4019d8f58a67c41681951ae"><div class="ttname"><a href="namespacearmnn.xhtml#ab03dcfb3b4019d8f58a67c41681951ae">armnn::GetEventPtr</a></div><div class="ttdeci">const Event * GetEventPtr(const Event *ptr)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00110">Profiling.cpp:110</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a6ce7e56eb10e440463f09eee8f213adc"><div class="ttname"><a href="namespacearmnn.xhtml#a6ce7e56eb10e440463f09eee8f213adc">armnn::g_WriteReportToStdOutOnProfilerDestruction</a></div><div class="ttdeci">constexpr bool g_WriteReportToStdOutOnProfilerDestruction</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00042">Profiling.cpp:42</a></div></div>
<div class="ttc" id="_json_printer_8hpp_xhtml"><div class="ttname"><a href="_json_printer_8hpp.xhtml">JsonPrinter.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_a4df32333fc1c0959e26ff65875316c19"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#a4df32333fc1c0959e26ff65875316c19">armnn::JsonChildObject::AddChild</a></div><div class="ttdeci">void AddChild(const JsonChildObject &amp;childObject)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00036">JsonPrinter.hpp:36</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_ac1f916bbd576830b5c35c9987581f301"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#ac1f916bbd576830b5c35c9987581f301">armnn::IProfiler::IProfiler</a></div><div class="ttdeci">IProfiler()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00535">Profiling.cpp:535</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a20f74b679d59b52e9fae3bbef8f10ffb"><div class="ttname"><a href="namespacearmnn.xhtml#a20f74b679d59b52e9fae3bbef8f10ffb">armnn::CalcLevel</a></div><div class="ttdeci">int CalcLevel(const Event *eventPtr)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00235">Profiling.cpp:235</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_aa5a25e3cf143724a9460c4aa9c47841b"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">armnn::ProfilerImpl::IsProfilingEnabled</a></div><div class="ttdeci">bool IsProfilingEnabled()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00190">Profiling.cpp:190</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_manager_xhtml_a93857080c2523bf3395e7aa7e6024d5c"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.xhtml#a93857080c2523bf3395e7aa7e6024d5c">armnn::ProfilerManager::GetInstance</a></div><div class="ttdeci">static ProfilerManager &amp; GetInstance()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00489">Profiling.cpp:489</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a12d3ffe11b54c0aaa59bdd8415701c36"><div class="ttname"><a href="namespacearmnn.xhtml#a12d3ffe11b54c0aaa59bdd8415701c36">armnn::FindMeasurement</a></div><div class="ttdeci">Measurement FindMeasurement(const std::string &amp;name, const Event *event)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00044">Profiling.cpp:44</a></div></div>
<div class="ttc" id="_cl_layer_tests_8cpp_xhtml_a2289f9e7fac0ce47801448e873b04303"><div class="ttname"><a href="_cl_layer_tests_8cpp.xhtml#a2289f9e7fac0ce47801448e873b04303">false</a></div><div class="ttdeci">DataLayout::NCHW false</div><div class="ttdef"><b>Definition:</b> <a href="_cl_layer_tests_8cpp_source.xhtml#l00135">ClLayerTests.cpp:135</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_ac2afea56b7e3ffcc81f49f15febf88f1"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#ac2afea56b7e3ffcc81f49f15febf88f1">armnn::ProfilerImpl::GetEventColor</a></div><div class="ttdeci">uint32_t GetEventColor(const BackendId &amp;backendId) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00464">Profiling.cpp:464</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a1b90db39f6a9ebd11591e76fa364b06f"><div class="ttname"><a href="namespacearmnn.xhtml#a1b90db39f6a9ebd11591e76fa364b06f">armnn::FindKernelMeasurements</a></div><div class="ttdeci">std::vector&lt; Measurement &gt; FindKernelMeasurements(const Event *event)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00063">Profiling.cpp:63</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_a038bb767bbc6abc0ee0d9b509616b896"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#a038bb767bbc6abc0ee0d9b509616b896">armnn::IProfiler::Print</a></div><div class="ttdeci">void Print(std::ostream &amp;outStream) const</div><div class="ttdoc">Print stats for events in JSON Format to the given output stream. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00522">Profiling.cpp:522</a></div></div>
<div class="ttc" id="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats_xhtml_a987e938e13b0c6d0864b7473497816a2"><div class="ttname"><a href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a987e938e13b0c6d0864b7473497816a2">armnn::ProfilerImpl::ProfilingEventStats::m_TotalMs</a></div><div class="ttdeci">double m_TotalMs</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00071">Profiling.hpp:71</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a0c14f9e9a75d1279acb6a4ea036b5b33"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a0c14f9e9a75d1279acb6a4ea036b5b33">armnn::ProfilerImpl::CalculateProfilingEventStats</a></div><div class="ttdeci">std::map&lt; std::string, ProfilingEventStats &gt; CalculateProfilingEventStats() const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00083">Profiling.cpp:83</a></div></div>
<div class="ttc" id="structarmnn_1_1_measurement_xhtml"><div class="ttname"><a href="structarmnn_1_1_measurement.xhtml">armnn::Measurement</a></div><div class="ttdef"><b>Definition:</b> <a href="_instrument_8hpp_source.xhtml#l00014">Instrument.hpp:14</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_ac9f22844fb2e329ffd193f2d9a8ce336"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">armnn::IProfiler::AnalyzeEventsAndWriteResults</a></div><div class="ttdeci">void AnalyzeEventsAndWriteResults(std::ostream &amp;outStream) const</div><div class="ttdoc">Analyzes the tracked events and writes the results to the given output stream. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00517">Profiling.cpp:517</a></div></div>
<div class="ttc" id="classarmnn_1_1_event_xhtml_a55466a39638bb671b24a82941aa37d77"><div class="ttname"><a href="classarmnn_1_1_event.xhtml#a55466a39638bb671b24a82941aa37d77">armnn::Event::GetName</a></div><div class="ttdeci">const std::string &amp; GetName() const</div><div class="ttdoc">Get the name of the event. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_event_8cpp_source.xhtml#l00067">ProfilingEvent.cpp:67</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml"><div class="ttname"><a href="namespacearmnn.xhtml">armnn</a></div><div class="ttdoc">Copyright (c) 2021 ARM Limited and Contributors. </div><div class="ttdef"><b>Definition:</b> <a href="01__00__software__tools_8dox_source.xhtml#l00006">01_00_software_tools.dox:6</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a44affeeb090c3c6a3062830562672e84"><div class="ttname"><a href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">armnn::IgnoreUnused</a></div><div class="ttdeci">void IgnoreUnused(Ts &amp;&amp;...)</div><div class="ttdef"><b>Definition:</b> <a href="_ignore_unused_8hpp_source.xhtml#l00014">IgnoreUnused.hpp:14</a></div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml">armnn::JsonChildObject</a></div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00024">JsonPrinter.hpp:24</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_ae9462da7222b5d3315271e64bae6740b"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#ae9462da7222b5d3315271e64bae6740b">armnn::ProfilerImpl::AnalyzeEventSequenceAndWriteResults</a></div><div class="ttdeci">void AnalyzeEventSequenceAndWriteResults(EventIterType first, EventIterType last, std::ostream &amp;outStream) const</div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_a1f7ec083be66d58a3e02e12956bf005e"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#a1f7ec083be66d58a3e02e12956bf005e">armnn::JsonChildObject::NumChildren</a></div><div class="ttdeci">size_t NumChildren() const</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00051">JsonPrinter.hpp:51</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_manager_xhtml_a3756986bc88b9b212d3f983c70c5c129"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.xhtml#a3756986bc88b9b212d3f983c70c5c129">armnn::ProfilerManager::GetProfiler</a></div><div class="ttdeci">IProfiler * GetProfiler()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00501">Profiling.cpp:501</a></div></div>
<div class="ttc" id="classarmnn_1_1_event_xhtml_aa58c448afeade37f3b23f4842d46d9b5"><div class="ttname"><a href="classarmnn_1_1_event.xhtml#aa58c448afeade37f3b23f4842d46d9b5">armnn::Event::GetBackendId</a></div><div class="ttdeci">BackendId GetBackendId() const</div><div class="ttdoc">Get the backend id of the event. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_event_8cpp_source.xhtml#l00082">ProfilingEvent.cpp:82</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_ac9f22844fb2e329ffd193f2d9a8ce336"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#ac9f22844fb2e329ffd193f2d9a8ce336">armnn::ProfilerImpl::AnalyzeEventsAndWriteResults</a></div><div class="ttdeci">void AnalyzeEventsAndWriteResults(std::ostream &amp;outStream) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00381">Profiling.cpp:381</a></div></div>
<div class="ttc" id="classarmnn_1_1_event_xhtml_aa75e3a38ab9fee7b2ad5522e746ad0af"><div class="ttname"><a href="classarmnn_1_1_event.xhtml#aa75e3a38ab9fee7b2ad5522e746ad0af">armnn::Event::GetMeasurements</a></div><div class="ttdeci">const std::vector&lt; Measurement &gt; GetMeasurements() const</div><div class="ttdoc">Get the recorded measurements calculated between Start() and Stop() </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_event_8cpp_source.xhtml#l00054">ProfilingEvent.cpp:54</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a50805c29c35b9903c2dea301d8091711"><div class="ttname"><a href="namespacearmnn.xhtml#a50805c29c35b9903c2dea301d8091711">armnn::ExtractJsonObjects</a></div><div class="ttdeci">void ExtractJsonObjects(unsigned int inferenceIndex, const Event *parentEvent, JsonChildObject &amp;parentObject, std::map&lt; const Event *, std::vector&lt; const Event *&gt;&gt; descendantsMap)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00285">Profiling.cpp:285</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_af556ae358458c476f8594b3bbb28d712"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#af556ae358458c476f8594b3bbb28d712">armnn::IProfiler::EnableProfiling</a></div><div class="ttdeci">void EnableProfiling(bool enableProfiling)</div><div class="ttdoc">Enables/disables profiling for this profiler. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00507">Profiling.cpp:507</a></div></div>
<div class="ttc" id="classarmnn_1_1_wall_clock_timer_xhtml_abd358345fde773d79e57461c1b062703"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.xhtml#abd358345fde773d79e57461c1b062703">armnn::WallClockTimer::WALL_CLOCK_TIME_STOP</a></div><div class="ttdeci">static const std::string WALL_CLOCK_TIME_STOP</div><div class="ttdef"><b>Definition:</b> <a href="_wall_clock_timer_8hpp_source.xhtml#l00065">WallClockTimer.hpp:65</a></div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_a83535c5d2147efad73b55ec1b17428fb"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#a83535c5d2147efad73b55ec1b17428fb">armnn::JsonChildObject::SetType</a></div><div class="ttdeci">void SetType(JsonObjectType type)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00056">JsonPrinter.hpp:56</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml_ad3566ce453b36aa0c4294d54980107ca"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml#ad3566ce453b36aa0c4294d54980107ca">armnn::JsonPrinter::PrintArmNNHeader</a></div><div class="ttdeci">void PrintArmNNHeader()</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8cpp_source.xhtml#l00063">JsonPrinter.cpp:63</a></div></div>
<div class="ttc" id="classarmnn_1_1_wall_clock_timer_xhtml_aef02e15721d757f07f3812f09fc892d4"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.xhtml#aef02e15721d757f07f3812f09fc892d4">armnn::WallClockTimer::WALL_CLOCK_TIME_START</a></div><div class="ttdeci">static const std::string WALL_CLOCK_TIME_START</div><div class="ttdef"><b>Definition:</b> <a href="_wall_clock_timer_8hpp_source.xhtml#l00064">WallClockTimer.hpp:64</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a43ecd194778b7653578044060ba8695e"><div class="ttname"><a href="namespacearmnn.xhtml#a43ecd194778b7653578044060ba8695e">armnn::g_ProfilingEventCountHint</a></div><div class="ttdeci">constexpr std::size_t g_ProfilingEventCountHint</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00030">Profiling.cpp:30</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml_abfd916a652a231df472d86da7e91d74b"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml#abfd916a652a231df472d86da7e91d74b">armnn::JsonPrinter::PrintNewLine</a></div><div class="ttdeci">void PrintNewLine()</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8cpp_source.xhtml#l00158">JsonPrinter.cpp:158</a></div></div>
<div class="ttc" id="classarmnn_1_1_wall_clock_timer_xhtml_aece42eedfcac1aa046e0dff4763b300a"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.xhtml#aece42eedfcac1aa046e0dff4763b300a">armnn::WallClockTimer::WALL_CLOCK_TIME</a></div><div class="ttdeci">static const std::string WALL_CLOCK_TIME</div><div class="ttdef"><b>Definition:</b> <a href="_wall_clock_timer_8hpp_source.xhtml#l00063">WallClockTimer.hpp:63</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_aa5a25e3cf143724a9460c4aa9c47841b"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#aa5a25e3cf143724a9460c4aa9c47841b">armnn::IProfiler::IsProfilingEnabled</a></div><div class="ttdeci">bool IsProfilingEnabled()</div><div class="ttdoc">Checks whether profiling is enabled. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00512">Profiling.cpp:512</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_manager_xhtml"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.xhtml">armnn::ProfilerManager</a></div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00091">Profiling.hpp:91</a></div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_af52bfd578b9fc6d53775b87bc991a535"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#af52bfd578b9fc6d53775b87bc991a535">armnn::JsonChildObject::AddMeasurement</a></div><div class="ttdeci">void AddMeasurement(const double measurement)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00031">JsonPrinter.hpp:31</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml_a5698be69cbd5dfe6c28fcd9867e8cbed"><div class="ttname"><a href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a></div><div class="ttdeci">#define ARMNN_ASSERT(COND)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00014">Assert.hpp:14</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a8ed16398e69bb7b0625e3cf4a279b1f3"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a8ed16398e69bb7b0625e3cf4a279b1f3">armnn::ProfilerImpl::EndEvent</a></div><div class="ttdeci">void EndEvent(Event *event)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00218">Profiling.cpp:218</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml_aeb76c875ee2792a79924bac85b9eacac"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml#aeb76c875ee2792a79924bac85b9eacac">armnn::JsonPrinter::PrintJsonChildObject</a></div><div class="ttdeci">void PrintJsonChildObject(const JsonChildObject &amp;object, size_t &amp;id)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8cpp_source.xhtml#l00015">JsonPrinter.cpp:15</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml_ad4aadb70bfaa3b841d94a9508b2245d3"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml#ad4aadb70bfaa3b841d94a9508b2245d3">armnn::JsonPrinter::PrintFooter</a></div><div class="ttdeci">void PrintFooter()</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8cpp_source.xhtml#l00163">JsonPrinter.cpp:163</a></div></div>
<div class="ttc" id="classarmnn_1_1_json_printer_xhtml_adaa4d19c25f5fab4804cc8b1d38a68aa"><div class="ttname"><a href="classarmnn_1_1_json_printer.xhtml#adaa4d19c25f5fab4804cc8b1d38a68aa">armnn::JsonPrinter::PrintHeader</a></div><div class="ttdeci">void PrintHeader()</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8cpp_source.xhtml#l00057">JsonPrinter.cpp:57</a></div></div>
<div class="ttc" id="_backend_id_8hpp_xhtml"><div class="ttname"><a href="_backend_id_8hpp.xhtml">BackendId.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats_xhtml"><div class="ttname"><a href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml">armnn::ProfilerImpl::ProfilingEventStats</a></div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00069">Profiling.hpp:69</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a41794552ff67b0dad16de60f9b8e7d7c"><div class="ttname"><a href="namespacearmnn.xhtml#a41794552ff67b0dad16de60f9b8e7d7c">armnn::g_WriteProfilingEventSequence</a></div><div class="ttdeci">constexpr bool g_WriteProfilingEventSequence</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00033">Profiling.cpp:33</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_aacc0d11e271ebbfcff9d613dd17604aa"><div class="ttname"><a href="namespacearmnn.xhtml#aacc0d11e271ebbfcff9d613dd17604aa">armnn::g_AggregateProfilingEventsByInference</a></div><div class="ttdeci">constexpr bool g_AggregateProfilingEventsByInference</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00038">Profiling.cpp:38</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml">armnn::IProfiler</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_profiler_8hpp_source.xhtml#l00019">IProfiler.hpp:19</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a038bb767bbc6abc0ee0d9b509616b896"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a038bb767bbc6abc0ee0d9b509616b896">armnn::ProfilerImpl::Print</a></div><div class="ttdeci">void Print(std::ostream &amp;outStream) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00331">Profiling.cpp:331</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a792e2891575052735a77a04475d1908f"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a792e2891575052735a77a04475d1908f">armnn::ProfilerImpl::BeginEvent</a></div><div class="ttdeci">Event * BeginEvent(armnn::IProfiler *profiler, const BackendId &amp;backendId, const std::string &amp;name, std::vector&lt; InstrumentPtr &gt; &amp;&amp;instruments)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00200">Profiling.cpp:200</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a1b1892da2aaf7eaedaa38671d56b7f19"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a1b1892da2aaf7eaedaa38671d56b7f19">armnn::ProfilerImpl::m_ProfilingEnabled</a></div><div class="ttdeci">bool m_ProfilingEnabled</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00086">Profiling.hpp:86</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml"><div class="ttname"><a href="_assert_8hpp.xhtml">Assert.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_manager_xhtml_a7b1e3e5bf386004541be2b5b22443208"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.xhtml#a7b1e3e5bf386004541be2b5b22443208">armnn::ProfilerManager::RegisterProfiler</a></div><div class="ttdeci">void RegisterProfiler(IProfiler *profiler)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00496">Profiling.cpp:496</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a6412388bcab05aee892066269fd4112d"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a6412388bcab05aee892066269fd4112d">armnn::ProfilerImpl::~ProfilerImpl</a></div><div class="ttdeci">~ProfilerImpl()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00176">Profiling.cpp:176</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4e2dd387ba6f0dc5164b4cdf8de3262aa911842b19d8b2f9bbed8cfe909d52975"><div class="ttname"><a href="namespacearmnn.xhtml#a4e2dd387ba6f0dc5164b4cdf8de3262aa911842b19d8b2f9bbed8cfe909d52975">armnn::JsonObjectType::Measurement</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml">armnn::ProfilerImpl</a></div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00027">Profiling.hpp:27</a></div></div>
<div class="ttc" id="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats_xhtml_acf82cb43aa8ac450a64249b1339edcd6"><div class="ttname"><a href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#acf82cb43aa8ac450a64249b1339edcd6">armnn::ProfilerImpl::ProfilingEventStats::m_MinMs</a></div><div class="ttdeci">double m_MinMs</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00072">Profiling.hpp:72</a></div></div>
<div class="ttc" id="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats_xhtml_a7a2e04ecfcc33687bd52a9f57bb3c73b"><div class="ttname"><a href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a7a2e04ecfcc33687bd52a9f57bb3c73b">armnn::ProfilerImpl::ProfilingEventStats::m_MaxMs</a></div><div class="ttdeci">double m_MaxMs</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00073">Profiling.hpp:73</a></div></div>
<div class="ttc" id="classarmnn_1_1_backend_id_xhtml_af7445617163d3f07c47b92ae56c6cf8b"><div class="ttname"><a href="classarmnn_1_1_backend_id.xhtml#af7445617163d3f07c47b92ae56c6cf8b">armnn::BackendId::Get</a></div><div class="ttdeci">const std::string &amp; Get() const</div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00136">BackendId.hpp:136</a></div></div>
<div class="ttc" id="structarmnn_1_1_json_child_object_xhtml_abf603e1749215e9acda67cba1a107b7f"><div class="ttname"><a href="structarmnn_1_1_json_child_object.xhtml#abf603e1749215e9acda67cba1a107b7f">armnn::JsonChildObject::SetUnit</a></div><div class="ttdeci">void SetUnit(const Measurement::Unit unit)</div><div class="ttdef"><b>Definition:</b> <a href="_json_printer_8hpp_source.xhtml#l00046">JsonPrinter.hpp:46</a></div></div>
<div class="ttc" id="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats_xhtml_a1bf817b905316b6a2e823652eb156e5e"><div class="ttname"><a href="structarmnn_1_1_profiler_impl_1_1_profiling_event_stats.xhtml#a1bf817b905316b6a2e823652eb156e5e">armnn::ProfilerImpl::ProfilingEventStats::m_Count</a></div><div class="ttdeci">uint32_t m_Count</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00074">Profiling.hpp:74</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4e2dd387ba6f0dc5164b4cdf8de3262aaa4ecfc70574394990cf17bd83df499f7"><div class="ttname"><a href="namespacearmnn.xhtml#a4e2dd387ba6f0dc5164b4cdf8de3262aaa4ecfc70574394990cf17bd83df499f7">armnn::JsonObjectType::Event</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a0cb1635481cd63529a53c7818b5b6f26"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a0cb1635481cd63529a53c7818b5b6f26">armnn::ProfilerImpl::PopulateInferences</a></div><div class="ttdeci">void PopulateInferences(std::vector&lt; const Event *&gt; &amp;outInferences, int &amp;outBaseLevel) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00246">Profiling.cpp:246</a></div></div>
<div class="ttc" id="structarmnn_1_1_measurement_xhtml_ac2b559d9ddbdc9bf665c30eece9f426e"><div class="ttname"><a href="structarmnn_1_1_measurement.xhtml#ac2b559d9ddbdc9bf665c30eece9f426e">armnn::Measurement::m_Value</a></div><div class="ttdeci">double m_Value</div><div class="ttdef"><b>Definition:</b> <a href="_instrument_8hpp_source.xhtml#l00043">Instrument.hpp:43</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a7cccdda9e15c719d099c0699a14e5f87"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a7cccdda9e15c719d099c0699a14e5f87">armnn::ProfilerImpl::m_Parents</a></div><div class="ttdeci">std::stack&lt; Event * &gt; m_Parents</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00084">Profiling.hpp:84</a></div></div>
<div class="ttc" id="classarmnn_1_1_event_xhtml_a0ef4ff725b1ce859c6ef32e99e92dba3"><div class="ttname"><a href="classarmnn_1_1_event.xhtml#a0ef4ff725b1ce859c6ef32e99e92dba3">armnn::Event::GetParentEvent</a></div><div class="ttdeci">const Event * GetParentEvent() const</div><div class="ttdoc">Get the pointer of the parent event. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_event_8cpp_source.xhtml#l00077">ProfilingEvent.cpp:77</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_acb96b901eccb58267042c6bb7d41185f"><div class="ttname"><a href="namespacearmnn.xhtml#acb96b901eccb58267042c6bb7d41185f">armnn::tl_Profiler</a></div><div class="ttdeci">thread_local IProfiler * tl_Profiler</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00485">Profiling.cpp:485</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_acf4d3bf8bcbc281fbff18a5d6ae41e20"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#acf4d3bf8bcbc281fbff18a5d6ae41e20">armnn::ProfilerImpl::PopulateDescendants</a></div><div class="ttdeci">void PopulateDescendants(std::map&lt; const Event *, std::vector&lt; const Event *&gt;&gt; &amp;outDescendantsMap) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00260">Profiling.cpp:260</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_a3e96ca374a63bd8547fe68a5d9809df7"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#a3e96ca374a63bd8547fe68a5d9809df7">armnn::IProfiler::~IProfiler</a></div><div class="ttdeci">~IProfiler()</div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_a6c8819e2b32bf401c10505919ad8368c"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#a6c8819e2b32bf401c10505919ad8368c">armnn::ProfilerImpl::m_EventSequence</a></div><div class="ttdeci">std::vector&lt; EventPtr &gt; m_EventSequence</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00085">Profiling.hpp:85</a></div></div>
<div class="ttc" id="_profiling_8hpp_xhtml"><div class="ttname"><a href="_profiling_8hpp.xhtml">Profiling.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_ab4a49101468246556a6652cedaa8d2f7"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#ab4a49101468246556a6652cedaa8d2f7">armnn::ProfilerImpl::ProfilerImpl</a></div><div class="ttdeci">ProfilerImpl()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00165">Profiling.cpp:165</a></div></div>
<div class="ttc" id="classarmnn_1_1_profiler_impl_xhtml_af556ae358458c476f8594b3bbb28d712"><div class="ttname"><a href="classarmnn_1_1_profiler_impl.xhtml#af556ae358458c476f8594b3bbb28d712">armnn::ProfilerImpl::EnableProfiling</a></div><div class="ttdeci">void EnableProfiling(bool enableProfiling)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00195">Profiling.cpp:195</a></div></div>
<div class="ttc" id="classarmnn_1_1_backend_id_xhtml"><div class="ttname"><a href="classarmnn_1_1_backend_id.xhtml">armnn::BackendId</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00075">BackendId.hpp:75</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.xhtml">src</a></li><li class="navelem"><a class="el" href="dir_e0a84d05c80a2ef4231141dcbbeac5c8.xhtml">armnn</a></li><li class="navelem"><a class="el" href="_profiling_8cpp.xhtml">Profiling.cpp</a></li>
    <li class="footer">Generated on Thu Feb 25 2021 17:27:29 for ArmNN by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>
  </ul>
</div>
</body>
</html>