aboutsummaryrefslogtreecommitdiff
path: root/21.08/_loaded_network_8cpp_source.xhtml
blob: 236a01677e124dd4e4b87df2d0ead1fb3b74bafa (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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
<!-- 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/LoadedNetwork.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.08</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('_loaded_network_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">LoadedNetwork.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_loaded_network_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 and Contributors. 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;</div><div class="line"><a name="l00006"></a><span class="lineno">    6</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_loaded_network_8hpp.xhtml">LoadedNetwork.hpp</a>&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_layer_8hpp.xhtml">Layer.hpp</a>&quot;</span></div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_graph_8hpp.xhtml">Graph.hpp</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_processes_8hpp.xhtml">Processes.hpp</a>&gt;</span></div><div class="line"><a name="l00010"></a><span class="lineno">   10</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="l00011"></a><span class="lineno">   11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_heap_profiling_8hpp.xhtml">HeapProfiling.hpp</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_working_mem_handle_8hpp.xhtml">WorkingMemHandle.hpp</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;</div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_backend_registry_8hpp.xhtml">armnn/BackendRegistry.hpp</a>&gt;</span></div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_logging_8hpp.xhtml">armnn/Logging.hpp</a>&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</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="l00017"></a><span class="lineno">   17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_tensor_handle_8hpp.xhtml">backendsCommon/TensorHandle.hpp</a>&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="include_2armnn_2backends_2_i_memory_manager_8hpp.xhtml">armnn/backends/IMemoryManager.hpp</a>&gt;</span></div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_mem_copy_workload_8hpp.xhtml">backendsCommon/MemCopyWorkload.hpp</a>&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_mem_sync_workload_8hpp.xhtml">backendsCommon/MemSyncWorkload.hpp</a>&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;</div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&gt;</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;</div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></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;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.xhtml">std</a>;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacearmnn_1_1profiling.xhtml">armnn::profiling</a>;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;</div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;<span class="keyword">namespace</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;{</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ExceptionType&gt;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;std::string ToErrorMessage(<span class="keyword">const</span> <span class="keywordtype">char</span> * prefix, <span class="keyword">const</span> ExceptionType &amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>)</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;{</div><div class="line"><a name="l00037"></a><span class="lineno">   37</span>&#160;    std::stringstream ss;</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    ss &lt;&lt; prefix &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; error.what();</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    <span class="keywordflow">return</span> ss.str();</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;}</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;<span class="keywordtype">void</span> AddLayerStructure(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;                       <span class="keyword">const</span> <a class="code" href="namespacearmnn_serializer.xhtml#a9a8118be7780e95363d631cbca7e7800">Layer</a>&amp; layer,</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;                       ProfilingGuid networkGuid)</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;    <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    std::string layerName = layer.GetNameStr().empty() ? <span class="stringliteral">&quot;&lt;Unnamed&gt;&quot;</span> : layer.GetNameStr();</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    timelineUtils-&gt;CreateNamedTypedChildEntity(layer.GetGuid(),</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;                                               networkGuid,</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;                                               layerName,</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;                                               LabelsAndEventClasses::LAYER_GUID);</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; input : layer.GetInputSlots())</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="keyword">const</span> IOutputSlot* source = input.GetConnectedOutputSlot();</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(source != NULL);</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        timelineUtils-&gt;CreateConnectionRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;                                                    source-&gt;GetOwningLayerGuid(),</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;                                                    layer.GetGuid());</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;    }</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;}</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;<span class="keywordtype">void</span> AddWorkloadStructure(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;                          std::unique_ptr&lt;IWorkload&gt;&amp; workload,</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;                          <span class="keyword">const</span> <a class="code" href="namespacearmnn_serializer.xhtml#a9a8118be7780e95363d631cbca7e7800">Layer</a>&amp; layer)</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;{</div><div class="line"><a name="l00066"></a><span class="lineno">   66</span>&#160;    <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    timelineUtils-&gt;CreateTypedEntity(workload-&gt;GetGuid(), LabelsAndEventClasses::WORKLOAD_GUID);</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    timelineUtils-&gt;MarkEntityWithLabel(workload-&gt;GetGuid(),</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;                                       layer.GetBackendId().Get(),</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;                                       LabelsAndEventClasses::BACKENDID_GUID);</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="comment">// Link the workload to the layer</span></div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    timelineUtils-&gt;CreateRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;                                      layer.GetGuid(),</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;                                      workload-&gt;GetGuid(),</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;                                      LabelsAndEventClasses::CHILD_GUID);</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;} <span class="comment">// anonymous</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;</div><div class="line"><a name="l00081"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a8e94a5375ad367ddee9c69e04e110a54">   81</a></span>&#160;std::unique_ptr&lt;LoadedNetwork&gt; <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a8e94a5375ad367ddee9c69e04e110a54">LoadedNetwork::MakeLoadedNetwork</a>(std::unique_ptr&lt;IOptimizedNetwork&gt; net,</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;                                                                std::string&amp; errorMessage,</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;                                                                <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_i_network_properties.xhtml">INetworkProperties</a>&amp; networkProperties,</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;                                                                <a class="code" href="classarmnn_1_1profiling_1_1_profiling_service.xhtml">profiling::ProfilingService</a>&amp;  profilingService)</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;{</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    std::unique_ptr&lt;LoadedNetwork&gt; loadedNetwork;</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    <span class="keyword">auto</span> Fail = [&amp;](<span class="keyword">const</span> std::exception&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>) -&gt; std::unique_ptr&lt;LoadedNetwork&gt;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    {</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;        errorMessage = ToErrorMessage(<span class="stringliteral">&quot;An error occurred when preparing the network workloads: &quot;</span>, error);</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(error) &lt;&lt; errorMessage;</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;        <span class="keywordflow">return</span> std::unique_ptr&lt;LoadedNetwork&gt;();</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;</div><div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    {</div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;        loadedNetwork.reset(<span class="keyword">new</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml">LoadedNetwork</a>(std::move(net), networkProperties, profilingService));</div><div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;    }</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_runtime_exception.xhtml">armnn::RuntimeException</a>&amp; error)</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    {</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;        <span class="keywordflow">return</span> Fail(error);</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    }</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_exception.xhtml">armnn::Exception</a>&amp; error)</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;        <span class="keywordflow">return</span> Fail(error);</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;    }</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</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">  110</span>&#160;        <span class="keywordflow">return</span> Fail(error);</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;    }</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="keywordflow">return</span> loadedNetwork;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;}</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;LoadedNetwork::LoadedNetwork(std::unique_ptr&lt;IOptimizedNetwork&gt; net,</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;                             <span class="keyword">const</span> <a class="code" href="structarmnn_1_1_i_network_properties.xhtml">INetworkProperties</a>&amp; networkProperties,</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;                             <a class="code" href="classarmnn_1_1profiling_1_1_profiling_service.xhtml">profiling::ProfilingService</a>&amp;  profilingService) :</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                             m_OptimizedNetwork(std::move(net)),</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;                             m_NetworkProperties(networkProperties),</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                             m_TensorHandleFactoryRegistry(),</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;                             m_ProfilingService(profilingService)</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;{</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;    <span class="comment">// Create a profiler and register it for the current thread.</span></div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;    m_Profiler = std::make_shared&lt;IProfiler&gt;();</div><div class="line"><a name="l00126"></a><span class="lineno">  126</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>(m_Profiler.get());</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;    m_Profiler-&gt;EnableProfiling(networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#a7e26a8e7f1878d82bef452ef3531eaeb">m_ProfilingEnabled</a>);</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;    <span class="keywordflow">if</span> (networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#a243bb6beeac3bee21a740198495f5aa1">m_OutputNetworkDetails</a>) m_Profiler-&gt;EnableNetworkDetailsToStdOut();</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;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; order = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;    <span class="comment">//First create tensor handlers, backends and workload factories.</span></div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="comment">//Handlers are created before workloads are.</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="comment">//Because workload creation can modify some of the handlers,</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    <span class="comment">//(for example the splitter and concat layers).</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;    {</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;        <span class="keyword">auto</span> <span class="keyword">const</span>&amp; backendId = layer-&gt;GetBackendId();</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;        <span class="keywordflow">if</span> (m_Backends.count(backendId) == 0)</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;        {</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;            <span class="keyword">auto</span> createBackend = <a class="code" href="namespacearmnn.xhtml#ac2807505b850738bc8a1991ce669dd47">BackendRegistryInstance</a>().<a class="code" href="classarmnn_1_1_backend_registry.xhtml#afc0c63ca8db8957b58826f6d7bd231b2">GetFactory</a>(backendId);</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;            <span class="keyword">auto</span> it = m_Backends.emplace(std::make_pair(backendId, createBackend()));</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;            <a class="code" href="classarmnn_1_1_i_backend_internal.xhtml">IBackendInternal</a>* backend = it.first-&gt;second.get();</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="keywordflow">if</span> (backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#af8f716b0eab6b9d63196d5a53d5fac81">SupportsTensorAllocatorAPI</a>())</div><div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;            {</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;                <span class="keyword">auto</span> workloadFactory = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#afd5a5e90515b31c0174f76ec8897e9b1">CreateWorkloadFactory</a>(</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;                    m_TensorHandleFactoryRegistry, m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions(),</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;                    <span class="keyword">static_cast&lt;</span><a class="code" href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">MemorySourceFlags</a><span class="keyword">&gt;</span>(m_NetworkProperties.m_InputSource),</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;                    static_cast&lt;MemorySourceFlags&gt;(m_NetworkProperties.m_OutputSource));</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;                m_WorkloadFactories.emplace(</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;                    std::make_pair(backendId, std::make_pair(std::move(workloadFactory), <span class="keyword">nullptr</span>)));</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;            }</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;            <span class="keywordflow">else</span></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;                <a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a693b40e6b94e958836aeb0410ca186bd">IBackendInternal::IMemoryManagerSharedPtr</a> memoryManager = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a0e8cb8533d1d0b2cb93f926dac11dd16">CreateMemoryManager</a>();</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                <span class="keyword">auto</span> workloadFactory = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#afd5a5e90515b31c0174f76ec8897e9b1">CreateWorkloadFactory</a>(</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                    memoryManager, m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions());</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;                m_WorkloadFactories.emplace(</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                    std::make_pair(backendId, std::make_pair(std::move(workloadFactory), memoryManager)));</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">  165</span>&#160;        }</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;    }</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;    <span class="keywordflow">if</span> (!networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a>)</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="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;        {</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;            <span class="keyword">auto</span>&amp; workloadFactory = GetWorkloadFactory(*layer);</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;            <span class="keywordflow">switch</span> (layer-&gt;GetType())</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">  176</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a115bfc5d633eae55c67f9588acdd2bf9">LayerType::MemImport</a>:</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;                {</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;                    <span class="comment">// If IsImportEnabled is true then we need to set IsMemoryManaged</span></div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;                    <span class="comment">// to false when creating TensorHandles</span></div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;                    layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;                                               workloadFactory,</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;                                               !m_NetworkProperties.m_ImportEnabled);</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">default</span>:</div><div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;                {</div><div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;                    <span class="comment">// Look for a layer with 1 OutputSlot which has 1 connection and that connection is an Output Layer</span></div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;                    <span class="comment">// If Export is enabled disable memory management so we can export, otherwise we do a copy</span></div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;                    <span class="keywordflow">if</span> ((layer-&gt;GetNumOutputSlots() == 1) &amp;&amp;</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;                        (layer-&gt;GetOutputSlots()[0].GetNumConnections() == 1) &amp;&amp;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;                        (layer-&gt;GetOutputSlots()[0].GetConnection(0)-&gt;GetOwningLayer().GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</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;                        layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;                                                   workloadFactory,</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;                                                   !m_NetworkProperties.m_ExportEnabled);</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;                    }</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;                    <span class="keywordflow">else</span></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">  200</span>&#160;                        layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry, workloadFactory);</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;                    }</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;                }</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;            }</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;    }</div><div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;</div><div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;                        <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    {</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;        timelineUtils-&gt;CreateTypedEntity(networkGuid, LabelsAndEventClasses::NETWORK_GUID);</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;        <span class="comment">// Mark the network with a start of life event</span></div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;        timelineUtils-&gt;RecordEvent(networkGuid, LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;        <span class="comment">// and with the process ID</span></div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;        <span class="keywordtype">int</span> processID = <a class="code" href="namespacearmnn_utils_1_1_processes.xhtml#a1d95dea376acbd82dde773e05db454be">armnnUtils::Processes::GetCurrentId</a>();</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;        std::stringstream ss;</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;        ss &lt;&lt; processID;</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;        timelineUtils-&gt;MarkEntityWithLabel(networkGuid, ss.str(), LabelsAndEventClasses::PROCESS_ID_GUID);</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;    }</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;    <span class="comment">//Then create workloads.</span></div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    {</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;        <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;        {</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;            <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;            AddLayerStructure(timelineUtils, *layer, networkGuid);</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;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_workload_factory.xhtml">IWorkloadFactory</a>&amp; workloadFactory = GetWorkloadFactory(*layer);</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;        <span class="keywordflow">switch</span> (layer-&gt;GetType())</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">  235</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>:</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;            {</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;                <span class="comment">// Inputs and outputs are treated in a special way - see EnqueueInput() and EnqueueOutput().</span></div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;            }</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;        <span class="keywordflow">default</span>:</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="keyword">auto</span> workload = layer-&gt;CreateWorkload(workloadFactory);</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;                <span class="keywordflow">if</span> (!workload)</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;                {</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;                    <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> layerName =</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;                        layer-&gt;GetNameStr().length() != 0 ? layer-&gt;GetName() : <span class="stringliteral">&quot;&lt;Unnamed&gt;&quot;</span>;</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;                    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;                        fmt::format(<span class="stringliteral">&quot;No workload created for layer (name: &#39;{0}&#39; type: &#39;{1}&#39;) (compute &#39;{2}&#39;)&quot;</span>,</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;                                    layerName, static_cast&lt;int&gt;(layer-&gt;GetType()), layer-&gt;GetBackendId().Get()</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;                    ));</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;</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;                <span class="keywordflow">if</span> (timelineUtils)</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;                    <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;                    AddWorkloadStructure(timelineUtils, workload, *layer);</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">  260</span>&#160;</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;                <span class="comment">// For async networks ConstantWorkloads are managed exclusively by LoadedNetwork</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;                <span class="comment">// and are separated out from the other workloads</span></div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;                <span class="keywordflow">if</span> (networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a> &amp;&amp; layer-&gt;GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;                {</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;                    m_ConstantWorkloads[layer-&gt;GetGuid()] = std::move(workload);</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">else</span></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;                    m_WorkloadQueue.push_back(move(workload));</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="comment">// release the constant data in the layer..</span></div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;                layer-&gt;ReleaseConstantData();</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;                <span class="keywordflow">break</span>;</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;            }</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;    }</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;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadFactory : m_WorkloadFactories)</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;        workloadFactory.second.first-&gt;AfterWorkloadsCreated();</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;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    {</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;        <span class="comment">// Commit to send the post-optimisation network structure</span></div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;        timelineUtils-&gt;Commit();</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;    }</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;    <span class="keywordflow">if</span> (!networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a>)</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;    {</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;        <span class="comment">// Set up memory.</span></div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().AllocateDynamicBuffers();</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="comment">// Now that the intermediate tensor memory has been set-up,</span></div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;        <span class="comment">// do any post allocation configuration for each workload.</span></div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;workload : m_WorkloadQueue)</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        {</div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;            workload-&gt;PostAllocationConfigure();</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;        }</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;    {</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        AllocateAndExecuteConstantWorkloads();</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;}</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;<span class="keywordtype">void</span> LoadedNetwork::AllocateAndExecuteConstantWorkloads()</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;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; order = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph();</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</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">if</span> (layer-&gt;GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</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="keyword">const</span> <span class="keyword">auto</span>&amp; outSlot = layer-&gt;GetOutputSlots()[0];</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span> factoryId = outSlot.GetTensorHandleFactoryId();</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(factoryId != <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a9c95f90eb40e31f629e0e2947b8bc6f9">ITensorHandleFactory::LegacyFactoryId</a>);</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;            <span class="keyword">auto</span>&amp; workloadFactory = GetWorkloadFactory(*layer);</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;            layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry, workloadFactory);</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = outSlot.GetOutputHandler().GetData();</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;            m_ConstantTensorHandles[layer-&gt;GetGuid()] = tensorHandle;</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;            tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a5cceed8b707a09bf27eb61f17acf8a88">Allocate</a>();</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;            <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> memDesc;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;            memDesc.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>.push_back(tensorHandle);</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;            m_ConstantWorkloads[layer-&gt;GetGuid()]-&gt;ExecuteAsync(memDesc);</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">  331</span>&#160;}</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a23e33c3caadba06bcd5b50dc2c23c19e">  334</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a23e33c3caadba06bcd5b50dc2c23c19e">LoadedNetwork::SendNetworkStructure</a>()</div><div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;{</div><div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; order = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;    ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;                        <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;    timelineUtils-&gt;CreateTypedEntity(networkGuid, LabelsAndEventClasses::NETWORK_GUID);</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;    {</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;        <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;        AddLayerStructure(timelineUtils, *layer, networkGuid);</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;        <span class="keywordflow">switch</span> (layer-&gt;GetType())</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;        {</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>:</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;        {</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;            <span class="comment">// Inputs and outputs are treated in a special way - see EnqueueInput() and EnqueueOutput().</span></div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;            <span class="keywordflow">break</span>;</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="keywordflow">default</span>:</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;            {</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; workload : m_WorkloadQueue)</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;                <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;                AddWorkloadStructure(timelineUtils, workload, *layer);</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="keywordflow">break</span>;</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;            }</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;        }</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">// Commit to send the post-optimisation network structure</span></div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;    timelineUtils-&gt;Commit();</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#ac8be6c967db9e797ade32fa3db497422">  371</a></span>&#160;profiling::ProfilingGuid <a class="code" href="classarmnn_1_1_loaded_network.xhtml#ac8be6c967db9e797ade32fa3db497422">LoadedNetwork::GetNetworkGuid</a>()</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;{</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    <span class="keywordflow">return</span> m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#af616683424cb40d83b5a923db7f06f11">  376</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#af616683424cb40d83b5a923db7f06f11">LoadedNetwork::GetInputTensorInfo</a>(<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId)<span class="keyword"> const</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; inputLayer : m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().GetInputLayers())</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;        <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(inputLayer-&gt;GetNumOutputSlots() == 1, <span class="stringliteral">&quot;Input layer should have exactly 1 output slot&quot;</span>);</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;        <span class="keywordflow">if</span> (inputLayer-&gt;GetBindingId() == layerId)</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;        {</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;            <span class="keywordflow">return</span> inputLayer-&gt;GetOutputSlot(0).GetTensorInfo();</div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;        }</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;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;No input layer is associated with id {}&quot;</span>, layerId));</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a2b6b57945bc68f659e08d28c8a015e91">  390</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a2b6b57945bc68f659e08d28c8a015e91">LoadedNetwork::GetOutputTensorInfo</a>(<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId)<span class="keyword"> const</span></div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; outputLayer : m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().GetOutputLayers())</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    {</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(outputLayer-&gt;GetNumInputSlots() == 1, <span class="stringliteral">&quot;Output layer should have exactly 1 input slot&quot;</span>);</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(outputLayer-&gt;GetInputSlot(0).GetConnection(), <span class="stringliteral">&quot;Input slot on Output layer must be connected&quot;</span>);</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;        <span class="keywordflow">if</span> (outputLayer-&gt;GetBindingId() == layerId)</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;        {</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;            <span class="keywordflow">return</span> outputLayer-&gt;GetInputSlot(0).GetConnection()-&gt;GetTensorInfo();</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;        }</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;    }</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="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;No output layer is associated with id {}&quot;</span>, layerId));</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;}</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;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_workload_factory.xhtml">IWorkloadFactory</a>&amp; LoadedNetwork::GetWorkloadFactory(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>&amp; layer)<span class="keyword"> const</span></div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_workload_factory.xhtml">IWorkloadFactory</a>* workloadFactory = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;    <span class="keyword">auto</span> it = m_WorkloadFactories.find(layer.<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>());</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="keywordflow">if</span> (it ==  m_WorkloadFactories.end())</div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    {</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_runtime_exception.xhtml">RuntimeException</a>(fmt::format(<span class="stringliteral">&quot;No workload factory for {0} to be used for layer: {1}&quot;</span>,</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;                                           layer.<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>().<a class="code" href="classarmnn_1_1_backend_id.xhtml#af7445617163d3f07c47b92ae56c6cf8b">Get</a>(),</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;                                           layer.<a class="code" href="classarmnn_1_1_layer.xhtml#a9a97cb6d32661a57fc33bd29b8e41ff4">GetNameStr</a>()),</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;                                           <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;    }</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    workloadFactory = it-&gt;second.first.get();</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(workloadFactory, <span class="stringliteral">&quot;No workload factory&quot;</span>);</div><div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;</div><div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;    std::string reasonIfUnsupported;</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(<a class="code" href="classarmnn_1_1_i_workload_factory.xhtml#a74dc9ec1a223eab8b072368b2dacee87">IWorkloadFactory::IsLayerSupported</a>(layer,</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;                                                        reasonIfUnsupported,</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;                                                        m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions()),</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;        <span class="stringliteral">&quot;Factory does not support layer&quot;</span>);</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(reasonIfUnsupported);</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;    <span class="keywordflow">return</span> *workloadFactory;</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;}</div><div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;</div><div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160;<span class="keyword">namespace </span>{</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;<span class="comment">// Non-copyable class owning accelerator-specific tensor data.</span></div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;<span class="keyword">class </span>TensorPin</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;{</div><div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    TensorPin(std::unique_ptr&lt;ITensorHandle&gt; handle, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>, <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>)</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;        : m_TensorHandle(std::move(handle))</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;        , m_TensorInfo(info)</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;        , m_Id(<span class="keywordtype">id</span>)</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;    {</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;    }</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* GetTensorHandle()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_TensorHandle.get(); }</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; <a class="code" href="namespacearmnn.xhtml#af7ec4c0fa4375a45a70e4e31f3d8af47">GetTensorInfo</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_TensorInfo; }</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> GetBindingId()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_Id; }</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;    std::unique_ptr&lt;ITensorHandle&gt; m_TensorHandle;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> m_TensorInfo;</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> m_Id;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;};</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;<span class="keyword">static</span> <span class="keyword">const</span> TensorPin&amp; GetTensorPin(<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>,</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;    <span class="keyword">const</span> std::vector&lt;TensorPin&gt;&amp; pins,</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;    <span class="keywordtype">char</span> <span class="keyword">const</span>* bindingPointDesc)</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;    <span class="keyword">auto</span> it = std::find_if(pins.begin(), pins.end(),</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;        [id](<span class="keyword">const</span> TensorPin&amp; pin)</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;        <span class="keywordflow">return</span> pin.GetBindingId() == id;</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">  464</span>&#160;</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;    <span class="keywordflow">if</span> (it != pins.end())</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;    {</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;        <span class="keywordflow">return</span> *it;</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    }</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;    {</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(fmt::format(<span class="stringliteral">&quot;No tensor supplied for {0} {1}&quot;</span>, bindingPointDesc, <span class="keywordtype">id</span>));</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;    }</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;}</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;<span class="comment">// Stores data that needs to be kept accessible for the entire execution of a workload.</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;<span class="keyword">class </span>WorkloadData</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;{</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;<span class="keyword">public</span>:</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;    WorkloadData(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">InputTensors</a>&amp; inputTensors, <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors)</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;    {</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;        m_InputTensorPins.reserve(inputTensors.size());</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;        m_OutputTensorPins.reserve(outputTensors.size());</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="keywordflow">for</span> (<span class="keyword">auto</span> inputTensorPair : inputTensors)</div><div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;        {</div><div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;            <span class="keyword">auto</span> inputTensor = inputTensorPair.second;</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;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;                std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.GetInfo(),inputTensor.GetMemoryArea());</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;            <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = inputTensorPair.first;</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;            m_InputTensorPins.emplace_back(std::move(tensorHandle), inputTensor.GetInfo(), layerId);</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;        }</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;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> outputTensorPair : outputTensors)</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;        {</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;            <span class="keyword">auto</span> outputTensor = outputTensorPair.second;</div><div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;</div><div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;                std::make_unique&lt;PassthroughTensorHandle&gt;(outputTensor.GetInfo(), outputTensor.GetMemoryArea());</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;            <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = outputTensorPair.first;</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;            m_OutputTensorPins.emplace_back(std::move(tensorHandle), outputTensor.GetInfo(), layerId);</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">  507</span>&#160;    <span class="keyword">const</span> TensorPin&amp; GetInputTensorPin(<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;        <span class="keywordflow">return</span> GetTensorPin(<span class="keywordtype">id</span>, m_InputTensorPins, <span class="stringliteral">&quot;input&quot;</span>);</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">  512</span>&#160;    <span class="keyword">const</span> TensorPin&amp; GetOutputTensorPin(<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;        <span class="keywordflow">return</span> GetTensorPin(<span class="keywordtype">id</span>, m_OutputTensorPins, <span class="stringliteral">&quot;output&quot;</span>);</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">  517</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;    std::vector&lt;TensorPin&gt; m_InputTensorPins;</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;    std::vector&lt;TensorPin&gt; m_OutputTensorPins;</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">  522</span>&#160;</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;}</div><div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;</div><div class="line"><a name="l00525"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a878c3febb600fd2ccf3b5cb1f9a61e27">  525</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a878c3febb600fd2ccf3b5cb1f9a61e27">LoadedNetwork::EnqueueWorkload</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">InputTensors</a>&amp; inputTensors,</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;                                      <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors)</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;{</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph();</div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;    <span class="comment">// Walk graph to determine the order of execution.</span></div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    <span class="keywordflow">if</span> (graph.<a class="code" href="classarmnn_1_1_graph.xhtml#afdf8eb85585a798ad0e936bde884d87b">GetNumLayers</a>() &lt; 2)</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;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407a7b83d3f08fa392b79e3f553b585971cd">warning</a>) &lt;&lt; <span class="stringliteral">&quot;IRuntime::EnqueueWorkload()::Less than two nodes in graph&quot;</span>;</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">Status::Failure</a>;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    }</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">// Data that must be kept alive for the entire execution of the workload.</span></div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;    WorkloadData workloadData(inputTensors, outputTensors);</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;    <span class="keywordflow">if</span> (graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>() != inputTensors.size())</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;    {</div><div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Number of inputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;    }</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;    <span class="comment">// For each input to the network, call EnqueueInput with the data passed by the user.</span></div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    {</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;        <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;PrepareInputs&quot;</span>);</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;        m_InputQueue.clear();</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;        m_InputQueue.reserve(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>());</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* inputLayer : graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">GetInputLayers</a>())</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;        {</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;            <span class="keyword">const</span> TensorPin&amp; pin = workloadData.GetInputTensorPin(inputLayer-&gt;GetBindingId());</div><div class="line"><a name="l00553"></a><span class="lineno">  553</span>&#160;            EnqueueInput(*inputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;        }</div><div class="line"><a name="l00555"></a><span class="lineno">  555</span>&#160;    }</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    <span class="comment">// For each output to the network, call EnqueueOutput with the data passed by the user.</span></div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    {</div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;        <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;PrepareOutputs&quot;</span>);</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;        m_OutputQueue.clear();</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;        m_OutputQueue.reserve(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">GetNumOutputs</a>());</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* outputLayer : graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>())</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;        {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;            <span class="keyword">const</span> TensorPin&amp; pin = workloadData.GetOutputTensorPin(outputLayer-&gt;GetBindingId());</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;            EnqueueOutput(*outputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;        }</div><div class="line"><a name="l00567"></a><span class="lineno">  567</span>&#160;    }</div><div class="line"><a name="l00568"></a><span class="lineno">  568</span>&#160;</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;                        <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;    ProfilingGuid inferenceGuid = m_ProfilingService.GetNextGuid();</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;    {</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;        <span class="comment">// Add inference timeline trace if profiling is enabled.</span></div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;        ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;        timelineUtils-&gt;CreateTypedEntity(inferenceGuid, LabelsAndEventClasses::INFERENCE_GUID);</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;        timelineUtils-&gt;CreateRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;                                          networkGuid,</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;                                          inferenceGuid,</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;                                          LabelsAndEventClasses::EXECUTION_OF_GUID);</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</div><div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;    }</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <span class="keywordtype">bool</span> executionSucceeded = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    {</div><div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;        <span class="keywordflow">if</span> (m_ProfilingService.IsProfilingEnabled())</div><div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;        {</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;            m_ProfilingService.IncrementCounterValue(armnn::profiling::INFERENCES_RUN);</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;        }</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;        <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;Execute&quot;</span>);</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;        <a class="code" href="_heap_profiling_8hpp.xhtml#aeeb927880fc4ffc2eea754a67d884a53">ARMNN_SCOPED_HEAP_PROFILING</a>(<span class="stringliteral">&quot;Executing&quot;</span>);</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;        executionSucceeded = Execute(timelineUtils, inferenceGuid);</div><div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;    }</div><div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;    {</div><div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;        <span class="comment">// Add end of life of the inference timeline if profiling is enabled.</span></div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS);</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;        timelineUtils-&gt;Commit();</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    }</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    <span class="keywordflow">return</span> executionSucceeded ? <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70ba505a83f220c02df2f85c3810cd9ceb38">Status::Success</a> : <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">Status::Failure</a>;</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;}</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::EnqueueInput(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>&amp; layer, <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;{</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    <span class="keywordflow">if</span> (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;    {</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueInput: given layer not an InputLayer&quot;</span>);</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;    }</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    <span class="keywordflow">if</span> (tensorHandle == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    {</div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueInput: tensorHandle must not be NULL&quot;</span>);</div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    }</div><div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;</div><div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;    <a class="code" href="structarmnn_1_1_mem_copy_queue_descriptor.xhtml">InputQueueDescriptor</a> inputQueueDescriptor;</div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;    <a class="code" href="structarmnn_1_1_workload_info.xhtml">WorkloadInfo</a> <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>;</div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;</div><div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;    inputQueueDescriptor.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(tensorHandle);</div><div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#ac97905bfa0daab357b91df1347600309">m_InputTensorInfos</a>.push_back(tensorInfo);</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(layer.<a class="code" href="classarmnn_1_1_layer.xhtml#a1594bddc87d6477df300317658f566bb">GetNumOutputSlots</a>() == 1, <span class="stringliteral">&quot;Can only handle Input Layer with one output&quot;</span>);</div><div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_output_handler.xhtml">OutputHandler</a>&amp; handler = layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af2c0edc7ea62a8baaec4d3d9b2b09256">GetOutputHandler</a>();</div><div class="line"><a name="l00625"></a><span class="lineno">  625</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; outputTensorInfo = handler.GetTensorInfo();</div><div class="line"><a name="l00626"></a><span class="lineno">  626</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* outputTensorHandle = handler.GetData();</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(outputTensorHandle != <span class="keyword">nullptr</span>,</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;                     <span class="stringliteral">&quot;Data should have been allocated.&quot;</span>);</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;    inputQueueDescriptor.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>.push_back(outputTensorHandle);</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#a67b178f8a836bc1e52b8de109760adfd">m_OutputTensorInfos</a>.push_back(outputTensorInfo);</div><div class="line"><a name="l00631"></a><span class="lineno">  631</span>&#160;</div><div class="line"><a name="l00632"></a><span class="lineno">  632</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">MemorySourceFlags</a> importFlags = outputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">GetImportFlags</a>();</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;    <span class="keywordtype">bool</span> needMemCopy = <span class="keyword">true</span>;</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    <span class="keywordflow">if</span> (m_NetworkProperties.m_ImportEnabled)  <span class="comment">// Try import the input tensor</span></div><div class="line"><a name="l00635"></a><span class="lineno">  635</span>&#160;    {</div><div class="line"><a name="l00636"></a><span class="lineno">  636</span>&#160;        <span class="keywordflow">if</span>(<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(importFlags, m_NetworkProperties.m_InputSource))</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;        {</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;            needMemCopy = <span class="keyword">false</span>;</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;            <span class="comment">// This assumes a CPU Tensor handle</span></div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;            <span class="keywordtype">void</span>* mem = tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">Map</a>(<span class="keyword">false</span>);</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;            <span class="keywordflow">if</span> (outputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(mem, m_NetworkProperties.m_InputSource))</div><div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;            {</div><div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;                tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;                <span class="keywordflow">return</span>; <span class="comment">// No need for a workload since the import has been done.</span></div><div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;            }</div><div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;            tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;EnqueueInput: Memory Import failed&quot;</span>);</div><div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;        }</div><div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;    }</div><div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    <span class="keywordflow">if</span> (needMemCopy)</div><div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    {</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;        <span class="comment">// Create a mem copy workload for input since we did not import</span></div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;        std::unique_ptr&lt;IWorkload&gt; inputWorkload = std::make_unique&lt;CopyMemGenericWorkload&gt;(inputQueueDescriptor, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>);</div><div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;</div><div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(inputWorkload, <span class="stringliteral">&quot;No input workload created&quot;</span>);</div><div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;</div><div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;        std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;                            <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160;        <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;        {</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;            <span class="comment">// Add Input Workload to the post-optimisation network structure</span></div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;            AddWorkloadStructure(timelineUtils, inputWorkload, layer);</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;            timelineUtils-&gt;Commit();</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;        }</div><div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;</div><div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160;        m_InputQueue.push_back(move(inputWorkload));</div><div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    }</div><div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;}</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::EnqueueOutput(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>&amp; layer, <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;{</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    <span class="keywordflow">if</span> (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>)</div><div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;    {</div><div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueOutput: given layer not an OutputLayer&quot;</span>);</div><div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;    }</div><div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;</div><div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;    <span class="keywordflow">if</span> (tensorHandle == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;    {</div><div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueOutput: tensorHandle must not be NULL&quot;</span>);</div><div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;    }</div><div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;</div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    <a class="code" href="structarmnn_1_1_mem_copy_queue_descriptor.xhtml">OutputQueueDescriptor</a> outputQueueDescriptor;</div><div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160;    <a class="code" href="structarmnn_1_1_workload_info.xhtml">WorkloadInfo</a> <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>;</div><div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    outputQueueDescriptor.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>.push_back(tensorHandle);</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;    info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#a67b178f8a836bc1e52b8de109760adfd">m_OutputTensorInfos</a>.push_back(tensorInfo);</div><div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;</div><div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(layer.<a class="code" href="classarmnn_1_1_layer.xhtml#abc0660dc440c8a285b456c9ef6383c26">GetNumInputSlots</a>() == 1, <span class="stringliteral">&quot;Output Layer should have exactly one input.&quot;</span>);</div><div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;    <span class="comment">// Gets the output handler from the previous node.</span></div><div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_output_handler.xhtml">OutputHandler</a>&amp; outputHandler = layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0].GetConnectedOutputSlot()-&gt;GetOutputHandler();</div><div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; inputTensorInfo = outputHandler.GetTensorInfo();</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = outputHandler.GetData();</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(inputTensorHandle != <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Data should have been allocated.&quot;</span>);</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;    <span class="comment">// Try import the output tensor.</span></div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;    <span class="comment">// Note: We can only import the output pointer if all of the following  hold true:</span></div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;    <span class="comment">// a) The imported pointer is aligned sufficiently</span></div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;    <span class="comment">// b) The tensor has zero padding</span></div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;    <span class="comment">// c) There is only one connection to the OutputSlot and it is to an OutputLayer.</span></div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;    <span class="comment">// d) The output pointer is allocated via malloc. (Other types will be supported in a later release)</span></div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;    <span class="comment">// e) m_IsExportEnabled must be set to true</span></div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;    <span class="keywordtype">bool</span> needMemCopy = <span class="keyword">true</span>;</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;    <span class="keywordflow">if</span> (m_NetworkProperties.m_ExportEnabled &amp;&amp;</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;        (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0].GetConnectedOutputSlot()-&gt;GetNumConnections() == 1))</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;    {</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;        <span class="keywordflow">if</span>(layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0].GetConnectedOutputSlot()-&gt;GetOwningLayer().GetType() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;        {</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">MemorySourceFlags</a> importFlags = inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">GetImportFlags</a>();</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;            <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(importFlags, m_NetworkProperties.m_OutputSource))</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;            {</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;                needMemCopy = <span class="keyword">false</span>;</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;                <span class="keywordtype">void</span> *mem = tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">Map</a>(<span class="keyword">false</span>);</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;                <span class="keywordtype">bool</span> importOk = inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(mem, m_NetworkProperties.m_OutputSource);</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;                tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;</div><div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;                <span class="keywordflow">if</span> (importOk)</div><div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;                {</div><div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;                    <span class="comment">// Insert synchronization workload</span></div><div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160;                    <a class="code" href="structarmnn_1_1_mem_sync_queue_descriptor.xhtml">MemSyncQueueDescriptor</a> syncDesc;</div><div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;                    syncDesc.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(inputTensorHandle);</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;                    info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#ac97905bfa0daab357b91df1347600309">m_InputTensorInfos</a>.push_back(inputTensorInfo);</div><div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;                    <span class="keyword">auto</span> syncWorkload = std::make_unique&lt;SyncMemGenericWorkload&gt;(syncDesc, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>);</div><div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;                    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(syncWorkload, <span class="stringliteral">&quot;No sync workload created&quot;</span>);</div><div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;                    m_OutputQueue.push_back(move(syncWorkload));</div><div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;                }</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;                {</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;                    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;EnqueueOutput: Memory Export failed&quot;</span>);</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;                }</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;            }</div><div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;        }</div><div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;    }</div><div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;    <span class="keywordflow">if</span> (needMemCopy)</div><div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;    {</div><div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;        <span class="comment">// If we got here then we didn&#39;t export the memory, so add an output workload which performs a memcopy.</span></div><div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;        outputQueueDescriptor.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(inputTensorHandle);</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;        info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#ac97905bfa0daab357b91df1347600309">m_InputTensorInfos</a>.push_back(inputTensorInfo);</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;        std::unique_ptr&lt;IWorkload&gt; outputWorkload =</div><div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;            std::make_unique&lt;CopyMemGenericWorkload&gt;(outputQueueDescriptor, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>);</div><div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(outputWorkload, <span class="stringliteral">&quot;No output workload created&quot;</span>);</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;</div><div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;        std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;            <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;        <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160;        {</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;            <span class="comment">// Add Output Workload to the post-optimisation network structure</span></div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;            AddWorkloadStructure(timelineUtils, outputWorkload, layer);</div><div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;            timelineUtils-&gt;Commit();</div><div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;        }</div><div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;</div><div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;        m_OutputQueue.push_back(move(outputWorkload));</div><div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;    }</div><div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;}</div><div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160;</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::AllocateWorkingMemory(std::lock_guard&lt;std::mutex&gt;&amp; lock)</div><div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;{</div><div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;    <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;Working Memory Allocation&quot;</span>);</div><div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;</div><div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;    <span class="comment">// this unused parameter makes sure we can only call this function with a valid lock</span></div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(lock);</div><div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;</div><div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;    <span class="keywordflow">if</span> (m_IsWorkingMemAllocated)</div><div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;    {</div><div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;    }</div><div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadFactory : m_WorkloadFactories)</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;    {</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        <a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a693b40e6b94e958836aeb0410ca186bd">IBackendInternal::IMemoryManagerSharedPtr</a> memoryManager = workloadFactory.second.second;</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        <span class="keywordflow">if</span> (memoryManager)</div><div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;        {</div><div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;            memoryManager-&gt;Acquire();</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;        }</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;    }</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;    m_TensorHandleFactoryRegistry.AquireMemory();</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;    m_IsWorkingMemAllocated = <span class="keyword">true</span>;</div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;}</div><div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;</div><div class="line"><a name="l00781"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#aaf8558a23ae9be6e7ea165989f1fa808">  781</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#aaf8558a23ae9be6e7ea165989f1fa808">LoadedNetwork::FreeWorkingMemory</a>()</div><div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;{</div><div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;    std::lock_guard&lt;std::mutex&gt; lockGuard(m_WorkingMemMutex);</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;    <span class="keywordflow">if</span> (!m_IsWorkingMemAllocated)</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;    {</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;    }</div><div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;    <span class="comment">// Informs the memory managers to release memory in it&#39;s respective memory group</span></div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadFactory : m_WorkloadFactories)</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;    {</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;        <a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a693b40e6b94e958836aeb0410ca186bd">IBackendInternal::IMemoryManagerSharedPtr</a> memoryManager = workloadFactory.second.second;</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;        <span class="keywordflow">if</span> (memoryManager)</div><div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;        {</div><div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;            memoryManager-&gt;Release();</div><div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160;        }</div><div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;    }</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;    m_TensorHandleFactoryRegistry.ReleaseMemory();</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;    m_IsWorkingMemAllocated = <span class="keyword">false</span>;</div><div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;}</div><div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160;</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#aaedc133d26fe9a55f6565c8c47d5a8f9">LoadedNetwork::Execute</a>(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;                            profiling::ProfilingGuid inferenceGuid)</div><div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;{</div><div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;    <span class="keywordtype">bool</span> success = <span class="keyword">true</span>;</div><div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;</div><div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;    <span class="keyword">auto</span> Fail = [&amp;](<span class="keyword">const</span> std::exception&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>)</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;    {</div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(error) &lt;&lt; <span class="stringliteral">&quot;An error occurred attempting to execute a workload: &quot;</span> &lt;&lt; error.what();</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;        success = <span class="keyword">false</span>;</div><div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;    };</div><div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;    {</div><div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;        std::lock_guard&lt;std::mutex&gt; lockGuard(m_WorkingMemMutex);</div><div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;        AllocateWorkingMemory(lockGuard);</div><div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;        ProfilingDynamicGuid workloadInferenceID(0);</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;        <span class="keyword">auto</span> ExecuteQueue = [&amp;timelineUtils, &amp;workloadInferenceID, &amp;inferenceGuid](<a class="code" href="classarmnn_1_1_loaded_network.xhtml#a48fe2df41d914c38c913160956acc706">WorkloadQueue</a>&amp; queue)</div><div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160;        {</div><div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; workload : queue)</div><div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;            {</div><div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;                <span class="keywordflow">if</span>(timelineUtils)</div><div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;                {</div><div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;                    workloadInferenceID = timelineUtils-&gt;RecordWorkloadInferenceAndStartOfLifeEvent(workload-&gt;GetGuid(),</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;                                                                                                    inferenceGuid);</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;                }</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;                workload-&gt;Execute();</div><div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;                <span class="keywordflow">if</span>(timelineUtils)</div><div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;                {</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;                    timelineUtils-&gt;RecordEndOfLifeEvent(workloadInferenceID);</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;                }</div><div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160;            }</div><div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;        };</div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;        ExecuteQueue(m_InputQueue);</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;        ExecuteQueue(m_WorkloadQueue);</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;        ExecuteQueue(m_OutputQueue);</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;    }</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_runtime_exception.xhtml">RuntimeException</a>&amp; error)</div><div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;    {</div><div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;        Fail(error);</div><div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;    }</div><div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;    {</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;        Fail(error);</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;    }</div><div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;</div><div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;    <span class="keywordflow">return</span> success;</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;}</div><div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::EnqueueInput(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>&amp; layer,</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;                                 <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a>&amp; inputTensor,</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;                                 <a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml">WorkingMemHandle</a>&amp; context)</div><div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;{</div><div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;    <span class="keywordflow">if</span> (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;    {</div><div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueInput: given layer not an InputLayer&quot;</span>);</div><div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160;    }</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;    <a class="code" href="namespacearmnn.xhtml#afad4088a9a058114ee5f87246f87bf49">LayerGuid</a> <span class="keywordtype">id</span> = layer.<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>();</div><div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;    <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> descriptor = context.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a70e0e7889988786ac840bf2785f3db95">GetWorkingMemDescriptor</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;</div><div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">MemorySourceFlags</a> importFlags = descriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>[0]-&gt;GetImportFlags();</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;    <span class="keywordflow">if</span> (m_NetworkProperties.m_ImportEnabled)  <span class="comment">// Try import the input tensor</span></div><div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160;    {</div><div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(importFlags, m_NetworkProperties.m_InputSource) )</div><div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;        {</div><div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;            <span class="comment">// This assumes a CPU Tensor handle</span></div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;                    std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(),</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;                                                                      inputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160;</div><div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;            <span class="keywordtype">void</span>* mem = tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">Map</a>(<span class="keyword">false</span>);</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;            <span class="keywordflow">if</span> (descriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>[0]-&gt;Import(mem, m_NetworkProperties.m_InputSource))</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;            {</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;                tensorHandle-&gt;Unmap();</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;            }</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;            tensorHandle-&gt;Unmap();</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;EnqueueInput: Memory Import failed&quot;</span>);</div><div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;        }</div><div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;        {</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;EnqueueInput: Memory Import failed, backend does not support Import&quot;</span>);</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;        }</div><div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;    }</div><div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;    {</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;        std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;                std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(), inputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l00890"></a><span class="lineno">  890</span>&#160;</div><div class="line"><a name="l00891"></a><span class="lineno">  891</span>&#160;        <span class="keyword">auto</span> copyFunc = [](<span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l00892"></a><span class="lineno">  892</span>&#160;        {</div><div class="line"><a name="l00893"></a><span class="lineno">  893</span>&#160;            memcpy(dst, src, size);</div><div class="line"><a name="l00894"></a><span class="lineno">  894</span>&#160;        };</div><div class="line"><a name="l00895"></a><span class="lineno">  895</span>&#160;</div><div class="line"><a name="l00896"></a><span class="lineno">  896</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; input : descriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>)</div><div class="line"><a name="l00897"></a><span class="lineno">  897</span>&#160;        {</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a92c91193007aa49f4732d6dba5397f8d">CopyTensorContentsGeneric</a>(tensorHandle.get(), input, copyFunc);</div><div class="line"><a name="l00899"></a><span class="lineno">  899</span>&#160;        }</div><div class="line"><a name="l00900"></a><span class="lineno">  900</span>&#160;    }</div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;}</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::EnqueueOutput(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>&amp; layer, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor.xhtml">Tensor</a>&amp; outputTensor, <a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml">WorkingMemHandle</a>&amp; handle)</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;{</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;    <span class="keywordflow">if</span> (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>)</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;    {</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;EnqueueOutput: given layer not an OutputLayer&quot;</span>);</div><div class="line"><a name="l00908"></a><span class="lineno">  908</span>&#160;    }</div><div class="line"><a name="l00909"></a><span class="lineno">  909</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(layer.<a class="code" href="classarmnn_1_1_layer.xhtml#abc0660dc440c8a285b456c9ef6383c26">GetNumInputSlots</a>() == 1, <span class="stringliteral">&quot;Output Layer should have exactly one input.&quot;</span>);</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;    <a class="code" href="namespacearmnn.xhtml#afad4088a9a058114ee5f87246f87bf49">LayerGuid</a> <span class="keywordtype">id</span> = layer.<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>();</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> descriptor = handle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a70e0e7889988786ac840bf2785f3db95">GetWorkingMemDescriptor</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = descriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>[0];</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(inputTensorHandle != <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Data should have been allocated.&quot;</span>);</div><div class="line"><a name="l00916"></a><span class="lineno">  916</span>&#160;</div><div class="line"><a name="l00917"></a><span class="lineno">  917</span>&#160;    <span class="comment">// Try import the output tensor.</span></div><div class="line"><a name="l00918"></a><span class="lineno">  918</span>&#160;    <span class="comment">// Note: We can only import the output pointer if all of the following  hold true:</span></div><div class="line"><a name="l00919"></a><span class="lineno">  919</span>&#160;    <span class="comment">// a) The imported pointer is aligned sufficiently</span></div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    <span class="comment">// b) The tensor has zero padding</span></div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;    <span class="comment">// c) There is only one connection to the OutputSlot and it is to an OutputLayer.</span></div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="comment">// d) The output pointer is allocated via malloc. (Other types will be supported in a later release)</span></div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    <span class="comment">// e) m_IsExportEnabled must be set to true</span></div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    <span class="keywordflow">if</span> (m_NetworkProperties.m_ExportEnabled &amp;&amp;</div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;        (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0].GetConnectedOutputSlot()-&gt;GetNumConnections() == 1))</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    {</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;        <span class="keywordflow">if</span> (layer.<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0].GetConnectedOutputSlot()-&gt;GetOwningLayer().GetType() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160;        {</div><div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">MemorySourceFlags</a> importFlags = inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">GetImportFlags</a>();</div><div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;            <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(importFlags, m_NetworkProperties.m_OutputSource))</div><div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;            {</div><div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160;                std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;                        std::make_unique&lt;PassthroughTensorHandle&gt;(outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(),</div><div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;                                                                     outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;</div><div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;                <span class="keywordtype">void</span>* mem = tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">Map</a>(<span class="keyword">false</span>);</div><div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;                <span class="keywordtype">bool</span> importOk = inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(mem, m_NetworkProperties.m_OutputSource);</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;                tensorHandle-&gt;Unmap();</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;                <span class="keywordflow">if</span> (importOk)</div><div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;                {</div><div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;                    <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;SyncMemGeneric_Execute&quot;</span>);</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;                    inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">Map</a>(<span class="keyword">true</span>);</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;                    inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;                }</div><div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160;                {</div><div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;                    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;EnqueueOutput: Memory Export failed&quot;</span>);</div><div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;                }</div><div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;            }</div><div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;            {</div><div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;EnqueueOutput: Memory Export failed, backend does not support Export&quot;</span>);</div><div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;            }</div><div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        }</div><div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160;        {</div><div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;EnqueueOutput: Memory Export failed, attempting to export Input Layer&quot;</span>);</div><div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;        }</div><div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;    }</div><div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;    {</div><div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;        <span class="keyword">auto</span> copyFunc = [](<span class="keywordtype">void</span>* dst, <span class="keyword">const</span> <span class="keywordtype">void</span>* src, <span class="keywordtype">size_t</span> size)</div><div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160;        {</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;            memcpy(dst, src, size);</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;        };</div><div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;</div><div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;        std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;                std::make_unique&lt;PassthroughTensorHandle&gt;(outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(),</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;                                                             outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;</div><div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;        <a class="code" href="namespacearmnn.xhtml#a92c91193007aa49f4732d6dba5397f8d">CopyTensorContentsGeneric</a>(inputTensorHandle, tensorHandle.get(), copyFunc);</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;    }</div><div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160;}</div><div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;</div><div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;</div><div class="line"><a name="l00977"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a9ef4b4b6c421b5fd4b62274e63d08f11">  977</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_const_tensor.xhtml">armnn::ConstTensor</a> <a class="code" href="namespacearmnn.xhtml#a9ef4b4b6c421b5fd4b62274e63d08f11">GetInputTensor</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId, <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">InputTensors</a>&amp; inputTensors)</div><div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;{</div><div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> inputTensorPair : inputTensors)</div><div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;    {</div><div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;        <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span> = inputTensorPair.first;</div><div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> == layerId)</div><div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;        {</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;            <span class="keywordflow">return</span> inputTensorPair.second;</div><div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160;        }</div><div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;    }</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Input does not exist.&quot;</span>);</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;}</div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;</div><div class="line"><a name="l00990"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#ac624e40d8096e61c73b246934f18afd0">  990</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor.xhtml">armnn::Tensor</a> <a class="code" href="namespacearmnn.xhtml#ac624e40d8096e61c73b246934f18afd0">GetOutputTensor</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId, <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors)</div><div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160;{</div><div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> outputTensorPair : outputTensors)</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;    {</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;        <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span> = outputTensorPair.first;</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> == layerId)</div><div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;        {</div><div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;            <span class="keywordflow">return</span> outputTensorPair.second;</div><div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160;        }</div><div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;    }</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;    <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Output does not exist.&quot;</span>);</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;}</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;</div><div class="line"><a name="l01003"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#aaedc133d26fe9a55f6565c8c47d5a8f9"> 1003</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#aaedc133d26fe9a55f6565c8c47d5a8f9">LoadedNetwork::Execute</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">InputTensors</a>&amp; inputTensors,</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;                              <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors,</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;                              <a class="code" href="classarmnn_1_1experimental_1_1_i_working_mem_handle.xhtml">IWorkingMemHandle</a>&amp; iWorkingMemHandle)</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;{</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160;    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph();</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;    <span class="comment">// Walk graph to determine the order of execution.</span></div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;    <span class="keywordflow">if</span> (graph.<a class="code" href="classarmnn_1_1_graph.xhtml#afdf8eb85585a798ad0e936bde884d87b">GetNumLayers</a>() &lt; 2)</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407a7b83d3f08fa392b79e3f553b585971cd">warning</a>) &lt;&lt; <span class="stringliteral">&quot;IRuntime::EnqueueWorkload()::Less than two nodes in graph&quot;</span>;</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">Status::Failure</a>;</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;    }</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160;</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160;    <span class="keywordflow">if</span> (graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>() != inputTensors.size())</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;    {</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Number of inputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160;    }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160;</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;    std::unique_ptr&lt;profiling::TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;            <a class="code" href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">profiling::TimelineUtilityMethods::GetTimelineUtils</a>(m_ProfilingService);</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;    profiling::ProfilingGuid inferenceGuid = m_ProfilingService.GetNextGuid();</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;    {</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;        <span class="comment">// Add inference timeline trace if profiling is enabled.</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;        profiling::ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;        timelineUtils-&gt;CreateTypedEntity(inferenceGuid, profiling::LabelsAndEventClasses::INFERENCE_GUID);</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;        timelineUtils-&gt;CreateRelationship(<a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110">profiling::ProfilingRelationshipType::RetentionLink</a>,</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;                                          networkGuid,</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;                                          inferenceGuid,</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;                                          profiling::LabelsAndEventClasses::EXECUTION_OF_GUID);</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, profiling::LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    }</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;    <span class="keywordtype">bool</span> executionSucceeded = <span class="keyword">true</span>;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    {</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;        <span class="comment">// Add end of life of the inference timeline if profiling is enabled.</span></div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, profiling::LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS);</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;        timelineUtils-&gt;Commit();</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160;    }</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;    <a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml">WorkingMemHandle</a>&amp; workingMemHandle = <span class="keyword">dynamic_cast&lt;</span><a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml">WorkingMemHandle</a>&amp;<span class="keyword">&gt;</span>(iWorkingMemHandle);</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;    std::lock_guard&lt;std::mutex&gt; lockGuard(workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#aa1985d354ac4640b403702a4e882f852">GetMutex</a>());</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160;    <span class="keywordflow">if</span> (!workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a1a573373f4505385578f830caebf6adb">IsAllocated</a>())</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;    {</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160;        workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a8518772c5d692e334a76617582b10b92">Allocate</a>();</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160;    }</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160;</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160;    {</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160;        <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;PrepareInputs&quot;</span>);</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* inputLayer : graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">GetInputLayers</a>())</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;        {</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;            EnqueueInput(*inputLayer, <a class="code" href="namespacearmnn.xhtml#a9ef4b4b6c421b5fd4b62274e63d08f11">GetInputTensor</a>(inputLayer-&gt;GetBindingId(), inputTensors), workingMemHandle);</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160;        }</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160;    }</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;    <span class="keyword">auto</span> Fail = [&amp;](<span class="keyword">const</span> std::exception&amp; <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">error</a>)</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;    {</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(error) &lt;&lt; <span class="stringliteral">&quot;An error occurred attempting to execute a workload: &quot;</span> &lt;&lt; error.what();</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;        executionSucceeded = <span class="keyword">false</span>;</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;    };</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;    profiling::ProfilingDynamicGuid workloadInferenceID(0);</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;    {</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; m_WorkloadQueue.size(); ++i)</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;        {</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;            <span class="keyword">auto</span>&amp; workload = m_WorkloadQueue[i];</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;            <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;            {</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160;                workloadInferenceID = timelineUtils-&gt;RecordWorkloadInferenceAndStartOfLifeEvent(workload-&gt;GetGuid(),</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;                                                                                                inferenceGuid);</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;            }</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;            workload-&gt;ExecuteAsync(workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a1915a1eb2ba2554103a09de391a9f6bd">GetWorkingMemDescriptorAt</a>(i));</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;            <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;            {</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160;                timelineUtils-&gt;RecordEndOfLifeEvent(workloadInferenceID);</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;            }</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;        }</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;    }</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_runtime_exception.xhtml">RuntimeException</a>&amp; error)</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    {</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;        Fail(error);</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;    }</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160;    {</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;        Fail(error);</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;    }</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    <span class="comment">// For each output to the network, call EnqueueOutput with the data passed by the user.</span></div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;    {</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;        <a class="code" href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a>(<a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">Compute::Undefined</a>, <span class="stringliteral">&quot;PrepareOutputs&quot;</span>);</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a> *outputLayer : graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>())</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;        {</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;            EnqueueOutput(*outputLayer, <a class="code" href="namespacearmnn.xhtml#ac624e40d8096e61c73b246934f18afd0">GetOutputTensor</a>(outputLayer-&gt;GetBindingId(), outputTensors), workingMemHandle);</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;        }</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;    }</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160;</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <span class="keywordflow">return</span> executionSucceeded ? <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70ba505a83f220c02df2f85c3810cd9ceb38">Status::Success</a> : <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">Status::Failure</a>;</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;}</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;<span class="comment">/// Create a new unique WorkingMemHandle object. Create multiple handles if you wish to have</span></div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;<span class="comment">/// overlapped Execution by calling this function from different threads.</span></div><div class="line"><a name="l01107"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a16e72675c37a8f251cf02951e222d4ab"> 1107</a></span>&#160;<span class="comment"></span>std::unique_ptr&lt;IWorkingMemHandle&gt; <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a16e72675c37a8f251cf02951e222d4ab">LoadedNetwork::CreateWorkingMemHandle</a>(<a class="code" href="namespacearmnn.xhtml#a0d8160388a127c1a23b37bc88dc6e2ec">NetworkId</a> networkId)</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;{</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; order = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph();</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;    std::unordered_map&lt;LayerGuid, std::vector&lt;std::unique_ptr&lt;ITensorHandle&gt; &gt; &gt; tensorHandleMap;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;    std::vector&lt;WorkingMemDescriptor&gt; workingMemDescriptors;</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;    std::unordered_map&lt;LayerGuid, WorkingMemDescriptor&gt; workingMemDescriptorMap;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_handle_factory_registry.xhtml">TensorHandleFactoryRegistry</a> tensorHandleFactoryRegistry;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;    WorkloadFactoryMap workloadFactoryMap;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;    std::vector&lt;std::shared_ptr&lt;IMemoryManager&gt;&gt; memoryManagers;</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keyword">const</span>&amp; backend : m_Backends)</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;    {</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;        <span class="keywordflow">if</span> (backend.second-&gt;SupportsTensorAllocatorAPI())</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;        {</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;            backend.second-&gt;RegisterTensorHandleFactories(</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;                tensorHandleFactoryRegistry,</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;                static_cast&lt;MemorySourceFlags&gt;(m_NetworkProperties.m_InputSource),</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;                static_cast&lt;MemorySourceFlags&gt;(m_NetworkProperties.m_OutputSource));</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;            memoryManagers.emplace_back(tensorHandleFactoryRegistry.<a class="code" href="classarmnn_1_1_tensor_handle_factory_registry.xhtml#a7d5faf6ceef6e7246b3b4976869b7a18">GetMemoryManagers</a>().back());</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;        }</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;        {</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;            std::shared_ptr&lt;IMemoryManager&gt; memoryManager = backend.second-&gt;CreateMemoryManager();</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;            <span class="keyword">auto</span> workloadFactory = backend.second-&gt;CreateWorkloadFactory(</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;                    memoryManager, m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions());</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;            workloadFactoryMap.emplace(</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;                    std::make_pair(backend.first, std::make_pair(std::move(workloadFactory), memoryManager)));</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;            memoryManagers.emplace_back(memoryManager);</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;        }</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;    }</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;    <span class="keyword">auto</span> GetTensorHandle = [&amp;](<a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* layer, <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_output_slot.xhtml">OutputSlot</a>&amp; outputSlot, <span class="keywordtype">bool</span> isMemoryManaged)</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    {</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = outputSlot.GetTensorHandleFactoryId();</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo = outputSlot.GetTensorInfo();</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;        <span class="keywordflow">if</span> (factoryId == <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a9c95f90eb40e31f629e0e2947b8bc6f9">ITensorHandleFactory::LegacyFactoryId</a>)</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;        {</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;            <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> <span class="keywordtype">id</span> = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>();</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;            <a class="code" href="_deprecated_8hpp.xhtml#ab66a241a0ed3ee89c866e777b035d0ed">ARMNN_NO_DEPRECATE_WARN_BEGIN</a></div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;            <span class="keywordflow">return</span> workloadFactoryMap.at(<span class="keywordtype">id</span>).first-&gt;CreateTensorHandle(tensorInfo, isMemoryManaged);</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;            <a class="code" href="_deprecated_8hpp.xhtml#ad762b11b48e5c1d1c1743f529485728a">ARMNN_NO_DEPRECATE_WARN_END</a></div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;        }</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;        {</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a>* handleFactory = tensorHandleFactoryRegistry.<a class="code" href="classarmnn_1_1_tensor_handle_factory_registry.xhtml#ae5ecc42140a12c855554a4a621fc8456">GetFactory</a>(factoryId);</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(handleFactory);</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;            <span class="keywordflow">return</span> handleFactory-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">CreateTensorHandle</a>(tensorInfo, isMemoryManaged);</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;        }</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;    };</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;    std::unordered_map&lt;const ITensorHandle*, unsigned int&gt; handleReferenceCounts;</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;    {</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;        <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> workingMemDescriptor;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;</div><div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;        <span class="comment">// Constant layers execution and management is handled during loaded network construction</span></div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;        <span class="keywordflow">if</span> (layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;        {</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;        }</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;        <span class="keywordtype">bool</span> isMemoryManaged = <span class="keyword">true</span>;</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;        <span class="keywordtype">bool</span> isInputLayer = <span class="keyword">true</span>;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;        <span class="comment">// Look for the layer with 1 OutputSlot which has 1 connection and that connection is an Output Layer</span></div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;        <span class="comment">// If Export is enabled disable memory management so we can export, otherwise we do a copy</span></div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;        <span class="keywordflow">if</span> ((layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a1594bddc87d6477df300317658f566bb">GetNumOutputSlots</a>() == 1) &amp;&amp;</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;            (layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>()[0].GetNumConnections() == 1) &amp;&amp;</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;            (layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>()[0].GetConnection(0)-&gt;GetOwningLayer().GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>))</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;        {</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;            isMemoryManaged = !m_NetworkProperties.m_ExportEnabled;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;        }</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;        <span class="keywordflow">else</span> <span class="keywordflow">if</span> (layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a> || layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a115bfc5d633eae55c67f9588acdd2bf9">LayerType::MemImport</a>)</div><div class="line"><a name="l01181"></a><span class="lineno"> 1181</span>&#160;        {</div><div class="line"><a name="l01182"></a><span class="lineno"> 1182</span>&#160;            <span class="comment">// Input layers/workloads will not be executed so the descriptor is not added to workingMemDescriptors</span></div><div class="line"><a name="l01183"></a><span class="lineno"> 1183</span>&#160;            <span class="comment">// However we will still need to manage the tensorHandle</span></div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;            isInputLayer = <span class="keyword">false</span>;</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;            isMemoryManaged = !m_NetworkProperties.m_ExportEnabled;</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;        }</div><div class="line"><a name="l01187"></a><span class="lineno"> 1187</span>&#160;</div><div class="line"><a name="l01188"></a><span class="lineno"> 1188</span>&#160;        <span class="comment">// Create a tensor handle for each output slot of a layer</span></div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;        <span class="comment">// Once we create it, we start managing its lifetime</span></div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; slot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>())</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;        {</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;            tensorHandleMap[layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>()].emplace_back(GetTensorHandle(layer, slot, isMemoryManaged));</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = tensorHandleMap[layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>()].back().get();</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;            workingMemDescriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>.push_back(tensorHandle);</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160;            tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a04149d0f9b9c54c05e95693111490daf">Manage</a>();</div><div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numConnections = slot.GetNumConnections();</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(numConnections != 0);</div><div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;</div><div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;            handleReferenceCounts[tensorHandle] = numConnections;</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;        }</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;        <span class="comment">// Loop through the input slots in the same layer and decrement the reference counter associated</span></div><div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;        <span class="comment">// to each tensor handle we encounter.</span></div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;        <span class="comment">// Once it reaches zero, the lifetime of the tensor handle has ended, and we mark it&#39;s memory as available</span></div><div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;        <span class="comment">// so that the next tensor handle with a non overlapping lifetime can share it&#39;s memory.</span></div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; slot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>())</div><div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;        {</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(slot.GetConnection());</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;            <span class="keyword">auto</span> outputSlot = slot.GetConnectedOutputSlot();</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;            <span class="keyword">auto</span> key = outputSlot-&gt;GetOwningLayer().GetGuid();</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160;            <span class="comment">// Constant layers execution and management is handled during loaded network construction</span></div><div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;            <span class="keyword">auto</span> found = m_ConstantTensorHandles.find(key);</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;            <span class="keywordflow">if</span> (found != m_ConstantTensorHandles.end())</div><div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;            {</div><div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;                workingMemDescriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(found-&gt;second);</div><div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;            }</div><div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;</div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;            <span class="keyword">auto</span> search = tensorHandleMap.find(key);</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;            <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = outputSlot-&gt;CalculateIndexOnOwner();</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = search-&gt;second[index].get();</div><div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;            workingMemDescriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(inputTensorHandle);</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;            --handleReferenceCounts.at(inputTensorHandle);</div><div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;            <span class="keywordflow">if</span> (handleReferenceCounts.at(inputTensorHandle) == 0u)</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;            {</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;                <span class="comment">// Stop managing lifetime of tensor handle</span></div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;                inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a5cceed8b707a09bf27eb61f17acf8a88">Allocate</a>();</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;                handleReferenceCounts.erase(inputTensorHandle);</div><div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;            }</div><div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;        }</div><div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;        workingMemDescriptorMap.insert({layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>(), workingMemDescriptor});</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160;</div><div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;        <span class="comment">// Input layers/workloads will not be executed, so the descriptor is not added to workingMemDescriptors</span></div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;        <span class="comment">// However we will still need to manage the tensorHandle</span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160;        <span class="keywordflow">if</span> (isInputLayer)</div><div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;        {</div><div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;            workingMemDescriptors.push_back(workingMemDescriptor);</div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;        }</div><div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;    }</div><div class="line"><a name="l01241"></a><span class="lineno"> 1241</span>&#160;</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;WorkingMemHandle&gt;(networkId,</div><div class="line"><a name="l01243"></a><span class="lineno"> 1243</span>&#160;                                              workingMemDescriptors,</div><div class="line"><a name="l01244"></a><span class="lineno"> 1244</span>&#160;                                              workingMemDescriptorMap,</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;                                              memoryManagers,</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</span>&#160;                                              std::move(tensorHandleMap));</div><div class="line"><a name="l01247"></a><span class="lineno"> 1247</span>&#160;}</div><div class="line"><a name="l01248"></a><span class="lineno"> 1248</span>&#160;</div><div class="line"><a name="l01249"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a091ea8d2d804c8902f3120fdf2a36512"> 1249</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a091ea8d2d804c8902f3120fdf2a36512">LoadedNetwork::RegisterDebugCallback</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a15f3ad9b5e4e3d46b0a6dda246a7bc28">DebugCallbackFunction</a>&amp; func)</div><div class="line"><a name="l01250"></a><span class="lineno"> 1250</span>&#160;{</div><div class="line"><a name="l01251"></a><span class="lineno"> 1251</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadPtr: m_WorkloadQueue)</div><div class="line"><a name="l01252"></a><span class="lineno"> 1252</span>&#160;    {</div><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;        workloadPtr.get()-&gt;RegisterDebugCallback(func);</div><div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    }</div><div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160;}</div><div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;</div><div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;}</div><div class="ttc" id="_mem_copy_workload_8hpp_xhtml"><div class="ttname"><a href="_mem_copy_workload_8hpp.xhtml">MemCopyWorkload.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a16e72675c37a8f251cf02951e222d4ab"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a16e72675c37a8f251cf02951e222d4ab">armnn::LoadedNetwork::CreateWorkingMemHandle</a></div><div class="ttdeci">std::unique_ptr&lt; IWorkingMemHandle &gt; CreateWorkingMemHandle(NetworkId networkId)</div><div class="ttdoc">Create a new unique WorkingMemHandle object. </div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01107">LoadedNetwork.cpp:1107</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a4f81a9eff30c9b9fe76f5b83af470ba7"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">armnn::ITensorHandle::Import</a></div><div class="ttdeci">virtual bool Import(void *memory, MemorySource source)</div><div class="ttdoc">Import externally allocated memory. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_8hpp_source.xhtml#l00075">ITensorHandle.hpp:75</a></div></div>
<div class="ttc" id="classarmnn_1_1_backend_registry_xhtml_afc0c63ca8db8957b58826f6d7bd231b2"><div class="ttname"><a href="classarmnn_1_1_backend_registry.xhtml#afc0c63ca8db8957b58826f6d7bd231b2">armnn::BackendRegistry::GetFactory</a></div><div class="ttdeci">FactoryFunction GetFactory(const BackendId &amp;id) const</div><div class="ttdef"><b>Definition:</b> <a href="_backend_registry_8cpp_source.xhtml#l00055">BackendRegistry.cpp:55</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_abc0660dc440c8a285b456c9ef6383c26"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#abc0660dc440c8a285b456c9ef6383c26">armnn::Layer::GetNumInputSlots</a></div><div class="ttdeci">unsigned int GetNumInputSlots() const override</div><div class="ttdoc">Returns the number of connectable input slots. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00313">Layer.hpp:313</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml">armnn::IBackendInternal</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_backend_internal_8hpp_source.xhtml#l00075">IBackendInternal.hpp:75</a></div></div>
<div class="ttc" id="classarmnn_1_1profiling_1_1_timeline_utility_methods_xhtml_a0e5c863245b8d7dc5e874c0c66eebae1"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_timeline_utility_methods.xhtml#a0e5c863245b8d7dc5e874c0c66eebae1">armnn::profiling::TimelineUtilityMethods::GetTimelineUtils</a></div><div class="ttdeci">static std::unique_ptr&lt; TimelineUtilityMethods &gt; GetTimelineUtils(ProfilingService &amp;profilingService)</div><div class="ttdef"><b>Definition:</b> <a href="_timeline_utility_methods_8cpp_source.xhtml#l00018">TimelineUtilityMethods.cpp:18</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#l00526">Profiling.cpp:526</a></div></div>
<div class="ttc" id="_tensor_handle_8hpp_xhtml"><div class="ttname"><a href="_tensor_handle_8hpp.xhtml">TensorHandle.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_utils_1_1_processes_xhtml_a1d95dea376acbd82dde773e05db454be"><div class="ttname"><a href="namespacearmnn_utils_1_1_processes.xhtml#a1d95dea376acbd82dde773e05db454be">armnnUtils::Processes::GetCurrentId</a></div><div class="ttdeci">int GetCurrentId()</div><div class="ttdef"><b>Definition:</b> <a href="_processes_8cpp_source.xhtml#l00019">Processes.cpp:19</a></div></div>
<div class="ttc" id="_deprecated_8hpp_xhtml_ab66a241a0ed3ee89c866e777b035d0ed"><div class="ttname"><a href="_deprecated_8hpp.xhtml#ab66a241a0ed3ee89c866e777b035d0ed">ARMNN_NO_DEPRECATE_WARN_BEGIN</a></div><div class="ttdeci">#define ARMNN_NO_DEPRECATE_WARN_BEGIN</div><div class="ttdef"><b>Definition:</b> <a href="_deprecated_8hpp_source.xhtml#l00033">Deprecated.hpp:33</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00152">Tensor.hpp:152</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_workload_factory_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_workload_factory.xhtml">armnn::IWorkloadFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="_workload_factory_8hpp_source.xhtml#l00022">WorkloadFactory.hpp:22</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a55cddc2dbb32d680cd85b635ba370e48"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">armnn::ITensorHandle::GetImportFlags</a></div><div class="ttdeci">virtual unsigned int GetImportFlags() const</div><div class="ttdoc">Get flags describing supported import sources. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_8hpp_source.xhtml#l00069">ITensorHandle.hpp:69</a></div></div>
<div class="ttc" id="structarmnn_1_1_i_network_properties_xhtml_ad3ab02a7f6310b35c59ca78b509905ca"><div class="ttname"><a href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">armnn::INetworkProperties::m_AsyncEnabled</a></div><div class="ttdeci">const bool m_AsyncEnabled</div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00084">IRuntime.hpp:84</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ac624e40d8096e61c73b246934f18afd0"><div class="ttname"><a href="namespacearmnn.xhtml#ac624e40d8096e61c73b246934f18afd0">armnn::GetOutputTensor</a></div><div class="ttdeci">const armnn::Tensor GetOutputTensor(const LayerBindingId layerId, const OutputTensors &amp;outputTensors)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00990">LoadedNetwork.cpp:990</a></div></div>
<div class="ttc" id="namespacearmnn_serializer_xhtml_a9a8118be7780e95363d631cbca7e7800"><div class="ttname"><a href="namespacearmnn_serializer.xhtml#a9a8118be7780e95363d631cbca7e7800">armnnSerializer::Layer</a></div><div class="ttdeci">Layer</div><div class="ttdef"><b>Definition:</b> <a href="_armnn_schema__generated_8h_source.xhtml#l01174">ArmnnSchema_generated.h:1174</a></div></div>
<div class="ttc" id="classarmnn_1_1_bindable_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_bindable_layer.xhtml">armnn::BindableLayer</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00431">Layer.hpp:431</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a1915a1eb2ba2554103a09de391a9f6bd"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a1915a1eb2ba2554103a09de391a9f6bd">armnn::experimental::WorkingMemHandle::GetWorkingMemDescriptorAt</a></div><div class="ttdeci">WorkingMemDescriptor &amp; GetWorkingMemDescriptorAt(unsigned int id) override</div><div class="ttdoc">Get the WorkingMemDescriptor at an index. </div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00073">WorkingMemHandle.hpp:73</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">armnn::LayerType::Output</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a5cceed8b707a09bf27eb61f17acf8a88"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a5cceed8b707a09bf27eb61f17acf8a88">armnn::ITensorHandle::Allocate</a></div><div class="ttdeci">virtual void Allocate()=0</div><div class="ttdoc">Indicate to the memory manager that this resource is no longer active. </div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_af616683424cb40d83b5a923db7f06f11"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#af616683424cb40d83b5a923db7f06f11">armnn::LoadedNetwork::GetInputTensorInfo</a></div><div class="ttdeci">TensorInfo GetInputTensorInfo(LayerBindingId layerId) const</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00376">LoadedNetwork.cpp:376</a></div></div>
<div class="ttc" id="_logging_8hpp_xhtml_a7b6ad073975f437ec38ca7d20154727f"><div class="ttname"><a href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a></div><div class="ttdeci">#define ARMNN_LOG(severity)</div><div class="ttdef"><b>Definition:</b> <a href="_logging_8hpp_source.xhtml#l00202">Logging.hpp:202</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a04149d0f9b9c54c05e95693111490daf"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a04149d0f9b9c54c05e95693111490daf">armnn::ITensorHandle::Manage</a></div><div class="ttdeci">virtual void Manage()=0</div><div class="ttdoc">Indicate to the memory manager that this resource is active. </div></div>
<div class="ttc" id="namespacearmnn_xhtml_ac2807505b850738bc8a1991ce669dd47"><div class="ttname"><a href="namespacearmnn.xhtml#ac2807505b850738bc8a1991ce669dd47">armnn::BackendRegistryInstance</a></div><div class="ttdeci">BackendRegistry &amp; BackendRegistryInstance()</div><div class="ttdef"><b>Definition:</b> <a href="_backend_registry_8cpp_source.xhtml#l00013">BackendRegistry.cpp:13</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_aa01bce88f89975a5a031db4cc8861527"><div class="ttname"><a href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">armnn::InputTensors</a></div><div class="ttdeci">std::vector&lt; std::pair&lt; LayerBindingId, class ConstTensor &gt; &gt; InputTensors</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00360">Tensor.hpp:360</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a5b05f3b7208ec7cea3338e30057c0bac"><div class="ttname"><a href="namespacearmnn.xhtml#a5b05f3b7208ec7cea3338e30057c0bac">armnn::MemorySourceFlags</a></div><div class="ttdeci">unsigned int MemorySourceFlags</div><div class="ttdef"><b>Definition:</b> <a href="_memory_sources_8hpp_source.xhtml#l00015">MemorySources.hpp:15</a></div></div>
<div class="ttc" id="classarmnn_1_1_base_tensor_xhtml_aa81f67ac64f0c249e26499600c45d996"><div class="ttname"><a href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">armnn::BaseTensor::GetMemoryArea</a></div><div class="ttdeci">MemoryType GetMemoryArea() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00305">Tensor.hpp:305</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_a604654b453ec291a503d62a0beb849d3"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">armnn::Graph::GetNumOutputs</a></div><div class="ttdeci">size_t GetNumOutputs() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00181">Graph.hpp:181</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a2b6b57945bc68f659e08d28c8a015e91"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a2b6b57945bc68f659e08d28c8a015e91">armnn::LoadedNetwork::GetOutputTensorInfo</a></div><div class="ttdeci">TensorInfo GetOutputTensorInfo(LayerBindingId layerId) const</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00390">LoadedNetwork.cpp:390</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="classarmnn_1_1_layer_xhtml_af5f530544d09a44d726f24702b67b35b"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">armnn::Layer::GetInputSlots</a></div><div class="ttdeci">const std::vector&lt; InputSlot &gt; &amp; GetInputSlots() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00237">Layer.hpp:237</a></div></div>
<div class="ttc" id="_loaded_network_8hpp_xhtml"><div class="ttname"><a href="_loaded_network_8hpp.xhtml">LoadedNetwork.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a15f3ad9b5e4e3d46b0a6dda246a7bc28"><div class="ttname"><a href="namespacearmnn.xhtml#a15f3ad9b5e4e3d46b0a6dda246a7bc28">armnn::DebugCallbackFunction</a></div><div class="ttdeci">std::function&lt; void(LayerGuid guid, unsigned int slotIndex, ITensorHandle *tensorHandle)&gt; DebugCallbackFunction</div><div class="ttdoc">Define the type of callback for the Debug layer to call. </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00321">Types.hpp:321</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a1594bddc87d6477df300317658f566bb"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a1594bddc87d6477df300317658f566bb">armnn::Layer::GetNumOutputSlots</a></div><div class="ttdeci">unsigned int GetNumOutputSlots() const override</div><div class="ttdoc">Returns the number of connectable output slots. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00314">Layer.hpp:314</a></div></div>
<div class="ttc" id="_processes_8hpp_xhtml"><div class="ttname"><a href="_processes_8hpp.xhtml">Processes.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acb5e100e5a9a3e7f6d1fd97512215282">armnn::BoostLogSeverityMapping::error</a></div></div>
<div class="ttc" id="_backend_registry_8hpp_xhtml"><div class="ttname"><a href="_backend_registry_8hpp.xhtml">BackendRegistry.hpp</a></div></div>
<div class="ttc" id="_profiling_8hpp_xhtml_a5ccc65e2c464ac05ce311fdae7ede03a"><div class="ttname"><a href="_profiling_8hpp.xhtml#a5ccc65e2c464ac05ce311fdae7ede03a">ARMNN_SCOPED_PROFILING_EVENT</a></div><div class="ttdeci">#define ARMNN_SCOPED_PROFILING_EVENT(backendId, name)</div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8hpp_source.xhtml#l00219">Profiling.hpp:219</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ab8cf8f9fb6792e654c2d8d8382f6f01b"><div class="ttname"><a href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">armnn::LayerBindingId</a></div><div class="ttdeci">int LayerBindingId</div><div class="ttdoc">Type of identifiers for bindable layers (inputs, outputs). </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00244">Types.hpp:244</a></div></div>
<div class="ttc" id="structarmnn_1_1_i_network_properties_xhtml"><div class="ttname"><a href="structarmnn_1_1_i_network_properties.xhtml">armnn::INetworkProperties</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00032">IRuntime.hpp:32</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor.xhtml">armnn::Tensor</a></div><div class="ttdoc">A tensor defined by a TensorInfo (shape and data type) and a mutable backing store. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00319">Tensor.hpp:319</a></div></div>
<div class="ttc" id="structarmnn_1_1experimental_1_1_working_mem_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">armnn::experimental::WorkingMemDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_descriptor_8hpp_source.xhtml#l00018">WorkingMemDescriptor.hpp:18</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_aaedc133d26fe9a55f6565c8c47d5a8f9"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#aaedc133d26fe9a55f6565c8c47d5a8f9">armnn::LoadedNetwork::Execute</a></div><div class="ttdeci">Status Execute(const InputTensors &amp;inputTensors, const OutputTensors &amp;outputTensors, IWorkingMemHandle &amp;workingMemHandle)</div><div class="ttdoc">Thread safe execution of the loaded network. </div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01003">LoadedNetwork.cpp:1003</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_afd5a5e90515b31c0174f76ec8897e9b1"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#afd5a5e90515b31c0174f76ec8897e9b1">armnn::IBackendInternal::CreateWorkloadFactory</a></div><div class="ttdeci">virtual IWorkloadFactoryPtr CreateWorkloadFactory(const IMemoryManagerSharedPtr &amp;memoryManager=nullptr) const =0</div></div>
<div class="ttc" id="_working_mem_handle_8hpp_xhtml"><div class="ttname"><a href="_working_mem_handle_8hpp.xhtml">WorkingMemHandle.hpp</a></div></div>
<div class="ttc" id="structarmnn_1_1experimental_1_1_working_mem_descriptor_xhtml_a4b50e46a6810018f3edecfb68b2a76b3"><div class="ttname"><a href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">armnn::experimental::WorkingMemDescriptor::m_Inputs</a></div><div class="ttdeci">std::vector&lt; ITensorHandle * &gt; m_Inputs</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_descriptor_8hpp_source.xhtml#l00020">WorkingMemDescriptor.hpp:20</a></div></div>
<div class="ttc" id="namespacestd_xhtml"><div class="ttname"><a href="namespacestd.xhtml">std</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00147">BackendId.hpp:147</a></div></div>
<div class="ttc" id="structarmnn_1_1_workload_info_xhtml_ac97905bfa0daab357b91df1347600309"><div class="ttname"><a href="structarmnn_1_1_workload_info.xhtml#ac97905bfa0daab357b91df1347600309">armnn::WorkloadInfo::m_InputTensorInfos</a></div><div class="ttdeci">std::vector&lt; TensorInfo &gt; m_InputTensorInfos</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_workload_info_8hpp_source.xhtml#l00018">WorkloadInfo.hpp:18</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a67a0db04d321a74b7e7fcfd3f1a3f70ba505a83f220c02df2f85c3810cd9ceb38"><div class="ttname"><a href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70ba505a83f220c02df2f85c3810cd9ceb38">armnn::Status::Success</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a70e0e7889988786ac840bf2785f3db95"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a70e0e7889988786ac840bf2785f3db95">armnn::experimental::WorkingMemHandle::GetWorkingMemDescriptor</a></div><div class="ttdeci">WorkingMemDescriptor &amp; GetWorkingMemDescriptor(LayerGuid id) override</div><div class="ttdoc">Get the WorkingMemDescriptor for a Layer. The mutex must be locked. </div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00064">WorkingMemHandle.hpp:64</a></div></div>
<div class="ttc" id="_deprecated_8hpp_xhtml_ad762b11b48e5c1d1c1743f529485728a"><div class="ttname"><a href="_deprecated_8hpp.xhtml#ad762b11b48e5c1d1c1743f529485728a">ARMNN_NO_DEPRECATE_WARN_END</a></div><div class="ttdeci">#define ARMNN_NO_DEPRECATE_WARN_END</div><div class="ttdef"><b>Definition:</b> <a href="_deprecated_8hpp_source.xhtml#l00034">Deprecated.hpp:34</a></div></div>
<div class="ttc" id="_assert_8hpp_xhtml_a91c4dfde57907d7698c7531785690a7f"><div class="ttname"><a href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a></div><div class="ttdeci">#define ARMNN_ASSERT_MSG(COND, MSG)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00015">Assert.hpp:15</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_af8f716b0eab6b9d63196d5a53d5fac81"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#af8f716b0eab6b9d63196d5a53d5fac81">armnn::IBackendInternal::SupportsTensorAllocatorAPI</a></div><div class="ttdeci">bool SupportsTensorAllocatorAPI() const</div><div class="ttdef"><b>Definition:</b> <a href="_i_backend_internal_8cpp_source.xhtml#l00156">IBackendInternal.cpp:156</a></div></div>
<div class="ttc" id="_graph_8hpp_xhtml"><div class="ttname"><a href="_graph_8hpp.xhtml">Graph.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_a693b40e6b94e958836aeb0410ca186bd"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#a693b40e6b94e958836aeb0410ca186bd">armnn::IBackendInternal::IMemoryManagerSharedPtr</a></div><div class="ttdeci">std::shared_ptr&lt; IMemoryManager &gt; IMemoryManagerSharedPtr</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_backend_internal_8hpp_source.xhtml#l00099">IBackendInternal.hpp:99</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml">armnn::ITensorHandle</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_8hpp_source.xhtml#l00015">ITensorHandle.hpp:15</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407a7b83d3f08fa392b79e3f553b585971cd"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407a7b83d3f08fa392b79e3f553b585971cd">armnn::BoostLogSeverityMapping::warning</a></div></div>
<div class="ttc" id="_heap_profiling_8hpp_xhtml_aeeb927880fc4ffc2eea754a67d884a53"><div class="ttname"><a href="_heap_profiling_8hpp.xhtml#aeeb927880fc4ffc2eea754a67d884a53">ARMNN_SCOPED_HEAP_PROFILING</a></div><div class="ttdeci">#define ARMNN_SCOPED_HEAP_PROFILING(TAG)</div><div class="ttdef"><b>Definition:</b> <a href="_heap_profiling_8hpp_source.xhtml#l00045">HeapProfiling.hpp:45</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360"><div class="ttname"><a href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">armnn::Compute::Undefined</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a0d8160388a127c1a23b37bc88dc6e2ec"><div class="ttname"><a href="namespacearmnn.xhtml#a0d8160388a127c1a23b37bc88dc6e2ec">armnn::NetworkId</a></div><div class="ttdeci">int NetworkId</div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00024">IRuntime.hpp:24</a></div></div>
<div class="ttc" id="classarmnn_1_1_const_tensor_xhtml"><div class="ttname"><a href="classarmnn_1_1_const_tensor.xhtml">armnn::ConstTensor</a></div><div class="ttdoc">A tensor defined by a TensorInfo (shape and data type) and an immutable backing store. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00327">Tensor.hpp:327</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a8f091a512915d1cb29a4ebf13dfc53ea"><div class="ttname"><a href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">armnn::OutputTensors</a></div><div class="ttdeci">std::vector&lt; std::pair&lt; LayerBindingId, class Tensor &gt; &gt; OutputTensors</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00361">Tensor.hpp:361</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a9a97cb6d32661a57fc33bd29b8e41ff4"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a9a97cb6d32661a57fc33bd29b8e41ff4">armnn::Layer::GetNameStr</a></div><div class="ttdeci">const std::string &amp; GetNameStr() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00220">Layer.hpp:220</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_ad8e15c530c929ab823d89ae9fd2d3f11"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">armnn::Layer::GetType</a></div><div class="ttdeci">LayerType GetType() const override</div><div class="ttdoc">Returns the armnn::LayerType of this layer. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00265">Layer.hpp:265</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a67a0db04d321a74b7e7fcfd3f1a3f70b"><div class="ttname"><a href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70b">armnn::Status</a></div><div class="ttdeci">Status</div><div class="ttdoc">enumeration </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00029">Types.hpp:29</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_xhtml"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml">armnn::OutputSlot</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00083">Layer.hpp:83</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_i_working_mem_handle_xhtml"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_i_working_mem_handle.xhtml">armnn::experimental::IWorkingMemHandle</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_working_mem_handle_8hpp_source.xhtml#l00020">IWorkingMemHandle.hpp:20</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_output_handler_xhtml"><div class="ttname"><a href="classarmnn_1_1_output_handler.xhtml">armnn::OutputHandler</a></div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.xhtml#l00028">OutputHandler.hpp:28</a></div></div>
<div class="ttc" id="structarmnn_1_1_workload_info_xhtml_a67b178f8a836bc1e52b8de109760adfd"><div class="ttname"><a href="structarmnn_1_1_workload_info.xhtml#a67b178f8a836bc1e52b8de109760adfd">armnn::WorkloadInfo::m_OutputTensorInfos</a></div><div class="ttdeci">std::vector&lt; TensorInfo &gt; m_OutputTensorInfos</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_workload_info_8hpp_source.xhtml#l00019">WorkloadInfo.hpp:19</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml">armnn::profiling</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_id_8hpp_source.xhtml#l00168">BackendId.hpp:168</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_workload_factory_xhtml_a74dc9ec1a223eab8b072368b2dacee87"><div class="ttname"><a href="classarmnn_1_1_i_workload_factory.xhtml#a74dc9ec1a223eab8b072368b2dacee87">armnn::IWorkloadFactory::IsLayerSupported</a></div><div class="ttdeci">static bool IsLayerSupported(const BackendId &amp;backendId, const IConnectableLayer &amp;layer, Optional&lt; DataType &gt; dataType, std::string &amp;outReasonIfUnsupported)</div><div class="ttdef"><b>Definition:</b> <a href="_workload_factory_8cpp_source.xhtml#l01418">WorkloadFactory.cpp:1418</a></div></div>
<div class="ttc" id="classarmnn_1_1_runtime_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_runtime_exception.xhtml">armnn::RuntimeException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00120">Exceptions.hpp:120</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a48fe2df41d914c38c913160956acc706"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a48fe2df41d914c38c913160956acc706">armnn::LoadedNetwork::WorkloadQueue</a></div><div class="ttdeci">std::vector&lt; std::unique_ptr&lt; IWorkload &gt; &gt; WorkloadQueue</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8hpp_source.xhtml#l00038">LoadedNetwork.hpp:38</a></div></div>
<div class="ttc" id="classarmnn_1_1_base_tensor_xhtml_a8aeddebdcf02e1832b22203c08a6b678"><div class="ttname"><a href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">armnn::BaseTensor::GetInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetInfo() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00295">Tensor.hpp:295</a></div></div>
<div class="ttc" id="classarmnn_1_1_invalid_argument_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_invalid_argument_exception.xhtml">armnn::InvalidArgumentException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00080">Exceptions.hpp:80</a></div></div>
<div class="ttc" id="_exceptions_8hpp_xhtml_aa3be76aec4ce713822a5ea1ecbb7bc61"><div class="ttname"><a href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a></div><div class="ttdeci">#define CHECK_LOCATION()</div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00197">Exceptions.hpp:197</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_afdb1d37740e7a083b625d669588b6a0e"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">armnn::Layer::GetBackendId</a></div><div class="ttdeci">const BackendId &amp; GetBackendId() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00269">Layer.hpp:269</a></div></div>
<div class="ttc" id="namespacearmnn_1_1profiling_xhtml_ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110"><div class="ttname"><a href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110">armnn::profiling::ProfilingRelationshipType::RetentionLink</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a8518772c5d692e334a76617582b10b92"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a8518772c5d692e334a76617582b10b92">armnn::experimental::WorkingMemHandle::Allocate</a></div><div class="ttdeci">void Allocate() override</div><div class="ttdoc">Allocate the backing memory required for execution. </div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8cpp_source.xhtml#l00033">WorkingMemHandle.cpp:33</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml">armnn::Graph</a></div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00029">Graph.hpp:29</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_a98cdff4e0b45f4c80bfcedaf926e16e0"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">armnn::Layer::GetOutputSlots</a></div><div class="ttdeci">const std::vector&lt; OutputSlot &gt; &amp; GetOutputSlots() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00238">Layer.hpp:238</a></div></div>
<div class="ttc" id="structarmnn_1_1_i_network_properties_xhtml_a243bb6beeac3bee21a740198495f5aa1"><div class="ttname"><a href="structarmnn_1_1_i_network_properties.xhtml#a243bb6beeac3bee21a740198495f5aa1">armnn::INetworkProperties::m_OutputNetworkDetails</a></div><div class="ttdeci">const bool m_OutputNetworkDetails</div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00088">IRuntime.hpp:88</a></div></div>
<div class="ttc" id="_logging_8hpp_xhtml"><div class="ttname"><a href="_logging_8hpp.xhtml">Logging.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_handle_factory_registry_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_handle_factory_registry.xhtml">armnn::TensorHandleFactoryRegistry</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_handle_factory_registry_8hpp_source.xhtml#l00020">TensorHandleFactoryRegistry.hpp:20</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_aa1985d354ac4640b403702a4e882f852"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#aa1985d354ac4640b403702a4e882f852">armnn::experimental::WorkingMemHandle::GetMutex</a></div><div class="ttdeci">std::mutex &amp; GetMutex() override</div><div class="ttdoc">Get a mutex which can be used for synchronizing access to the WorkingMemHandle object. </div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00058">WorkingMemHandle.hpp:58</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_aaf8558a23ae9be6e7ea165989f1fa808"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#aaf8558a23ae9be6e7ea165989f1fa808">armnn::LoadedNetwork::FreeWorkingMemory</a></div><div class="ttdeci">void FreeWorkingMemory()</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00781">LoadedNetwork.cpp:781</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_aa311c7fe7e05406c9ff4e4ed3ba09825"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">armnn::Graph::GetOutputLayers</a></div><div class="ttdeci">OutputLayersAccessor GetOutputLayers() const</div><div class="ttdoc">Returns a wrapper object with begin(), end() methods to iterate over the output layers in a range-bas...</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00189">Graph.hpp:189</a></div></div>
<div class="ttc" id="structarmnn_1_1_mem_copy_queue_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_mem_copy_queue_descriptor.xhtml">armnn::MemCopyQueueDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00076">WorkloadData.hpp:76</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a878c3febb600fd2ccf3b5cb1f9a61e27"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a878c3febb600fd2ccf3b5cb1f9a61e27">armnn::LoadedNetwork::EnqueueWorkload</a></div><div class="ttdeci">Status EnqueueWorkload(const InputTensors &amp;inputTensors, const OutputTensors &amp;outputTensors)</div><div class="ttdoc">Single thread execution of the loaded network. </div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00525">LoadedNetwork.cpp:525</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4acb17869fe51048b5a5c4c6106551a255">armnn::LayerType::Constant</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_1profiling_1_1_profiling_service_xhtml"><div class="ttname"><a href="classarmnn_1_1profiling_1_1_profiling_service.xhtml">armnn::profiling::ProfilingService</a></div><div class="ttdef"><b>Definition:</b> <a href="_profiling_service_8hpp_source.xhtml#l00050">ProfilingService.hpp:50</a></div></div>
<div class="ttc" id="_layer_8hpp_xhtml"><div class="ttname"><a href="_layer_8hpp.xhtml">Layer.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4a115bfc5d633eae55c67f9588acdd2bf9"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a115bfc5d633eae55c67f9588acdd2bf9">armnn::LayerType::MemImport</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#l00533">Profiling.cpp:533</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a9afbc055a017adf1bc38ee137bca6e90"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a9afbc055a017adf1bc38ee137bca6e90">armnn::ITensorHandle::Map</a></div><div class="ttdeci">virtual const void * Map(bool blocking=true) const =0</div><div class="ttdoc">Map the tensor data for access. </div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml">armnn::LoadedNetwork</a></div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8hpp_source.xhtml#l00035">LoadedNetwork.hpp:35</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_ac8be6c967db9e797ade32fa3db497422"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#ac8be6c967db9e797ade32fa3db497422">armnn::LoadedNetwork::GetNetworkGuid</a></div><div class="ttdeci">profiling::ProfilingGuid GetNetworkGuid()</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00371">LoadedNetwork.cpp:371</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_xhtml_a563609828050f1b3a7868c23f3365923"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">armnn::ITensorHandle::Unmap</a></div><div class="ttdeci">virtual void Unmap() const =0</div><div class="ttdoc">Unmap the tensor data. </div></div>
<div class="ttc" id="namespacearmnn_xhtml_a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086"><div class="ttname"><a href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">armnn::Status::Failure</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a1a573373f4505385578f830caebf6adb"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a1a573373f4505385578f830caebf6adb">armnn::experimental::WorkingMemHandle::IsAllocated</a></div><div class="ttdeci">bool IsAllocated() override</div><div class="ttdoc">IsAllocated returns true if the backing memory is currently allocated. The mutex must be locked...</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00052">WorkingMemHandle.hpp:52</a></div></div>
<div class="ttc" id="structarmnn_1_1_queue_descriptor_xhtml_a6abd491bb99ffe88bd472c1ae5a1ed1a"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">armnn::QueueDescriptor::m_Outputs</a></div><div class="ttdeci">std::vector&lt; ITensorHandle * &gt; m_Outputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00031">WorkloadData.hpp:31</a></div></div>
<div class="ttc" id="classarmnn_1_1_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_exception.xhtml">armnn::Exception</a></div><div class="ttdoc">Base class for all ArmNN exceptions so that users can filter to just those. </div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00046">Exceptions.hpp:46</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_af2c0edc7ea62a8baaec4d3d9b2b09256"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#af2c0edc7ea62a8baaec4d3d9b2b09256">armnn::Layer::GetOutputHandler</a></div><div class="ttdeci">const OutputHandler &amp; GetOutputHandler(unsigned int i=0) const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00225">Layer.hpp:225</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="classarmnn_1_1_memory_import_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_memory_import_exception.xhtml">armnn::MemoryImportException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00125">Exceptions.hpp:125</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.xhtml">armnn::ITensorHandleFactory</a></div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.xhtml#l00042">ITensorHandleFactory.hpp:42</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a091ea8d2d804c8902f3120fdf2a36512"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a091ea8d2d804c8902f3120fdf2a36512">armnn::LoadedNetwork::RegisterDebugCallback</a></div><div class="ttdeci">void RegisterDebugCallback(const DebugCallbackFunction &amp;func)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01249">LoadedNetwork.cpp:1249</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_afad4088a9a058114ee5f87246f87bf49"><div class="ttname"><a href="namespacearmnn.xhtml#afad4088a9a058114ee5f87246f87bf49">armnn::LayerGuid</a></div><div class="ttdeci">profiling::ProfilingGuid LayerGuid</div><div class="ttdoc">Define LayerGuid type. </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00313">Types.hpp:313</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_handle_factory_registry_xhtml_ae5ecc42140a12c855554a4a621fc8456"><div class="ttname"><a href="classarmnn_1_1_tensor_handle_factory_registry.xhtml#ae5ecc42140a12c855554a4a621fc8456">armnn::TensorHandleFactoryRegistry::GetFactory</a></div><div class="ttdeci">ITensorHandleFactory * GetFactory(ITensorHandleFactory::FactoryId id) const</div><div class="ttdoc">Find a TensorHandleFactory by Id Returns nullptr if not found. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_handle_factory_registry_8cpp_source.xhtml#l00039">TensorHandleFactoryRegistry.cpp:39</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">armnn::LayerType::Input</a></div></div>
<div class="ttc" id="structarmnn_1_1experimental_1_1_working_mem_descriptor_xhtml_a6abd491bb99ffe88bd472c1ae5a1ed1a"><div class="ttname"><a href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">armnn::experimental::WorkingMemDescriptor::m_Outputs</a></div><div class="ttdeci">std::vector&lt; ITensorHandle * &gt; m_Outputs</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_descriptor_8hpp_source.xhtml#l00021">WorkingMemDescriptor.hpp:21</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_xhtml_a32f4aa6a7089d877af08928139c2c277"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">armnn::ITensorHandleFactory::FactoryId</a></div><div class="ttdeci">std::string FactoryId</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.xhtml#l00045">ITensorHandleFactory.hpp:45</a></div></div>
<div class="ttc" id="include_2armnn_2backends_2_i_memory_manager_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_2backends_2_i_memory_manager_8hpp.xhtml">IMemoryManager.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_memory_export_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_memory_export_exception.xhtml">armnn::MemoryExportException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00130">Exceptions.hpp:130</a></div></div>
<div class="ttc" id="structarmnn_1_1_workload_info_xhtml"><div class="ttname"><a href="structarmnn_1_1_workload_info.xhtml">armnn::WorkloadInfo</a></div><div class="ttdoc">Contains information about TensorInfos of a layer. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_workload_info_8hpp_source.xhtml#l00016">WorkloadInfo.hpp:16</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_handle_factory_registry_xhtml_a7d5faf6ceef6e7246b3b4976869b7a18"><div class="ttname"><a href="classarmnn_1_1_tensor_handle_factory_registry.xhtml#a7d5faf6ceef6e7246b3b4976869b7a18">armnn::TensorHandleFactoryRegistry::GetMemoryManagers</a></div><div class="ttdeci">std::vector&lt; std::shared_ptr&lt; IMemoryManager &gt; &gt; &amp; GetMemoryManagers()</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_handle_factory_registry_8hpp_source.xhtml#l00048">TensorHandleFactoryRegistry.hpp:48</a></div></div>
<div class="ttc" id="_mem_sync_workload_8hpp_xhtml"><div class="ttname"><a href="_mem_sync_workload_8hpp.xhtml">MemSyncWorkload.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a84f86b4de5adf0b164e811c87051a0ee"><div class="ttname"><a href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">armnn::CheckFlag</a></div><div class="ttdeci">bool CheckFlag(MemorySourceFlags flags, MemorySource source)</div><div class="ttdef"><b>Definition:</b> <a href="_memory_sources_8hpp_source.xhtml#l00041">MemorySources.hpp:41</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a92c91193007aa49f4732d6dba5397f8d"><div class="ttname"><a href="namespacearmnn.xhtml#a92c91193007aa49f4732d6dba5397f8d">armnn::CopyTensorContentsGeneric</a></div><div class="ttdeci">void CopyTensorContentsGeneric(const ITensorHandle *srcTensor, ITensorHandle *dstTensor, CopyFunc copy)</div><div class="ttdef"><b>Definition:</b> <a href="_workload_utils_8hpp_source.xhtml#l00047">WorkloadUtils.hpp:47</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_a9a7209345edfdb2b066b0ceb66414d7c"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">armnn::Graph::TopologicalSort</a></div><div class="ttdeci">Graph &amp; TopologicalSort()</div><div class="ttdoc">Sorts layers in topological order and return this. </div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00177">Graph.hpp:177</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_a919fb58873ef3a6549e4490e226f2eae"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">armnn::Graph::GetInputLayers</a></div><div class="ttdeci">InputLayersAccessor GetInputLayers() const</div><div class="ttdoc">Returns a wrapper object with begin(), end() methods to iterate over the input layers in a range-base...</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00185">Graph.hpp:185</a></div></div>
<div class="ttc" id="structarmnn_1_1_queue_descriptor_xhtml_a4b50e46a6810018f3edecfb68b2a76b3"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">armnn::QueueDescriptor::m_Inputs</a></div><div class="ttdeci">std::vector&lt; ITensorHandle * &gt; m_Inputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00030">WorkloadData.hpp:30</a></div></div>
<div class="ttc" id="_heap_profiling_8hpp_xhtml"><div class="ttname"><a href="_heap_profiling_8hpp.xhtml">HeapProfiling.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_afdf8eb85585a798ad0e936bde884d87b"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#afdf8eb85585a798ad0e936bde884d87b">armnn::Graph::GetNumLayers</a></div><div class="ttdeci">size_t GetNumLayers() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00191">Graph.hpp:191</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_a0e8cb8533d1d0b2cb93f926dac11dd16"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#a0e8cb8533d1d0b2cb93f926dac11dd16">armnn::IBackendInternal::CreateMemoryManager</a></div><div class="ttdeci">virtual ARMNN_NO_DEPRECATE_WARN_END IMemoryManagerUniquePtr CreateMemoryManager() const</div><div class="ttdef"><b>Definition:</b> <a href="_i_backend_internal_8cpp_source.xhtml#l00032">IBackendInternal.cpp:32</a></div></div>
<div class="ttc" id="structarmnn_1_1_mem_sync_queue_descriptor_xhtml"><div class="ttname"><a href="structarmnn_1_1_mem_sync_queue_descriptor.xhtml">armnn::MemSyncQueueDescriptor</a></div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00089">WorkloadData.hpp:89</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a9ef4b4b6c421b5fd4b62274e63d08f11"><div class="ttname"><a href="namespacearmnn.xhtml#a9ef4b4b6c421b5fd4b62274e63d08f11">armnn::GetInputTensor</a></div><div class="ttdeci">const armnn::ConstTensor GetInputTensor(const LayerBindingId layerId, const InputTensors &amp;inputTensors)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00977">LoadedNetwork.cpp:977</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_af7ec4c0fa4375a45a70e4e31f3d8af47"><div class="ttname"><a href="namespacearmnn.xhtml#af7ec4c0fa4375a45a70e4e31f3d8af47">armnn::GetTensorInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetTensorInfo(const ITensorHandle *tensorHandle)</div><div class="ttdoc">float32 helpers </div><div class="ttdef"><b>Definition:</b> <a href="_ref_workload_utils_8hpp_source.xhtml#l00026">RefWorkloadUtils.hpp:26</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_loaded_network_xhtml_a8e94a5375ad367ddee9c69e04e110a54"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a8e94a5375ad367ddee9c69e04e110a54">armnn::LoadedNetwork::MakeLoadedNetwork</a></div><div class="ttdeci">static std::unique_ptr&lt; LoadedNetwork &gt; MakeLoadedNetwork(std::unique_ptr&lt; IOptimizedNetwork &gt; net, std::string &amp;errorMessage, const INetworkProperties &amp;networkProperties, profiling::ProfilingService &amp;profilingService)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00081">LoadedNetwork.cpp:81</a></div></div>
<div class="ttc" id="classarmnn_1_1_graph_xhtml_a8d8179a4a0703602a5d7dbb6e92eaf69"><div class="ttname"><a href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">armnn::Graph::GetNumInputs</a></div><div class="ttdeci">size_t GetNumInputs() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00180">Graph.hpp:180</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_xhtml_a375f11dd42ff042435e8771cf287b20c"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">armnn::ITensorHandleFactory::CreateTensorHandle</a></div><div class="ttdeci">virtual std::unique_ptr&lt; ITensorHandle &gt; CreateTensorHandle(const TensorInfo &amp;tensorInfo) const =0</div></div>
<div class="ttc" id="classarmnn_1_1_i_tensor_handle_factory_xhtml_a9c95f90eb40e31f629e0e2947b8bc6f9"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a9c95f90eb40e31f629e0e2947b8bc6f9">armnn::ITensorHandleFactory::LegacyFactoryId</a></div><div class="ttdeci">static const FactoryId LegacyFactoryId</div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_factory_8hpp_source.xhtml#l00046">ITensorHandleFactory.hpp:46</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml">armnn::experimental::WorkingMemHandle</a></div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00024">WorkingMemHandle.hpp:24</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml">armnn::Layer</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00210">Layer.hpp:210</a></div></div>
<div class="ttc" id="structarmnn_1_1_i_network_properties_xhtml_a7e26a8e7f1878d82bef452ef3531eaeb"><div class="ttname"><a href="structarmnn_1_1_i_network_properties.xhtml#a7e26a8e7f1878d82bef452ef3531eaeb">armnn::INetworkProperties::m_ProfilingEnabled</a></div><div class="ttdeci">const bool m_ProfilingEnabled</div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00086">IRuntime.hpp:86</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 class="ttc" id="classarmnn_1_1_layer_xhtml_a8dc12f0ee5b232d397bd18ced1a72a64"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">armnn::Layer::GetGuid</a></div><div class="ttdeci">LayerGuid GetGuid() const final</div><div class="ttdoc">Returns the unique id of the layer. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00322">Layer.hpp:322</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a23e33c3caadba06bcd5b50dc2c23c19e"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a23e33c3caadba06bcd5b50dc2c23c19e">armnn::LoadedNetwork::SendNetworkStructure</a></div><div class="ttdeci">void SendNetworkStructure()</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l00334">LoadedNetwork.cpp:334</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="_loaded_network_8cpp.xhtml">LoadedNetwork.cpp</a></li>
    <li class="footer">Generated on Tue Aug 24 2021 16:18:20 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>