1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
4 <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
5 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
6 <meta name="generator" content="Doxygen 1.8.13"/>
7 <meta name="viewport" content="width=device-width, initial-scale=1"/>
8 <title>ArmNN: Profiler Class Reference</title>
9 <link href="tabs.css" rel="stylesheet" type="text/css"/>
10 <script type="text/javascript" src="jquery.js"></script>
11 <script type="text/javascript" src="dynsections.js"></script>
12 <link href="navtree.css" rel="stylesheet" type="text/css"/>
13 <script type="text/javascript" src="resize.js"></script>
14 <script type="text/javascript" src="navtreedata.js"></script>
15 <script type="text/javascript" src="navtree.js"></script>
16 <script type="text/javascript">
17 $(document).ready(initResizable);
19 <link href="search/search.css" rel="stylesheet" type="text/css"/>
20 <script type="text/javascript" src="search/searchdata.js"></script>
21 <script type="text/javascript" src="search/search.js"></script>
22 <link href="doxygen.css" rel="stylesheet" type="text/css" />
25 <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
27 <table cellspacing="0" cellpadding="0">
29 <tr style="height: 56px;">
30 <td id="projectalign" style="padding-left: 0.5em;">
31 <div id="projectname">ArmNN
32  <span id="projectnumber">NotReleased</span>
39 <!-- end header part -->
40 <!-- Generated by Doxygen 1.8.13 -->
41 <script type="text/javascript">
42 var searchBox = new SearchBox("searchBox", "search",false,'Search');
44 <script type="text/javascript" src="menudata.js"></script>
45 <script type="text/javascript" src="menu.js"></script>
46 <script type="text/javascript">
48 initMenu('',true,false,'search.php','Search');
49 $(document).ready(function() { init_search(); });
52 <div id="main-nav"></div>
54 <div id="side-nav" class="ui-resizable side-nav-resizable">
56 <div id="nav-tree-contents">
57 <div id="nav-sync" class="sync"></div>
60 <div id="splitbar" style="-moz-user-select:none;"
61 class="ui-resizable-handle">
64 <script type="text/javascript">
65 $(document).ready(function(){initNavTree('classarmnn_1_1_profiler.html','');});
67 <div id="doc-content">
68 <!-- window showing the filter options -->
69 <div id="MSearchSelectWindow"
70 onmouseover="return searchBox.OnSearchSelectShow()"
71 onmouseout="return searchBox.OnSearchSelectHide()"
72 onkeydown="return searchBox.OnSearchSelectKey(event)">
75 <!-- iframe showing the search results (closed by default) -->
76 <div id="MSearchResultsWindow">
77 <iframe src="javascript:void(0)" frameborder="0"
78 name="MSearchResults" id="MSearchResults">
84 <a href="#nested-classes">Classes</a> |
85 <a href="#pub-types">Public Types</a> |
86 <a href="#pub-methods">Public Member Functions</a> |
87 <a href="#friends">Friends</a> |
88 <a href="classarmnn_1_1_profiler-members.html">List of all members</a> </div>
89 <div class="headertitle">
90 <div class="title">Profiler Class Reference<span class="mlabels"><span class="mlabel">final</span></span></div> </div>
92 <div class="contents">
94 <p><code>#include <<a class="el" href="_profiling_8hpp_source.html">Profiling.hpp</a>></code></p>
95 <div class="dynheader">
96 Inheritance diagram for Profiler:</div>
97 <div class="dyncontent">
99 <img src="classarmnn_1_1_profiler.png" usemap="#Profiler_map" alt=""/>
100 <map id="Profiler_map" name="Profiler_map">
101 <area href="classarmnn_1_1_i_profiler.html" alt="IProfiler" shape="rect" coords="0,0,57,24"/>
104 <table class="memberdecls">
105 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-types"></a>
106 Public Types</h2></td></tr>
107 <tr class="memitem:a70926d23f3aef7e657a9057a7badb014"><td class="memItemLeft" align="right" valign="top">using </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a70926d23f3aef7e657a9057a7badb014">InstrumentPtr</a> = std::unique_ptr< <a class="el" href="classarmnn_1_1_instrument.html">Instrument</a> ></td></tr>
108 <tr class="separator:a70926d23f3aef7e657a9057a7badb014"><td class="memSeparator" colspan="2"> </td></tr>
109 </table><table class="memberdecls">
110 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
111 Public Member Functions</h2></td></tr>
112 <tr class="memitem:a997beb676bd403881fa274ec7ac9854c"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a997beb676bd403881fa274ec7ac9854c">Profiler</a> ()</td></tr>
113 <tr class="separator:a997beb676bd403881fa274ec7ac9854c"><td class="memSeparator" colspan="2"> </td></tr>
114 <tr class="memitem:aa0f87e10a29a76f6358f43b09621df51"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#aa0f87e10a29a76f6358f43b09621df51">~Profiler</a> ()</td></tr>
115 <tr class="separator:aa0f87e10a29a76f6358f43b09621df51"><td class="memSeparator" colspan="2"> </td></tr>
116 <tr class="memitem:abaf660a136b904fbcbd0c374fea38cd0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classarmnn_1_1_event.html">Event</a> * </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#abaf660a136b904fbcbd0c374fea38cd0">BeginEvent</a> (const <a class="el" href="classarmnn_1_1_backend_id.html">BackendId</a> &backendId, const std::string &name, std::vector< <a class="el" href="classarmnn_1_1_profiler.html#a70926d23f3aef7e657a9057a7badb014">InstrumentPtr</a> > &&instruments)</td></tr>
117 <tr class="separator:abaf660a136b904fbcbd0c374fea38cd0"><td class="memSeparator" colspan="2"> </td></tr>
118 <tr class="memitem:a8ed16398e69bb7b0625e3cf4a279b1f3"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a8ed16398e69bb7b0625e3cf4a279b1f3">EndEvent</a> (<a class="el" href="classarmnn_1_1_event.html">Event</a> *event)</td></tr>
119 <tr class="separator:a8ed16398e69bb7b0625e3cf4a279b1f3"><td class="memSeparator" colspan="2"> </td></tr>
120 <tr class="memitem:a537b76b2a9f7fbcb538eabe994e424e0"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a537b76b2a9f7fbcb538eabe994e424e0">EnableProfiling</a> (bool enableProfiling) override</td></tr>
121 <tr class="separator:a537b76b2a9f7fbcb538eabe994e424e0"><td class="memSeparator" colspan="2"> </td></tr>
122 <tr class="memitem:ad5ac843dd60a0ff7d4ab327f43fb88a5"><td class="memItemLeft" align="right" valign="top">bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#ad5ac843dd60a0ff7d4ab327f43fb88a5">IsProfilingEnabled</a> () override</td></tr>
123 <tr class="separator:ad5ac843dd60a0ff7d4ab327f43fb88a5"><td class="memSeparator" colspan="2"> </td></tr>
124 <tr class="memitem:afb5ba6c1110d2ea400f49ad7f3ac4d15"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#afb5ba6c1110d2ea400f49ad7f3ac4d15">UpdateEventTag</a> ()</td></tr>
125 <tr class="separator:afb5ba6c1110d2ea400f49ad7f3ac4d15"><td class="memSeparator" colspan="2"> </td></tr>
126 <tr class="memitem:aeb61437c18e4bc111811428aec0e3ae9"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#aeb61437c18e4bc111811428aec0e3ae9">AnalyzeEventsAndWriteResults</a> (std::ostream &outStream) const override</td></tr>
127 <tr class="separator:aeb61437c18e4bc111811428aec0e3ae9"><td class="memSeparator" colspan="2"> </td></tr>
128 <tr class="memitem:a352a82f3a338acf06a20d290f605c489"><td class="memItemLeft" align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a352a82f3a338acf06a20d290f605c489">Print</a> (std::ostream &outStream) const override</td></tr>
129 <tr class="separator:a352a82f3a338acf06a20d290f605c489"><td class="memSeparator" colspan="2"> </td></tr>
130 <tr class="memitem:ac2afea56b7e3ffcc81f49f15febf88f1"><td class="memItemLeft" align="right" valign="top">uint32_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#ac2afea56b7e3ffcc81f49f15febf88f1">GetEventColor</a> (const <a class="el" href="classarmnn_1_1_backend_id.html">BackendId</a> &backendId) const</td></tr>
131 <tr class="separator:ac2afea56b7e3ffcc81f49f15febf88f1"><td class="memSeparator" colspan="2"> </td></tr>
132 <tr class="memitem:a949493a67655a79249dffa9bac9a5d0b"><td class="memTemplParams" colspan="2">template<typename ItertType > </td></tr>
133 <tr class="memitem:a949493a67655a79249dffa9bac9a5d0b"><td class="memTemplItemLeft" align="right" valign="top">void </td><td class="memTemplItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a949493a67655a79249dffa9bac9a5d0b">AnalyzeEventSequenceAndWriteResults</a> (ItertType first, ItertType last, std::ostream &outStream) const</td></tr>
134 <tr class="separator:a949493a67655a79249dffa9bac9a5d0b"><td class="memSeparator" colspan="2"> </td></tr>
135 </table><table class="memberdecls">
136 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="friends"></a>
137 Friends</h2></td></tr>
138 <tr class="memitem:a3269840850209f5ae295310924b6175f"><td class="memItemLeft" align="right" valign="top">size_t </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_profiler.html#a3269840850209f5ae295310924b6175f">GetProfilerEventSequenceSize</a> (<a class="el" href="classarmnn_1_1_profiler.html">armnn::Profiler</a> *profiler)</td></tr>
139 <tr class="separator:a3269840850209f5ae295310924b6175f"><td class="memSeparator" colspan="2"> </td></tr>
140 </table><table class="memberdecls">
141 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
142 Additional Inherited Members</h2></td></tr>
143 <tr class="inherit_header pro_methods_classarmnn_1_1_i_profiler"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classarmnn_1_1_i_profiler')"><img src="closed.png" alt="-"/> Protected Member Functions inherited from <a class="el" href="classarmnn_1_1_i_profiler.html">IProfiler</a></td></tr>
144 <tr class="memitem:a3e96ca374a63bd8547fe68a5d9809df7 inherit pro_methods_classarmnn_1_1_i_profiler"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_profiler.html#a3e96ca374a63bd8547fe68a5d9809df7">~IProfiler</a> ()</td></tr>
145 <tr class="separator:a3e96ca374a63bd8547fe68a5d9809df7 inherit pro_methods_classarmnn_1_1_i_profiler"><td class="memSeparator" colspan="2"> </td></tr>
147 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
148 <div class="textblock">
149 <p class="definition">Definition at line <a class="el" href="_profiling_8hpp_source.html#l00028">28</a> of file <a class="el" href="_profiling_8hpp_source.html">Profiling.hpp</a>.</p>
150 </div><h2 class="groupheader">Member Typedef Documentation</h2>
151 <a id="a70926d23f3aef7e657a9057a7badb014"></a>
152 <h2 class="memtitle"><span class="permalink"><a href="#a70926d23f3aef7e657a9057a7badb014">◆ </a></span>InstrumentPtr</h2>
154 <div class="memitem">
155 <div class="memproto">
156 <table class="memname">
158 <td class="memname">using <a class="el" href="classarmnn_1_1_profiler.html#a70926d23f3aef7e657a9057a7badb014">InstrumentPtr</a> = std::unique_ptr<<a class="el" href="classarmnn_1_1_instrument.html">Instrument</a>></td>
161 </div><div class="memdoc">
163 <p class="definition">Definition at line <a class="el" href="_profiling_8hpp_source.html#l00033">33</a> of file <a class="el" href="_profiling_8hpp_source.html">Profiling.hpp</a>.</p>
167 <h2 class="groupheader">Constructor & Destructor Documentation</h2>
168 <a id="a997beb676bd403881fa274ec7ac9854c"></a>
169 <h2 class="memtitle"><span class="permalink"><a href="#a997beb676bd403881fa274ec7ac9854c">◆ </a></span>Profiler()</h2>
171 <div class="memitem">
172 <div class="memproto">
173 <table class="memname">
175 <td class="memname"><a class="el" href="classarmnn_1_1_profiler.html">Profiler</a> </td>
177 <td class="paramname"></td><td>)</td>
181 </div><div class="memdoc">
183 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00165">165</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
184 <div class="fragment"><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  : m_ProfilingEnabled(<span class="keyword">false</span>)</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> {</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  m_EventSequence.reserve(<a class="code" href="namespacearmnn.html#a43ecd194778b7653578044060ba8695e">g_ProfilingEventCountHint</a>);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span> </div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> <span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="comment">// Initialises streamline annotations.</span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  ANNOTATE_SETUP;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> }</div><div class="ttc" id="namespacearmnn_html_a43ecd194778b7653578044060ba8695e"><div class="ttname"><a href="namespacearmnn.html#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.html#l00030">Profiling.cpp:30</a></div></div>
185 </div><!-- fragment -->
188 <a id="aa0f87e10a29a76f6358f43b09621df51"></a>
189 <h2 class="memtitle"><span class="permalink"><a href="#aa0f87e10a29a76f6358f43b09621df51">◆ </a></span>~Profiler()</h2>
191 <div class="memitem">
192 <div class="memproto">
193 <table class="memname">
195 <td class="memname">~<a class="el" href="classarmnn_1_1_profiler.html">Profiler</a> </td>
197 <td class="paramname"></td><td>)</td>
201 </div><div class="memdoc">
203 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00176">176</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
205 <p class="reference">References <a class="el" href="_profiling_8cpp_source.html#l00486">ProfilerManager::GetInstance()</a>, <a class="el" href="_profiling_8cpp_source.html#l00330">Profiler::Print()</a>, and <a class="el" href="_profiling_8cpp_source.html#l00493">ProfilerManager::RegisterProfiler()</a>.</p>
206 <div class="fragment"><div class="line"><a name="l00177"></a><span class="lineno"> 177</span> {</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">if</span> (m_ProfilingEnabled)</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.html#a6ce7e56eb10e440463f09eee8f213adc">g_WriteReportToStdOutOnProfilerDestruction</a>)</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  {</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="classarmnn_1_1_profiler.html#a352a82f3a338acf06a20d290f605c489">Print</a>(std::cout);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  }</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  }</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <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>  <a class="code" href="classarmnn_1_1_profiler_manager.html#a93857080c2523bf3395e7aa7e6024d5c">ProfilerManager::GetInstance</a>().<a class="code" href="classarmnn_1_1_profiler_manager.html#a029a40ab5d837b3d4f5d3900ceb6a8f9">RegisterProfiler</a>(<span class="keyword">nullptr</span>);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> }</div><div class="ttc" id="namespacearmnn_html_a6ce7e56eb10e440463f09eee8f213adc"><div class="ttname"><a href="namespacearmnn.html#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.html#l00042">Profiling.cpp:42</a></div></div>
207 <div class="ttc" id="classarmnn_1_1_profiler_html_a352a82f3a338acf06a20d290f605c489"><div class="ttname"><a href="classarmnn_1_1_profiler.html#a352a82f3a338acf06a20d290f605c489">armnn::Profiler::Print</a></div><div class="ttdeci">void Print(std::ostream &outStream) const override</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00330">Profiling.cpp:330</a></div></div>
208 <div class="ttc" id="classarmnn_1_1_profiler_manager_html_a029a40ab5d837b3d4f5d3900ceb6a8f9"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.html#a029a40ab5d837b3d4f5d3900ceb6a8f9">armnn::ProfilerManager::RegisterProfiler</a></div><div class="ttdeci">void RegisterProfiler(Profiler *profiler)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00493">Profiling.cpp:493</a></div></div>
209 <div class="ttc" id="classarmnn_1_1_profiler_manager_html_a93857080c2523bf3395e7aa7e6024d5c"><div class="ttname"><a href="classarmnn_1_1_profiler_manager.html#a93857080c2523bf3395e7aa7e6024d5c">armnn::ProfilerManager::GetInstance</a></div><div class="ttdeci">static ProfilerManager & GetInstance()</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00486">Profiling.cpp:486</a></div></div>
210 </div><!-- fragment -->
213 <h2 class="groupheader">Member Function Documentation</h2>
214 <a id="aeb61437c18e4bc111811428aec0e3ae9"></a>
215 <h2 class="memtitle"><span class="permalink"><a href="#aeb61437c18e4bc111811428aec0e3ae9">◆ </a></span>AnalyzeEventsAndWriteResults()</h2>
217 <div class="memitem">
218 <div class="memproto">
219 <table class="mlabels">
221 <td class="mlabels-left">
222 <table class="memname">
224 <td class="memname">void AnalyzeEventsAndWriteResults </td>
226 <td class="paramtype">std::ostream & </td>
227 <td class="paramname"><em>outStream</em></td><td>)</td>
232 <td class="mlabels-right">
233 <span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
236 </div><div class="memdoc">
237 <p>Analyzes the tracked events and writes the results to the given output stream. Please refer to the configuration variables in <a class="el" href="_profiling_8cpp.html">Profiling.cpp</a> to customize the information written. </p><dl class="params"><dt>Parameters</dt><dd>
238 <table class="params">
239 <tr><td class="paramdir">[out]</td><td class="paramname">outStream</td><td>The stream where to write the profiling results to. </td></tr>
244 <p>Implements <a class="el" href="classarmnn_1_1_i_profiler.html#aea4e445e340cb3a7fbb51465cf029724">IProfiler</a>.</p>
246 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00380">380</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
248 <p class="reference">References <a class="el" href="_profiling_8cpp_source.html#l00234">armnn::CalcLevel()</a>.</p>
249 <div class="fragment"><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  <span class="comment">// Stack should be empty now.</span></div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keyword">const</span> <span class="keywordtype">bool</span> saneMarkerSequence = m_Parents.empty();</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Abort if the sequence of markers was found to have incorrect information:</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// The stats cannot be trusted.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">if</span> (!saneMarkerSequence)</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  {</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  outStream << <span class="stringliteral">"Cannot write profiling stats. "</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="stringliteral">"Unexpected errors were found when analyzing the sequence of logged events, which may lead to plainly "</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="stringliteral">"wrong stats. The profiling system may contain implementation issues or could have been used in an "</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="stringliteral">"unsafe manner."</span> << std::endl;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  }</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="comment">// Analyzes the full sequence of events.</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  AnalyzeEventSequenceAndWriteResults(m_EventSequence.cbegin(),</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  m_EventSequence.cend(),</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  outStream);</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> </div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <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="l00402"></a><span class="lineno"> 402</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.html#aacc0d11e271ebbfcff9d613dd17604aa">g_AggregateProfilingEventsByInference</a>)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  outStream << std::endl;</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  outStream << <span class="stringliteral">"***"</span> << std::endl;</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  outStream << <span class="stringliteral">"*** Per Inference Stats"</span> << std::endl;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  outStream << <span class="stringliteral">"***"</span> << std::endl;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  outStream << std::endl;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span> </div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordtype">int</span> baseLevel = -1;</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  std::vector<const Event*> inferences;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  PopulateInferences(inferences, baseLevel);</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="comment">// Second map out descendants hierarchy</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  std::map<const Event*, std::vector<const Event*>> descendantsMap;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  PopulateDescendants(descendantsMap);</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> </div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  std::function<void (const Event*, std::vector<const Event*>&)></div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  FindDescendantEvents = [&](<span class="keyword">const</span> <a class="code" href="struct_event.html">Event</a>* eventPtr,</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  std::vector<const Event*>& sequence)</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  sequence.push_back(eventPtr);</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> </div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.html#a20f74b679d59b52e9fae3bbef8f10ffb">CalcLevel</a>(eventPtr) > baseLevel+2) <span class="comment">//We only care about levels as deep as workload executions.</span></div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  {</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  }</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span> </div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keyword">auto</span> children = descendantsMap.find(eventPtr);</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">if</span> (children == descendantsMap.end())</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  }</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span> </div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="struct_event.html">Event</a>* child : children->second)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  <span class="keywordflow">return</span> FindDescendantEvents(child, sequence);</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  };</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="comment">// Third, find events belonging to each inference</span></div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordtype">int</span> inferenceIdx = 0;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> inference : inferences)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  std::vector<const Event*> sequence;</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="comment">//build sequence, depth first</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  FindDescendantEvents(inference, sequence);</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span> </div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  outStream << <span class="stringliteral">"> Begin Inference: "</span> << inferenceIdx << std::endl;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  outStream << std::endl;</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  AnalyzeEventSequenceAndWriteResults(sequence.cbegin(),</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  sequence.cend(),</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  outStream);</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  outStream << std::endl;</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  outStream << <span class="stringliteral">"> End Inference: "</span> << inferenceIdx << std::endl;</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span> </div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  inferenceIdx++;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  }</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  }</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> }</div><div class="ttc" id="namespacearmnn_html_a20f74b679d59b52e9fae3bbef8f10ffb"><div class="ttname"><a href="namespacearmnn.html#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.html#l00234">Profiling.cpp:234</a></div></div>
250 <div class="ttc" id="namespacearmnn_html_aacc0d11e271ebbfcff9d613dd17604aa"><div class="ttname"><a href="namespacearmnn.html#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.html#l00038">Profiling.cpp:38</a></div></div>
251 <div class="ttc" id="struct_event_html"><div class="ttname"><a href="struct_event.html">Event</a></div><div class="ttdef"><b>Definition:</b> <a href="_timeline_model_8h_source.html#l00035">TimelineModel.h:35</a></div></div>
252 </div><!-- fragment -->
255 <a id="a949493a67655a79249dffa9bac9a5d0b"></a>
256 <h2 class="memtitle"><span class="permalink"><a href="#a949493a67655a79249dffa9bac9a5d0b">◆ </a></span>AnalyzeEventSequenceAndWriteResults()</h2>
258 <div class="memitem">
259 <div class="memproto">
260 <table class="memname">
262 <td class="memname">void AnalyzeEventSequenceAndWriteResults </td>
264 <td class="paramtype">ItertType </td>
265 <td class="paramname"><em>first</em>, </td>
268 <td class="paramkey"></td>
270 <td class="paramtype">ItertType </td>
271 <td class="paramname"><em>last</em>, </td>
274 <td class="paramkey"></td>
276 <td class="paramtype">std::ostream & </td>
277 <td class="paramname"><em>outStream</em> </td>
282 <td></td><td> const</td>
285 </div><div class="memdoc">
287 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00114">114</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
289 <p class="reference">References <a class="el" href="_profiling_8cpp_source.html#l00044">armnn::FindMeasurement()</a>, <a class="el" href="_backend_id_8hpp_source.html#l00136">BackendId::Get()</a>, <a class="el" href="_profiling_event_8cpp_source.html#l00082">Event::GetBackendId()</a>, <a class="el" href="_profiling_8cpp_source.html#l00110">armnn::GetEventPtr()</a>, <a class="el" href="_profiling_event_8cpp_source.html#l00067">Event::GetName()</a>, <a class="el" href="_instrument_8hpp_source.html#l00043">Measurement::m_Value</a>, <a class="el" href="_wall_clock_timer_8hpp_source.html#l00063">WallClockTimer::WALL_CLOCK_TIME</a>, <a class="el" href="_wall_clock_timer_8hpp_source.html#l00064">WallClockTimer::WALL_CLOCK_TIME_START</a>, and <a class="el" href="_wall_clock_timer_8hpp_source.html#l00065">WallClockTimer::WALL_CLOCK_TIME_STOP</a>.</p>
290 <div class="fragment"><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="comment">// Outputs event sequence, if needed.</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.html#a41794552ff67b0dad16de60f9b8e7d7c">g_WriteProfilingEventSequence</a>)</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <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>  std::streamsize oldPrecision = outStream.precision();</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  outStream.precision(6);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  std::ios_base::fmtflags oldFlags = outStream.flags();</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  outStream.setf(std::ios::fixed);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Outputs fields.</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  outStream << <span class="stringliteral">"Event Sequence - Name | Duration (ms) | Start (ms) | Stop (ms) | Device"</span> << std::endl;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <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>  {</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keyword">const</span> <a class="code" href="struct_event.html">Event</a>* eventPtr = <a class="code" href="namespacearmnn.html#ab03dcfb3b4019d8f58a67c41681951ae">GetEventPtr</a>((*event));</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keywordtype">double</span> startTimeMs = <a class="code" href="namespacearmnn.html#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.html#aef02e15721d757f07f3812f09fc892d4">WallClockTimer::WALL_CLOCK_TIME_START</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.html#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordtype">double</span> stopTimeMs = <a class="code" href="namespacearmnn.html#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.html#abd358345fde773d79e57461c1b062703">WallClockTimer::WALL_CLOCK_TIME_STOP</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.html#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span> </div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <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>  <span class="keywordtype">double</span> durationMs = <a class="code" href="namespacearmnn.html#a12d3ffe11b54c0aaa59bdd8415701c36">FindMeasurement</a>(<a class="code" href="classarmnn_1_1_wall_clock_timer.html#aece42eedfcac1aa046e0dff4763b300a">WallClockTimer::WALL_CLOCK_TIME</a>, eventPtr).<a class="code" href="structarmnn_1_1_measurement.html#ac2b559d9ddbdc9bf665c30eece9f426e">m_Value</a>;</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  outStream << std::setw(50) << eventPtr->GetName() << <span class="stringliteral">" "</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  << std::setw(20) << durationMs</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  << std::setw(20) << startTimeMs</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  << std::setw(20) << stopTimeMs</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  << std::setw(20) << eventPtr->GetBackendId().Get()</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  << std::endl;</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  }</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  outStream << std::endl;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="comment">// Restores previous precision settings.</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  outStream.flags(oldFlags);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  outStream.precision(oldPrecision);</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  }</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="comment">// Aggregates results per event name.</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  std::map<std::string, ProfilingEventStats> nameToStatsMap = CalculateProfilingEventStats();</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="comment">// Outputs aggregated stats.</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  outStream << <span class="stringliteral">"Event Stats - Name | Avg (ms) | Min (ms) | Max (ms) | Total (ms) | Count"</span> << std::endl;</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& pair : nameToStatsMap)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keyword">const</span> std::string& eventLabel = pair.first;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keyword">const</span> ProfilingEventStats& eventStats = pair.second;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keyword">const</span> <span class="keywordtype">double</span> avgMs = eventStats.m_TotalMs / double(eventStats.m_Count);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  outStream << <span class="stringliteral">"\t"</span> << std::setw(50) << eventLabel << <span class="stringliteral">" "</span> << std::setw(9) << avgMs << <span class="stringliteral">" "</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  << std::setw(9) << eventStats.m_MinMs << <span class="stringliteral">" "</span> << std::setw(9) << eventStats.m_MaxMs << <span class="stringliteral">" "</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  << std::setw(9) << eventStats.m_TotalMs << <span class="stringliteral">" "</span> << std::setw(9) << eventStats.m_Count << std::endl;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  outStream << std::endl;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> }</div><div class="ttc" id="classarmnn_1_1_wall_clock_timer_html_aef02e15721d757f07f3812f09fc892d4"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.html#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.html#l00064">WallClockTimer.hpp:64</a></div></div>
291 <div class="ttc" id="classarmnn_1_1_wall_clock_timer_html_aece42eedfcac1aa046e0dff4763b300a"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.html#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.html#l00063">WallClockTimer.hpp:63</a></div></div>
292 <div class="ttc" id="namespacearmnn_html_a41794552ff67b0dad16de60f9b8e7d7c"><div class="ttname"><a href="namespacearmnn.html#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.html#l00033">Profiling.cpp:33</a></div></div>
293 <div class="ttc" id="structarmnn_1_1_measurement_html_ac2b559d9ddbdc9bf665c30eece9f426e"><div class="ttname"><a href="structarmnn_1_1_measurement.html#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.html#l00043">Instrument.hpp:43</a></div></div>
294 <div class="ttc" id="namespacearmnn_html_ab03dcfb3b4019d8f58a67c41681951ae"><div class="ttname"><a href="namespacearmnn.html#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.html#l00110">Profiling.cpp:110</a></div></div>
295 <div class="ttc" id="namespacearmnn_html_a12d3ffe11b54c0aaa59bdd8415701c36"><div class="ttname"><a href="namespacearmnn.html#a12d3ffe11b54c0aaa59bdd8415701c36">armnn::FindMeasurement</a></div><div class="ttdeci">Measurement FindMeasurement(const std::string &name, const Event *event)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00044">Profiling.cpp:44</a></div></div>
296 <div class="ttc" id="classarmnn_1_1_wall_clock_timer_html_abd358345fde773d79e57461c1b062703"><div class="ttname"><a href="classarmnn_1_1_wall_clock_timer.html#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.html#l00065">WallClockTimer.hpp:65</a></div></div>
297 <div class="ttc" id="struct_event_html"><div class="ttname"><a href="struct_event.html">Event</a></div><div class="ttdef"><b>Definition:</b> <a href="_timeline_model_8h_source.html#l00035">TimelineModel.h:35</a></div></div>
298 </div><!-- fragment -->
301 <a id="abaf660a136b904fbcbd0c374fea38cd0"></a>
302 <h2 class="memtitle"><span class="permalink"><a href="#abaf660a136b904fbcbd0c374fea38cd0">◆ </a></span>BeginEvent()</h2>
304 <div class="memitem">
305 <div class="memproto">
306 <table class="memname">
308 <td class="memname"><a class="el" href="classarmnn_1_1_event.html">Event</a> * BeginEvent </td>
310 <td class="paramtype">const <a class="el" href="classarmnn_1_1_backend_id.html">BackendId</a> & </td>
311 <td class="paramname"><em>backendId</em>, </td>
314 <td class="paramkey"></td>
316 <td class="paramtype">const std::string & </td>
317 <td class="paramname"><em>name</em>, </td>
320 <td class="paramkey"></td>
322 <td class="paramtype">std::vector< <a class="el" href="classarmnn_1_1_profiler.html#a70926d23f3aef7e657a9057a7badb014">InstrumentPtr</a> > && </td>
323 <td class="paramname"><em>instruments</em> </td>
331 </div><div class="memdoc">
333 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00200">200</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
335 <p class="reference">References <a class="el" href="_profiling_8cpp_source.html#l00463">Profiler::GetEventColor()</a>.</p>
336 <div class="fragment"><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> {</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <a class="code" href="struct_event.html">Event</a>* parent = m_Parents.empty() ? nullptr : m_Parents.top();</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  m_EventSequence.push_back(std::make_unique<Event>(label, <span class="keyword">this</span>, parent, backendId, std::move(instruments)));</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <a class="code" href="struct_event.html">Event</a>* <span class="keyword">event</span> = m_EventSequence.back().get();</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keyword">event</span>->Start();</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> <span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  ANNOTATE_CHANNEL_COLOR(uint32_t(m_Parents.size()), <a class="code" href="classarmnn_1_1_profiler.html#ac2afea56b7e3ffcc81f49f15febf88f1">GetEventColor</a>(backendId), label.c_str());</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> </div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  m_Parents.push(event);</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">return</span> event;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div><div class="ttc" id="classarmnn_1_1_profiler_html_ac2afea56b7e3ffcc81f49f15febf88f1"><div class="ttname"><a href="classarmnn_1_1_profiler.html#ac2afea56b7e3ffcc81f49f15febf88f1">armnn::Profiler::GetEventColor</a></div><div class="ttdeci">uint32_t GetEventColor(const BackendId &backendId) const</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00463">Profiling.cpp:463</a></div></div>
337 <div class="ttc" id="struct_event_html"><div class="ttname"><a href="struct_event.html">Event</a></div><div class="ttdef"><b>Definition:</b> <a href="_timeline_model_8h_source.html#l00035">TimelineModel.h:35</a></div></div>
338 </div><!-- fragment -->
341 <a id="a537b76b2a9f7fbcb538eabe994e424e0"></a>
342 <h2 class="memtitle"><span class="permalink"><a href="#a537b76b2a9f7fbcb538eabe994e424e0">◆ </a></span>EnableProfiling()</h2>
344 <div class="memitem">
345 <div class="memproto">
346 <table class="mlabels">
348 <td class="mlabels-left">
349 <table class="memname">
351 <td class="memname">void EnableProfiling </td>
353 <td class="paramtype">bool </td>
354 <td class="paramname"><em>enableProfiling</em></td><td>)</td>
359 <td class="mlabels-right">
360 <span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
363 </div><div class="memdoc">
364 <p>Enables/disables profiling for this profiler. </p><dl class="params"><dt>Parameters</dt><dd>
365 <table class="params">
366 <tr><td class="paramdir">[in]</td><td class="paramname">enableProfiling</td><td>A flag that indicates whether profiling should be enabled or not. </td></tr>
371 <p>Implements <a class="el" href="classarmnn_1_1_i_profiler.html#a769cdf670bd7cda3cda29dd40fbdebf4">IProfiler</a>.</p>
373 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00195">195</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
374 <div class="fragment"><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> {</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  m_ProfilingEnabled = enableProfiling;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> }</div></div><!-- fragment -->
377 <a id="a8ed16398e69bb7b0625e3cf4a279b1f3"></a>
378 <h2 class="memtitle"><span class="permalink"><a href="#a8ed16398e69bb7b0625e3cf4a279b1f3">◆ </a></span>EndEvent()</h2>
380 <div class="memitem">
381 <div class="memproto">
382 <table class="memname">
384 <td class="memname">void EndEvent </td>
386 <td class="paramtype"><a class="el" href="classarmnn_1_1_event.html">Event</a> * </td>
387 <td class="paramname"><em>event</em></td><td>)</td>
391 </div><div class="memdoc">
393 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00217">217</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
395 <p class="reference">References <a class="el" href="_profiling_event_8cpp_source.html#l00077">Event::GetParentEvent()</a>.</p>
396 <div class="fragment"><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keyword">event</span>->Stop();</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  BOOST_ASSERT(!m_Parents.empty());</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  BOOST_ASSERT(event == m_Parents.top());</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  m_Parents.pop();</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="struct_event.html">Event</a>* parent = m_Parents.empty() ? nullptr : m_Parents.top();</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  boost::ignore_unused(parent);</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  BOOST_ASSERT(event->GetParentEvent() == parent);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> <span class="preprocessor">#if ARMNN_STREAMLINE_ENABLED</span></div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  ANNOTATE_CHANNEL_END(uint32_t(m_Parents.size()));</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> <span class="preprocessor">#endif</span></div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> }</div><div class="ttc" id="struct_event_html"><div class="ttname"><a href="struct_event.html">Event</a></div><div class="ttdef"><b>Definition:</b> <a href="_timeline_model_8h_source.html#l00035">TimelineModel.h:35</a></div></div>
397 </div><!-- fragment -->
400 <a id="ac2afea56b7e3ffcc81f49f15febf88f1"></a>
401 <h2 class="memtitle"><span class="permalink"><a href="#ac2afea56b7e3ffcc81f49f15febf88f1">◆ </a></span>GetEventColor()</h2>
403 <div class="memitem">
404 <div class="memproto">
405 <table class="memname">
407 <td class="memname">std::uint32_t GetEventColor </td>
409 <td class="paramtype">const <a class="el" href="classarmnn_1_1_backend_id.html">BackendId</a> & </td>
410 <td class="paramname"><em>backendId</em></td><td>)</td>
414 </div><div class="memdoc">
416 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00463">463</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
418 <p class="reference">Referenced by <a class="el" href="_profiling_8cpp_source.html#l00200">Profiler::BeginEvent()</a>.</p>
419 <div class="fragment"><div class="line"><a name="l00464"></a><span class="lineno"> 464</span> {</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keyword">static</span> BackendId cpuRef(<span class="stringliteral">"CpuRef"</span>);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <span class="keyword">static</span> BackendId cpuAcc(<span class="stringliteral">"CpuAcc"</span>);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keyword">static</span> BackendId gpuAcc(<span class="stringliteral">"GpuAcc"</span>);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordflow">if</span> (backendId == cpuRef) {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="comment">// Cyan</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="keywordflow">return</span> 0xffff001b;</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (backendId == cpuAcc) {</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="comment">// Green</span></div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">return</span> 0x00ff001b;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (backendId == gpuAcc) {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="comment">// Purple</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">return</span> 0xff007f1b;</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  } <span class="keywordflow">else</span> {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <span class="comment">// Dark gray</span></div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">return</span> 0x5555551b;</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  }</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> }</div></div><!-- fragment -->
422 <a id="ad5ac843dd60a0ff7d4ab327f43fb88a5"></a>
423 <h2 class="memtitle"><span class="permalink"><a href="#ad5ac843dd60a0ff7d4ab327f43fb88a5">◆ </a></span>IsProfilingEnabled()</h2>
425 <div class="memitem">
426 <div class="memproto">
427 <table class="mlabels">
429 <td class="mlabels-left">
430 <table class="memname">
432 <td class="memname">bool IsProfilingEnabled </td>
434 <td class="paramname"></td><td>)</td>
439 <td class="mlabels-right">
440 <span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
443 </div><div class="memdoc">
444 <p>Checks whether profiling is enabled. Profiling is disabled by default. </p><dl class="section return"><dt>Returns</dt><dd>true if profiling is enabled, false otherwise. </dd></dl>
446 <p>Implements <a class="el" href="classarmnn_1_1_i_profiler.html#a1ebebad65df6718dc07aeab66550d0a7">IProfiler</a>.</p>
448 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00190">190</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
449 <div class="fragment"><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordflow">return</span> m_ProfilingEnabled;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> }</div></div><!-- fragment -->
452 <a id="a352a82f3a338acf06a20d290f605c489"></a>
453 <h2 class="memtitle"><span class="permalink"><a href="#a352a82f3a338acf06a20d290f605c489">◆ </a></span>Print()</h2>
455 <div class="memitem">
456 <div class="memproto">
457 <table class="mlabels">
459 <td class="mlabels-left">
460 <table class="memname">
462 <td class="memname">void Print </td>
464 <td class="paramtype">std::ostream & </td>
465 <td class="paramname"><em>outStream</em></td><td>)</td>
470 <td class="mlabels-right">
471 <span class="mlabels"><span class="mlabel">override</span><span class="mlabel">virtual</span></span> </td>
474 </div><div class="memdoc">
475 <p>Print stats for events in JSON Format to the given output stream. </p><dl class="params"><dt>Parameters</dt><dd>
476 <table class="params">
477 <tr><td class="paramdir">[out]</td><td class="paramname">outStream</td><td>The stream where to write the profiling results to. </td></tr>
482 <p>Implements <a class="el" href="classarmnn_1_1_i_profiler.html#aa369a934075a340fe59b7c9f481f9a57">IProfiler</a>.</p>
484 <p class="definition">Definition at line <a class="el" href="_profiling_8cpp_source.html#l00330">330</a> of file <a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a>.</p>
486 <p class="reference">References <a class="el" href="_profiling_8cpp_source.html#l00284">armnn::ExtractJsonObjects()</a>, <a class="el" href="_json_printer_8cpp_source.html#l00063">JsonPrinter::PrintArmNNHeader()</a>, <a class="el" href="_json_printer_8cpp_source.html#l00163">JsonPrinter::PrintFooter()</a>, <a class="el" href="_json_printer_8cpp_source.html#l00057">JsonPrinter::PrintHeader()</a>, <a class="el" href="_json_printer_8cpp_source.html#l00015">JsonPrinter::PrintJsonChildObject()</a>, and <a class="el" href="_json_printer_8cpp_source.html#l00158">JsonPrinter::PrintNewLine()</a>.</p>
488 <p class="reference">Referenced by <a class="el" href="_profiling_8cpp_source.html#l00176">Profiler::~Profiler()</a>.</p>
489 <div class="fragment"><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> {</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="comment">// Makes sure timestamps are output with 6 decimals, and save old settings.</span></div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  std::streamsize oldPrecision = outStream.precision();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  outStream.precision(6);</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  std::ios_base::fmtflags oldFlags = outStream.flags();</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  outStream.setf(std::ios::fixed);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  JsonPrinter printer(outStream);</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span> </div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="comment">// First find all the "inference" Events and print out duration measurements.</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordtype">int</span> baseLevel = -1;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  std::vector<const Event*> inferences;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  PopulateInferences(inferences, baseLevel);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> </div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <span class="comment">// Second map out descendants hierarchy</span></div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  std::map<const Event*, std::vector<const Event*>> descendantsMap;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  PopulateDescendants(descendantsMap);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> </div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  JsonChildObject inferenceObject{<span class="stringliteral">"inference_measurements"</span>};</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  JsonChildObject layerObject{<span class="stringliteral">"layer_measurements"</span>};</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  std::vector<JsonChildObject> workloadObjects;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  std::map<unsigned int, std::vector<JsonChildObject>> workloadToKernelObjects;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inferenceIndex = 0; inferenceIndex < inferences.size(); ++inferenceIndex)</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  {</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keyword">auto</span> inference = inferences[inferenceIndex];</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <a class="code" href="namespacearmnn.html#a50805c29c35b9903c2dea301d8091711">ExtractJsonObjects</a>(inferenceIndex, inference, inferenceObject, descendantsMap);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  }</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> </div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  printer.PrintHeader();</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  printer.PrintArmNNHeader();</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="comment">// print inference object, also prints child layer and kernel measurements</span></div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordtype">size_t</span> <span class="keywordtype">id</span>=0;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  printer.PrintJsonChildObject(inferenceObject, <span class="keywordtype">id</span>);</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> </div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="comment">// end of ArmNN</span></div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  printer.PrintNewLine();</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  printer.PrintFooter();</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span> </div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="comment">// end of main JSON object</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  printer.PrintNewLine();</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  printer.PrintFooter();</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  printer.PrintNewLine();</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment">// Restores previous precision settings.</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  outStream.flags(oldFlags);</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  outStream.precision(oldPrecision);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> }</div><div class="ttc" id="namespacearmnn_html_a50805c29c35b9903c2dea301d8091711"><div class="ttname"><a href="namespacearmnn.html#a50805c29c35b9903c2dea301d8091711">armnn::ExtractJsonObjects</a></div><div class="ttdeci">void ExtractJsonObjects(unsigned int inferenceIndex, const Event *parentEvent, JsonChildObject &parentObject, std::map< const Event *, std::vector< const Event *>> descendantsMap)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.html#l00284">Profiling.cpp:284</a></div></div>
490 </div><!-- fragment -->
493 <a id="afb5ba6c1110d2ea400f49ad7f3ac4d15"></a>
494 <h2 class="memtitle"><span class="permalink"><a href="#afb5ba6c1110d2ea400f49ad7f3ac4d15">◆ </a></span>UpdateEventTag()</h2>
496 <div class="memitem">
497 <div class="memproto">
498 <table class="memname">
500 <td class="memname">void UpdateEventTag </td>
502 <td class="paramname"></td><td>)</td>
506 </div><div class="memdoc">
510 <h2 class="groupheader">Friends And Related Function Documentation</h2>
511 <a id="a3269840850209f5ae295310924b6175f"></a>
512 <h2 class="memtitle"><span class="permalink"><a href="#a3269840850209f5ae295310924b6175f">◆ </a></span>GetProfilerEventSequenceSize</h2>
514 <div class="memitem">
515 <div class="memproto">
516 <table class="mlabels">
518 <td class="mlabels-left">
519 <table class="memname">
521 <td class="memname">size_t GetProfilerEventSequenceSize </td>
523 <td class="paramtype"><a class="el" href="classarmnn_1_1_profiler.html">armnn::Profiler</a> * </td>
524 <td class="paramname"><em>profiler</em></td><td>)</td>
529 <td class="mlabels-right">
530 <span class="mlabels"><span class="mlabel">friend</span></span> </td>
533 </div><div class="memdoc">
535 <p class="definition">Definition at line <a class="el" href="_profiler_tests_8cpp_source.html#l00022">22</a> of file <a class="el" href="_profiler_tests_8cpp_source.html">ProfilerTests.cpp</a>.</p>
536 <div class="fragment"><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> {</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordflow">if</span> (!profiler)</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  {</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <span class="keywordflow">return</span> <span class="keyword">static_cast<</span><span class="keywordtype">size_t</span><span class="keyword">></span>(-1);</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  }</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  <span class="keywordflow">return</span> profiler->m_EventSequence.size();</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> }</div></div><!-- fragment -->
539 <hr/>The documentation for this class was generated from the following files:<ul>
540 <li>src/armnn/<a class="el" href="_profiling_8hpp_source.html">Profiling.hpp</a></li>
541 <li>src/armnn/<a class="el" href="_profiling_8cpp_source.html">Profiling.cpp</a></li>
543 </div><!-- contents -->
544 </div><!-- doc-content -->
545 <!-- start footer part -->
546 <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
548 <li class="navelem"><a class="el" href="namespacearmnn.html">armnn</a></li><li class="navelem"><a class="el" href="classarmnn_1_1_profiler.html">Profiler</a></li>
549 <li class="footer">Generated on Fri Mar 13 2020 16:07:04 for ArmNN by
550 <a href="http://www.doxygen.org/index.html">
551 <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li>