aboutsummaryrefslogtreecommitdiff
path: root/22.02/_loaded_network_8cpp_source.xhtml
blob: f2a1aa7f92deb33e681d42e4c1d33f6b1ea363dd (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
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
<!-- 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">22.02</span>
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_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="include_2armnn_2backends_2_tensor_handle_8hpp.xhtml">armnn/backends/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="include_2armnn_2backends_2_mem_copy_workload_8hpp.xhtml">armnn/backends/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;<span class="preprocessor">#include &lt;<a class="code" href="_backend_helper_8hpp.xhtml">armnn/BackendHelper.hpp</a>&gt;</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#include &lt;fmt/format.h&gt;</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;</div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></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;</div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespacestd.xhtml">std</a>;</div><div class="line"><a name="l00030"></a><span class="lineno">   30</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="l00031"></a><span class="lineno">   31</span>&#160;</div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;<span class="keyword">namespace</span></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;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> ExceptionType&gt;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</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="l00037"></a><span class="lineno">   37</span>&#160;{</div><div class="line"><a name="l00038"></a><span class="lineno">   38</span>&#160;    std::stringstream ss;</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;    ss &lt;&lt; prefix &lt;&lt; <span class="stringliteral">&quot; &quot;</span> &lt;&lt; error.what();</div><div class="line"><a name="l00040"></a><span class="lineno">   40</span>&#160;    <span class="keywordflow">return</span> ss.str();</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;</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;<span class="keywordtype">void</span> AddLayerStructure(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l00044"></a><span class="lineno">   44</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="l00045"></a><span class="lineno">   45</span>&#160;                       ProfilingGuid networkGuid)</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;{</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00048"></a><span class="lineno">   48</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="l00049"></a><span class="lineno">   49</span>&#160;    timelineUtils-&gt;CreateNamedTypedChildEntity(layer.GetGuid(),</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;                                               networkGuid,</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;                                               layerName,</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;                                               LabelsAndEventClasses::LAYER_GUID);</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; input : layer.GetInputSlots())</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    {</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <span class="keyword">const</span> IOutputSlot* source = input.GetConnectedOutputSlot();</div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(source != NULL);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        timelineUtils-&gt;CreateConnectionRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;                                                    source-&gt;GetOwningLayerGuid(),</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;                                                    layer.GetGuid());</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;</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;<span class="keywordtype">void</span> AddWorkloadStructure(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;                          std::unique_ptr&lt;IWorkload&gt;&amp; workload,</div><div class="line"><a name="l00065"></a><span class="lineno">   65</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="l00066"></a><span class="lineno">   66</span>&#160;{</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;    <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    timelineUtils-&gt;CreateTypedEntity(workload-&gt;GetGuid(), LabelsAndEventClasses::WORKLOAD_GUID);</div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    timelineUtils-&gt;MarkEntityWithLabel(workload-&gt;GetGuid(),</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;                                       layer.GetBackendId().Get(),</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;                                       LabelsAndEventClasses::BACKENDID_GUID);</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    <span class="comment">// Link the workload to the layer</span></div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    timelineUtils-&gt;CreateRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;                                      layer.GetGuid(),</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;                                      workload-&gt;GetGuid(),</div><div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160;                                      LabelsAndEventClasses::CHILD_GUID);</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;}</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;</div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;} <span class="comment">// anonymous</span></div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;</div><div class="line"><a name="l00082"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a8e94a5375ad367ddee9c69e04e110a54">   82</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="l00083"></a><span class="lineno">   83</span>&#160;                                                                std::string&amp; errorMessage,</div><div class="line"><a name="l00084"></a><span class="lineno">   84</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="l00085"></a><span class="lineno">   85</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="l00086"></a><span class="lineno">   86</span>&#160;{</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;    std::unique_ptr&lt;LoadedNetwork&gt; loadedNetwork;</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;</div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;    <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="l00090"></a><span class="lineno">   90</span>&#160;    {</div><div class="line"><a name="l00091"></a><span class="lineno">   91</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="l00092"></a><span class="lineno">   92</span>&#160;        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(error) &lt;&lt; errorMessage;</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;        <span class="keywordflow">return</span> std::unique_ptr&lt;LoadedNetwork&gt;();</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;</div><div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160;    {</div><div class="line"><a name="l00099"></a><span class="lineno">   99</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="l00100"></a><span class="lineno">  100</span>&#160;    }</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    <span class="keywordflow">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="l00102"></a><span class="lineno">  102</span>&#160;    {</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;        <span class="keywordflow">return</span> Fail(error);</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    }</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    <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="l00106"></a><span class="lineno">  106</span>&#160;    {</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;        <span class="keywordflow">return</span> Fail(error);</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;    }</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;    {</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;        <span class="keywordflow">return</span> Fail(error);</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;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;    <span class="keywordflow">return</span> loadedNetwork;</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;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;LoadedNetwork::LoadedNetwork(std::unique_ptr&lt;IOptimizedNetwork&gt; net,</div><div class="line"><a name="l00118"></a><span class="lineno">  118</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="l00119"></a><span class="lineno">  119</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="l00120"></a><span class="lineno">  120</span>&#160;                             m_OptimizedNetwork(std::move(net)),</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;                             m_NetworkProperties(networkProperties),</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;                             m_TensorHandleFactoryRegistry(),</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;                             m_ProfilingService(profilingService)</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;{</div><div class="line"><a name="l00125"></a><span class="lineno">  125</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;LoadedNetwork&quot;</span>);</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;    <span class="comment">// Get the profiler and register it for the current thread.</span></div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;    <span class="keyword">const</span> std::shared_ptr&lt;IProfiler&gt;&amp; profiler = m_OptimizedNetwork-&gt;GetProfiler();</div><div class="line"><a name="l00128"></a><span class="lineno">  128</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>(profiler.get());</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;    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="l00131"></a><span class="lineno">  131</span>&#160;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;    profiler-&gt;EnableNetworkDetailsToStdOut(networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#abbc76b61436b870aed2c8592690e9a70">m_OutputNetworkDetailsMethod</a>);</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;    <span class="comment">//First create tensor handlers, backends and workload factories.</span></div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;    <span class="comment">//Handlers are created before workloads are.</span></div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;    <span class="comment">//Because workload creation can modify some of the handlers,</span></div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;    <span class="comment">//(for example the splitter and concat layers).</span></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="keywordtype">bool</span> useExternalMemoryManager = <span class="keyword">false</span>;</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;    <span class="keywordtype">bool</span> useInternalMemoryManager = <span class="keyword">false</span>;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</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="l00142"></a><span class="lineno">  142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno">  143</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="l00144"></a><span class="lineno">  144</span>&#160;    {</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;        m_IsInputImported = std::vector&lt;bool&gt;(order.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;        m_IsOutputImported = std::vector&lt;bool&gt;(order.<a class="code" href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">GetNumOutputs</a>(), <span class="keyword">false</span>);</div><div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;    }</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="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;    {</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;        <span class="keyword">auto</span> <span class="keyword">const</span>&amp; backendId = layer-&gt;GetBackendId();</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;        <span class="keywordflow">if</span> (m_Backends.count(backendId) == 0)</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;        {</div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;            <span class="keyword">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="l00155"></a><span class="lineno">  155</span>&#160;            <span class="keyword">auto</span> it = m_Backends.emplace(std::make_pair(backendId, createBackend()));</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</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="l00158"></a><span class="lineno">  158</span>&#160;</div><div class="line"><a name="l00159"></a><span class="lineno">  159</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;</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                !<a class="code" href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">HasCapability</a>(<a class="code" href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">BackendOptions::BackendOption</a>{<span class="stringliteral">&quot;AsyncExecution&quot;</span>, <span class="keyword">true</span>}, backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a057f6c5c3ab3248050ed548273c4beb9">GetCapabilities</a>()))</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;                std::string er = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend.xhtml#aa9fc23b7155bd678232eeb351059b748">GetId</a>();</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                er += <span class="stringliteral">&quot; does not support AsyncExecution&quot;</span>;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_backend_capability_exception.xhtml">BackendCapabilityException</a>(er);</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;            <span class="keywordflow">if</span> (networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a> &amp;&amp;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;                !<a class="code" href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">HasCapability</a>(<a class="code" href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">BackendOptions::BackendOption</a>{<span class="stringliteral">&quot;ExternallyManagedMemory&quot;</span>, <span class="keyword">true</span>},</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;                backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a057f6c5c3ab3248050ed548273c4beb9">GetCapabilities</a>()))</div><div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;            {</div><div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160;                std::string er = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend.xhtml#aa9fc23b7155bd678232eeb351059b748">GetId</a>();</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;                er += <span class="stringliteral">&quot; does not support ExternallyManagedMemory\n&quot;</span>;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;                er += <span class="stringliteral">&quot;AsyncEnabled networks require all backends to support ExternallyManagedMemory&quot;</span>;</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_backend_capability_exception.xhtml">BackendCapabilityException</a>(er);</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;</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;            <span class="keywordflow">if</span> (<a class="code" href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">HasCapability</a>(<a class="code" href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">BackendOptions::BackendOption</a>{<span class="stringliteral">&quot;ExternallyManagedMemory&quot;</span>, <span class="keyword">true</span>},backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a057f6c5c3ab3248050ed548273c4beb9">GetCapabilities</a>())</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;                &amp;&amp; (m_NetworkProperties.m_ExternalMemoryManagementEnabled ||  m_NetworkProperties.m_AsyncEnabled))</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;            {</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;                m_SupportsExternallyManagedMemory[backend-&gt;<a class="code" href="classarmnn_1_1_i_backend.xhtml#aa9fc23b7155bd678232eeb351059b748">GetId</a>()] = <span class="keyword">true</span>;</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;                useExternalMemoryManager = <span class="keyword">true</span>;</div><div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;            }</div><div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;            {</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;                m_SupportsExternallyManagedMemory[backend-&gt;<a class="code" href="classarmnn_1_1_i_backend.xhtml#aa9fc23b7155bd678232eeb351059b748">GetId</a>()] = <span class="keyword">false</span>;</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;                useInternalMemoryManager = <span class="keyword">true</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;</div><div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;            <a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a72ca1cf423bda4b0a9ffb789627126de">IBackendInternal::IWorkloadFactoryPtr</a> workloadFactory;</div><div class="line"><a name="l00190"></a><span class="lineno">  190</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="l00191"></a><span class="lineno">  191</span>&#160;            {</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;                workloadFactory = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#afd5a5e90515b31c0174f76ec8897e9b1">CreateWorkloadFactory</a>(</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;                    m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;                    m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions(),</div><div class="line"><a name="l00195"></a><span class="lineno">  195</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="l00196"></a><span class="lineno">  196</span>&#160;                    static_cast&lt;MemorySourceFlags&gt;(m_NetworkProperties.m_OutputSource));</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;                m_BackendMemoryMangers.emplace_back(backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#a0fe4c12c8f1f0722d2a91f61c02a687a">CreateMemoryManager</a>());</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;                workloadFactory = backend-&gt;<a class="code" href="classarmnn_1_1_i_backend_internal.xhtml#afd5a5e90515b31c0174f76ec8897e9b1">CreateWorkloadFactory</a>(</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;                        m_BackendMemoryMangers.back(), m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions());</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;            m_WorkloadFactories[backendId ] = std::move(workloadFactory);</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;</div><div class="line"><a name="l00208"></a><span class="lineno">  208</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="l00209"></a><span class="lineno">  209</span>&#160;    {</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</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;            <span class="keyword">auto</span>&amp; workloadFactory = GetWorkloadFactory(*layer);</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;            <span class="keywordtype">bool</span> supportsExternalManager = m_SupportsExternallyManagedMemory[layer-&gt;GetBackendId()];</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;            <span class="keywordflow">switch</span> (layer-&gt;GetType())</div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;            {</div><div class="line"><a name="l00217"></a><span class="lineno">  217</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a115bfc5d633eae55c67f9588acdd2bf9">LayerType::MemImport</a>:</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;                {</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;                    <span class="comment">// If IsImportEnabled is true then we need to set IsMemoryManaged</span></div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;                    <span class="comment">// to false when creating TensorHandles</span></div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;                    layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;                                               workloadFactory,</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;                                               !supportsExternalManager &amp;&amp; !m_NetworkProperties.m_ImportEnabled);</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;                    <span class="keywordflow">break</span>;</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="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>:</div><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;                {</div><div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;                    layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry, workloadFactory, <span class="keyword">true</span>);</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;                }</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;                {</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;                    <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="l00235"></a><span class="lineno">  235</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="l00236"></a><span class="lineno">  236</span>&#160;                    <span class="keywordflow">if</span> ((layer-&gt;GetNumOutputSlots() == 1) &amp;&amp;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;                       (layer-&gt;GetOutputSlots()[0].GetNumConnections() == 1) &amp;&amp;</div><div class="line"><a name="l00238"></a><span class="lineno">  238</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="l00239"></a><span class="lineno">  239</span>&#160;                    {</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;                        layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;                                                   workloadFactory,</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;                                                   !supportsExternalManager &amp;&amp; !m_NetworkProperties.m_ExportEnabled);</div><div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;                    }</div><div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;                    {</div><div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;                        layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry,</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;                                                   workloadFactory,</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;                                                   !supportsExternalManager);</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;                    }</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;                }</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;            }</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;    ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00257"></a><span class="lineno">  257</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="l00258"></a><span class="lineno">  258</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</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;        timelineUtils-&gt;CreateTypedEntity(networkGuid, LabelsAndEventClasses::NETWORK_GUID);</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;        <span class="comment">// Mark the network with a start of life event</span></div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;        timelineUtils-&gt;RecordEvent(networkGuid, LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        <span class="comment">// and with the process ID</span></div><div class="line"><a name="l00264"></a><span class="lineno">  264</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="l00265"></a><span class="lineno">  265</span>&#160;        std::stringstream ss;</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;        ss &lt;&lt; processID;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;        timelineUtils-&gt;MarkEntityWithLabel(networkGuid, ss.str(), LabelsAndEventClasses::PROCESS_ID_GUID);</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;</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;    <span class="comment">//Then create workloads.</span></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;        <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;LoadNetwork_CreateWorkloads&quot;</span>);</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer: order)</div><div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        {</div><div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;            <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160;            {</div><div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160;                <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;                AddLayerStructure(timelineUtils, *layer, networkGuid);</div><div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;            }</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;            <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="l00282"></a><span class="lineno">  282</span>&#160;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;            <span class="keywordflow">switch</span> (layer-&gt;GetType())</div><div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160;            {</div><div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;                <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>:</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;                {</div><div class="line"><a name="l00288"></a><span class="lineno">  288</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="l00289"></a><span class="lineno">  289</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;                }</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;                <span class="keywordflow">default</span>:</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;                {</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;                    <span class="keyword">auto</span> workload = layer-&gt;CreateWorkload(workloadFactory);</div><div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;</div><div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;                    <span class="keywordflow">if</span> (!workload)</div><div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;                    {</div><div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;                        <span class="keyword">const</span> <span class="keywordtype">char</span>* <span class="keyword">const</span> layerName =</div><div class="line"><a name="l00298"></a><span class="lineno">  298</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="l00299"></a><span class="lineno">  299</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="l00300"></a><span class="lineno">  300</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="l00301"></a><span class="lineno">  301</span>&#160;                                            layerName, static_cast&lt;int&gt;(layer-&gt;GetType()), layer-&gt;GetBackendId().Get()</div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;                                ));</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;</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;                    <span class="keywordflow">if</span> (timelineUtils)</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;                        <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;                        AddWorkloadStructure(timelineUtils, workload, *layer);</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;</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;                    <span class="comment">// For async networks ConstantWorkloads are managed exclusively by LoadedNetwork</span></div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;                    <span class="comment">// and are separated out from the other workloads</span></div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;                    <span class="keywordflow">if</span>((networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a>  || useExternalMemoryManager) &amp;&amp;</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;                        layer-&gt;GetType() == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;                    {</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;                        m_ConstantTensorHandles[layer-&gt;GetGuid()] =</div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;                                layer-&gt;GetOutputSlot(0).GetOutputHandler().GetData();</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;                        m_ConstantWorkloads[layer-&gt;GetGuid()] = std::move(workload);</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;                    <span class="keywordflow">else</span></div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;                    {</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;                        m_WorkloadQueue.push_back(std::move(workload));</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;                    }</div><div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;</div><div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;                    <span class="comment">// release the constant data in the layer..</span></div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;                    layer-&gt;ReleaseConstantData();</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;                    <span class="keywordflow">break</span>;</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;                }</div><div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;            }</div><div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;        }</div><div class="line"><a name="l00331"></a><span class="lineno">  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;    <span class="comment">// Gather information about workloads for inputs &amp; outputs</span></div><div class="line"><a name="l00334"></a><span class="lineno">  334</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; m_WorkloadQueue.size() != 0)</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;        <span class="keyword">const</span> <span class="keywordtype">int</span> noOfInputs = <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">int</span>&gt;(order.GetNumInputs());</div><div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;</div><div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;        <span class="comment">// Get indices of all workloads connected to each input and</span></div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;        <span class="comment">// check if they support tensor handle replacement</span></div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* layer: order.GetInputLayers())</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;            <span class="keyword">const</span> <span class="keyword">auto</span> bindingId = layer-&gt;GetBindingId();</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="keywordtype">bool</span> supportsReplacement = <span class="keyword">true</span>;</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="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> inputSlot: layer-&gt;GetOutputSlot(0).GetConnections())</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;            {</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                <span class="keyword">auto</span> workloadIndex = std::distance(order.begin(), order.GetPosInGraph(inputSlot-&gt;GetOwningLayer()));</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;                workloadIndex -= noOfInputs;</div><div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;                m_InputWorkloadSlotPairs[bindingId].emplace_back(WorkloadIndices{</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;                        <a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(workloadIndex), inputSlot-&gt;GetSlotIndex()});</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;                <span class="keyword">auto</span> workload = m_WorkloadQueue[m_InputWorkloadSlotPairs[bindingId].back().m_WorkloadIndex].get();</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;                supportsReplacement &amp;= workload-&gt;SupportsTensorHandleReplacement();</div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;            }</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;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = layer-&gt;GetOutputSlot(0).GetTensorHandleFactoryId();</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;            <span class="comment">// Get matching import factory Id</span></div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> importFactoryId =</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;                    m_TensorHandleFactoryRegistry.GetMatchingImportFactoryId(factoryId);</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;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a> *importFactory = m_TensorHandleFactoryRegistry.GetFactory(importFactoryId);</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;            <span class="keywordflow">if</span> (supportsReplacement &amp;&amp; importFactory)</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;                m_PreImportedInputHandles.emplace_back(</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;                        bindingId, importFactory-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">CreateTensorHandle</a>(layer-&gt;GetOutputSlot(0).GetTensorInfo(), <span class="keyword">false</span>));</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;            <span class="keywordflow">else</span></div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;            {</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;                m_PreImportedInputHandles.emplace_back(bindingId, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;            }</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">  376</span>&#160;        <span class="comment">// Get indices of all workloads connected to each output and</span></div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;        <span class="comment">// check if they support tensor handle replacement</span></div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* layer: order.GetOutputLayers())</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;            <span class="keyword">const</span> <span class="keyword">auto</span> bindingId = layer-&gt;GetBindingId();</div><div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;</div><div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span> outputSlot = layer-&gt;GetInputSlot(0).GetConnectedOutputSlot();</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;            <span class="keyword">auto</span>&amp; indices = m_OutputWorkloadSlotPairs[bindingId];</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;            <span class="keyword">auto</span> workloadIndex = std::distance(order.begin(), order.GetPosInGraph(outputSlot-&gt;GetOwningLayer()));</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;            workloadIndex -= noOfInputs;</div><div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;            indices.m_OutputSlotIndices = WorkloadIndices{<a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(workloadIndex),</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;                                                          outputSlot-&gt;CalculateIndexOnOwner()};</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;            <span class="keywordtype">bool</span> supportsReplacement = <span class="keyword">true</span>;</div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;            <span class="keyword">auto</span> outputWorkload = m_WorkloadQueue[indices.m_OutputSlotIndices.m_WorkloadIndex].get();</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;            supportsReplacement &amp;= outputWorkload-&gt;SupportsTensorHandleReplacement();</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;inputSlot: outputSlot-&gt;GetConnections())</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;            {</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;                <span class="keywordflow">if</span>(inputSlot-&gt;GetOwningLayer().GetType() != <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>)</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;                {</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;                    <span class="keyword">auto</span> inWorkloadIndex = std::distance(order.begin(),</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                                                         order.GetPosInGraph(inputSlot-&gt;GetOwningLayer()));</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;                    inWorkloadIndex -= noOfInputs;</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;                    indices.m_InputSlotIndices.emplace_back(WorkloadIndices{<a class="code" href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">numeric_cast</a>&lt;<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>&gt;(inWorkloadIndex),</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;                                                            inputSlot-&gt;GetSlotIndex()});</div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;                    <span class="keyword">auto</span> inputWorkload = m_WorkloadQueue[indices.m_InputSlotIndices.back().m_WorkloadIndex].get();</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;                    supportsReplacement &amp;= inputWorkload-&gt;SupportsTensorHandleReplacement();</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;                }</div><div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160;            }</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;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = outputSlot-&gt;GetTensorHandleFactoryId();</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;            <span class="comment">// Get matching import factory Id</span></div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> importFactoryId =</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;                    m_TensorHandleFactoryRegistry.GetMatchingImportFactoryId(factoryId);</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a> *importFactory = m_TensorHandleFactoryRegistry.GetFactory(importFactoryId);</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;            <span class="keywordflow">if</span> (supportsReplacement &amp;&amp; importFactory)</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;                m_PreImportedOutputHandles.emplace_back(</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;                        bindingId, importFactory-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">CreateTensorHandle</a>(outputSlot-&gt;GetTensorInfo(), <span class="keyword">false</span>));</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;            <span class="keywordflow">else</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;                m_PreImportedOutputHandles.emplace_back(bindingId, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;            }</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;    }</div><div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadFactory : m_WorkloadFactories)</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;    {</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;        workloadFactory.second-&gt;AfterWorkloadsCreated();</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="keywordflow">if</span> (timelineUtils)</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">// Commit to send the post-optimisation network structure</span></div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;        timelineUtils-&gt;Commit();</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;</div><div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;    <span class="keywordflow">if</span> (useExternalMemoryManager)</div><div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;    {</div><div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;        <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="l00441"></a><span class="lineno">  441</span>&#160;        {</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;            CreateMemoryProfileAsync();</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;        {</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;            CreateMemoryProfile();</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;        }</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;        <span class="keyword">auto</span> backendStrategyMap = <a class="code" href="namespacearmnn.xhtml#ac2807505b850738bc8a1991ce669dd47">BackendRegistryInstance</a>().<a class="code" href="classarmnn_1_1_backend_registry.xhtml#a8a7a14a6f1f1078e1b9d31c60d09e007">GetMemoryOptimizerStrategies</a>();</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; backendMemoryProfile : m_MemBlockMap)</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;        {</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a>&amp; backendId = backendMemoryProfile.first;</div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;            <span class="keywordflow">if</span> (backendStrategyMap.find(backendId) != backendStrategyMap.end())</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;                m_MemBinMap[backendId] = backendStrategyMap[backendId]-&gt;Optimize(backendMemoryProfile.second);</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;            }</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;            <span class="keywordflow">else</span></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;                m_MemBinMap[backendId] = m_ConstantStrategy-&gt;Optimize(backendMemoryProfile.second);</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;            }</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;        }</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;        <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="l00464"></a><span class="lineno">  464</span>&#160;        {</div><div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160;            m_ExternalMemoryManager = CreateExternalMemoryManger(m_TensorMemory);</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="comment">// Sort m_TensorMemory, so it&#39;s order matches m_Tensorhandles</span></div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;            std::sort(m_TensorMemory.begin(), m_TensorMemory.end(),</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;                      [](<span class="keyword">const</span> std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&amp; lhs,</div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;                         <span class="keyword">const</span> std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&amp; rhs)</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;                      {</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;                          <span class="keywordflow">return</span> lhs.first-&gt;m_OutputSlotId &lt; rhs.first-&gt;m_OutputSlotId;</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;    }</div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;    <span class="comment">// Now that the intermediate tensor memory has been set-up,</span></div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;    <span class="comment">// do any post allocation configuration for each workload.</span></div><div class="line"><a name="l00479"></a><span class="lineno">  479</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="l00480"></a><span class="lineno">  480</span>&#160;    {</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;        <span class="keywordflow">if</span> (useInternalMemoryManager)</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;        {</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;            <span class="comment">// Set up memory.</span></div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;            m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().AllocateDynamicBuffers();</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;</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> &amp;workload : m_WorkloadQueue)</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;        {</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;            workload-&gt;PostAllocationConfigure();</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;        }</div><div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;    }</div><div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;</div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    <span class="keywordflow">if</span> (useExternalMemoryManager)</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">if</span> (!networkProperties.<a class="code" href="structarmnn_1_1_i_network_properties.xhtml#ad3ab02a7f6310b35c59ca78b509905ca">m_AsyncEnabled</a>)</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;            AllocateAndExecuteConstantWorkloads();</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;        <span class="keywordflow">else</span></div><div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;        {</div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;            AllocateAndExecuteConstantWorkloadsAsync();</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;    }</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;<span class="keywordtype">void</span> LoadedNetwork::AllocateAndExecuteConstantWorkloads()</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;{</div><div class="line"><a name="l00508"></a><span class="lineno">  508</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;LoadNetwork_AllocateAndExecuteConstants&quot;</span>);</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; pair : m_ConstantWorkloads)</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;        <span class="keyword">auto</span> tensorHandle = m_ConstantTensorHandles[pair.first];</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;        tensorHandle-&gt;Allocate();</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;        pair.second-&gt;Execute();</div><div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160;    }</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;</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;<span class="keywordtype">void</span> LoadedNetwork::AllocateAndExecuteConstantWorkloadsAsync()</div><div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;{</div><div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    <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;LoadNetwork_AllocateAndExecuteConstants&quot;</span>);</div><div class="line"><a name="l00522"></a><span class="lineno">  522</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="l00523"></a><span class="lineno">  523</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</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">  525</span>&#160;        <span class="keywordflow">if</span> (layer-&gt;GetType() == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;        {</div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span>&amp; outSlot = layer-&gt;GetOutputSlots()[0];</div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span> factoryId = outSlot.GetTensorHandleFactoryId();</div><div class="line"><a name="l00529"></a><span class="lineno">  529</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="l00530"></a><span class="lineno">  530</span>&#160;            <span class="keyword">auto</span>&amp; workloadFactory = GetWorkloadFactory(*layer);</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;            layer-&gt;CreateTensorHandles(m_TensorHandleFactoryRegistry, workloadFactory);</div><div class="line"><a name="l00533"></a><span class="lineno">  533</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="l00534"></a><span class="lineno">  534</span>&#160;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;            m_ConstantTensorHandles[layer-&gt;GetGuid()] = tensorHandle;</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;            tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a5cceed8b707a09bf27eb61f17acf8a88">Allocate</a>();</div><div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;</div><div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;            <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> memDesc;</div><div class="line"><a name="l00539"></a><span class="lineno">  539</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="l00540"></a><span class="lineno">  540</span>&#160;            m_ConstantWorkloads[layer-&gt;GetGuid()]-&gt;ExecuteAsync(memDesc);</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;    }</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a23e33c3caadba06bcd5b50dc2c23c19e">  545</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="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;LoadNetwork_SendNetworkStructure&quot;</span>);</div><div class="line"><a name="l00548"></a><span class="lineno">  548</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="l00549"></a><span class="lineno">  549</span>&#160;    ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00552"></a><span class="lineno">  552</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="l00553"></a><span class="lineno">  553</span>&#160;</div><div class="line"><a name="l00554"></a><span class="lineno">  554</span>&#160;    timelineUtils-&gt;CreateTypedEntity(networkGuid, LabelsAndEventClasses::NETWORK_GUID);</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;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    {</div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;        <span class="comment">// Add layer to the post-optimisation network structure</span></div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;        AddLayerStructure(timelineUtils, *layer, networkGuid);</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;        <span class="keywordflow">switch</span> (layer-&gt;GetType())</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;        {</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>:</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>:</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;        {</div><div class="line"><a name="l00565"></a><span class="lineno">  565</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="l00566"></a><span class="lineno">  566</span>&#160;            <span class="keywordflow">break</span>;</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;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;            {</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; workload : m_WorkloadQueue)</div><div class="line"><a name="l00571"></a><span class="lineno">  571</span>&#160;            {</div><div class="line"><a name="l00572"></a><span class="lineno">  572</span>&#160;                <span class="comment">// Add workload to the post-optimisation network structure</span></div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;                AddWorkloadStructure(timelineUtils, workload, *layer);</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;            }</div><div class="line"><a name="l00575"></a><span class="lineno">  575</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;            }</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;        }</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    }</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;    <span class="comment">// Commit to send the post-optimisation network structure</span></div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    timelineUtils-&gt;Commit();</div><div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#ac8be6c967db9e797ade32fa3db497422">  583</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="l00584"></a><span class="lineno">  584</span>&#160;{</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;    <span class="keywordflow">return</span> m_OptimizedNetwork-&gt;GetGuid();</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;</div><div class="line"><a name="l00588"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#af616683424cb40d83b5a923db7f06f11">  588</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="l00589"></a><span class="lineno">  589</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00590"></a><span class="lineno">  590</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="l00591"></a><span class="lineno">  591</span>&#160;    {</div><div class="line"><a name="l00592"></a><span class="lineno">  592</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="l00593"></a><span class="lineno">  593</span>&#160;        <span class="keywordflow">if</span> (inputLayer-&gt;GetBindingId() == layerId)</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;            <span class="keywordflow">return</span> inputLayer-&gt;GetOutputSlot(0).GetTensorInfo();</div><div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;        }</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;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</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="l00600"></a><span class="lineno">  600</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a2b6b57945bc68f659e08d28c8a015e91">  602</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="l00603"></a><span class="lineno">  603</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00604"></a><span class="lineno">  604</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="l00605"></a><span class="lineno">  605</span>&#160;    {</div><div class="line"><a name="l00606"></a><span class="lineno">  606</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="l00607"></a><span class="lineno">  607</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="l00608"></a><span class="lineno">  608</span>&#160;        <span class="keywordflow">if</span> (outputLayer-&gt;GetBindingId() == layerId)</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;        {</div><div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;            <span class="keywordflow">return</span> outputLayer-&gt;GetInputSlot(0).GetConnection()-&gt;GetTensorInfo();</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;    }</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>(fmt::format(<span class="stringliteral">&quot;No output layer is associated with id {}&quot;</span>, layerId));</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;<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="l00618"></a><span class="lineno">  618</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00619"></a><span class="lineno">  619</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="l00620"></a><span class="lineno">  620</span>&#160;</div><div class="line"><a name="l00621"></a><span class="lineno">  621</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="l00622"></a><span class="lineno">  622</span>&#160;    <span class="keywordflow">if</span> (it ==  m_WorkloadFactories.end())</div><div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    {</div><div class="line"><a name="l00624"></a><span class="lineno">  624</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="l00625"></a><span class="lineno">  625</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="l00626"></a><span class="lineno">  626</span>&#160;                                           layer.<a class="code" href="classarmnn_1_1_layer.xhtml#a9a97cb6d32661a57fc33bd29b8e41ff4">GetNameStr</a>()),</div><div class="line"><a name="l00627"></a><span class="lineno">  627</span>&#160;                                           <a class="code" href="_exceptions_8hpp.xhtml#aa3be76aec4ce713822a5ea1ecbb7bc61">CHECK_LOCATION</a>());</div><div class="line"><a name="l00628"></a><span class="lineno">  628</span>&#160;    }</div><div class="line"><a name="l00629"></a><span class="lineno">  629</span>&#160;</div><div class="line"><a name="l00630"></a><span class="lineno">  630</span>&#160;    workloadFactory = it-&gt;second.get();</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="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(workloadFactory, <span class="stringliteral">&quot;No workload factory&quot;</span>);</div><div class="line"><a name="l00633"></a><span class="lineno">  633</span>&#160;</div><div class="line"><a name="l00634"></a><span class="lineno">  634</span>&#160;    std::string reasonIfUnsupported;</div><div class="line"><a name="l00635"></a><span class="lineno">  635</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="l00636"></a><span class="lineno">  636</span>&#160;                                                        {},</div><div class="line"><a name="l00637"></a><span class="lineno">  637</span>&#160;                                                        reasonIfUnsupported,</div><div class="line"><a name="l00638"></a><span class="lineno">  638</span>&#160;                                                        m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetModelOptions()),</div><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;        <span class="stringliteral">&quot;Factory does not support layer&quot;</span>);</div><div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(reasonIfUnsupported);</div><div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    <span class="keywordflow">return</span> *workloadFactory;</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;</div><div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;<span class="keyword">namespace </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;<span class="comment">// Non-copyable class owning accelerator-specific tensor data.</span></div><div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;<span class="keyword">class </span>TensorPin</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;<span class="keyword">public</span>:</div><div class="line"><a name="l00650"></a><span class="lineno">  650</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="l00651"></a><span class="lineno">  651</span>&#160;        : m_TensorHandle(std::move(handle))</div><div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160;        , m_TensorInfo(info)</div><div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;        , m_Id(<span class="keywordtype">id</span>)</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;    }</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;    <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="l00658"></a><span class="lineno">  658</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="l00659"></a><span class="lineno">  659</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="l00660"></a><span class="lineno">  660</span>&#160;</div><div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;    std::unique_ptr&lt;ITensorHandle&gt; m_TensorHandle;</div><div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> m_TensorInfo;</div><div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> m_Id;</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;</div><div class="line"><a name="l00667"></a><span class="lineno">  667</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="l00668"></a><span class="lineno">  668</span>&#160;    <span class="keyword">const</span> std::vector&lt;TensorPin&gt;&amp; pins,</div><div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;    <span class="keywordtype">char</span> <span class="keyword">const</span>* bindingPointDesc)</div><div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;{</div><div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;    <span class="keyword">auto</span> it = std::find_if(pins.begin(), pins.end(),</div><div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;        [id](<span class="keyword">const</span> TensorPin&amp; pin)</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">return</span> pin.GetBindingId() == id;</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> (it != pins.end())</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">return</span> *it;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;    {</div><div class="line"><a name="l00683"></a><span class="lineno">  683</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="l00684"></a><span class="lineno">  684</span>&#160;    }</div><div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;}</div><div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160;</div><div class="line"><a name="l00687"></a><span class="lineno">  687</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="l00688"></a><span class="lineno">  688</span>&#160;<span class="keyword">class </span>WorkloadData</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="keyword">public</span>:</div><div class="line"><a name="l00691"></a><span class="lineno">  691</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="l00692"></a><span class="lineno">  692</span>&#160;    {</div><div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;        m_InputTensorPins.reserve(inputTensors.size());</div><div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160;        m_OutputTensorPins.reserve(outputTensors.size());</div><div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;</div><div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> inputTensorPair : inputTensors)</div><div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;        {</div><div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;            <span class="keyword">auto</span> inputTensor = inputTensorPair.second;</div><div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;</div><div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;                std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.GetInfo(),inputTensor.GetMemoryArea());</div><div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;            <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = inputTensorPair.first;</div><div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;</div><div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;            m_InputTensorPins.emplace_back(std::move(tensorHandle), inputTensor.GetInfo(), layerId);</div><div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160;        }</div><div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;</div><div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> outputTensorPair : outputTensors)</div><div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;        {</div><div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;            <span class="keyword">auto</span> outputTensor = outputTensorPair.second;</div><div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;</div><div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;                std::make_unique&lt;PassthroughTensorHandle&gt;(outputTensor.GetInfo(), outputTensor.GetMemoryArea());</div><div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;            <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerId = outputTensorPair.first;</div><div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;</div><div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;            m_OutputTensorPins.emplace_back(std::move(tensorHandle), outputTensor.GetInfo(), layerId);</div><div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;        }</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;</div><div class="line"><a name="l00719"></a><span class="lineno">  719</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="l00720"></a><span class="lineno">  720</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00721"></a><span class="lineno">  721</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="l00722"></a><span class="lineno">  722</span>&#160;    }</div><div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;</div><div class="line"><a name="l00724"></a><span class="lineno">  724</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="l00725"></a><span class="lineno">  725</span>&#160;<span class="keyword">    </span>{</div><div class="line"><a name="l00726"></a><span class="lineno">  726</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="l00727"></a><span class="lineno">  727</span>&#160;    }</div><div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;</div><div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;<span class="keyword">private</span>:</div><div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;</div><div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;    std::vector&lt;TensorPin&gt; m_InputTensorPins;</div><div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;    std::vector&lt;TensorPin&gt; m_OutputTensorPins;</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;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a87880cba8611688cc57bec8f913958e8">  737</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a87880cba8611688cc57bec8f913958e8">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="l00738"></a><span class="lineno">  738</span>&#160;                                      <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors,</div><div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;                                      std::vector&lt;ImportedInputId&gt; preImportedInputIds,</div><div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;                                      std::vector&lt;ImportedOutputId&gt; preImportedOutputIds)</div><div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160;{</div><div class="line"><a name="l00742"></a><span class="lineno">  742</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="l00743"></a><span class="lineno">  743</span>&#160;</div><div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;    <span class="comment">// Walk graph to determine the order of execution.</span></div><div class="line"><a name="l00745"></a><span class="lineno">  745</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="l00746"></a><span class="lineno">  746</span>&#160;    {</div><div class="line"><a name="l00747"></a><span class="lineno">  747</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="l00748"></a><span class="lineno">  748</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70bae139a585510a502bbf1841cf589f5086">Status::Failure</a>;</div><div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;    }</div><div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;</div><div class="line"><a name="l00751"></a><span class="lineno">  751</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="l00752"></a><span class="lineno">  752</span>&#160;    WorkloadData workloadData(inputTensors, outputTensors);</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;    <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="l00755"></a><span class="lineno">  755</span>&#160;    {</div><div class="line"><a name="l00756"></a><span class="lineno">  756</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="l00757"></a><span class="lineno">  757</span>&#160;    }</div><div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno">  759</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="l00760"></a><span class="lineno">  760</span>&#160;    {</div><div class="line"><a name="l00761"></a><span class="lineno">  761</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="l00762"></a><span class="lineno">  762</span>&#160;        m_InputQueue.clear();</div><div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160;        m_InputQueue.reserve(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>());</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> (preImportedInputIds.size() &gt; graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>())</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">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Invalid number of preImportedInputIds&quot;</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;</div><div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputIndex = 0;</div><div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> importedInputIdIndex = 0;</div><div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;        std::sort(preImportedInputIds.begin(), preImportedInputIds.end());</div><div class="line"><a name="l00773"></a><span class="lineno">  773</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="l00774"></a><span class="lineno">  774</span>&#160;        {</div><div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;            <span class="keywordflow">if</span> (importedInputIdIndex &lt; preImportedInputIds.size() &amp;&amp;</div><div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;                inputIndex == preImportedInputIds[importedInputIdIndex])</div><div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;            {</div><div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;                <span class="comment">// Only replace tensorhandles if they have not already been replaced</span></div><div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;                <span class="keywordflow">if</span> (!m_IsInputImported[inputIndex])</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">  781</span>&#160;                    <span class="keyword">auto</span> outputTensorHandle = m_PreImportedInputHandles[inputIndex].m_TensorHandle.get();</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;                    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; workloadInfo: m_InputWorkloadSlotPairs[inputLayer-&gt;GetBindingId()])</div><div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;                    {</div><div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;                        <span class="keyword">auto</span> workload = m_WorkloadQueue[workloadInfo.m_WorkloadIndex].get();</div><div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;                        workload-&gt;ReplaceInputTensorHandle(outputTensorHandle, workloadInfo.m_SlotIndex);</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;                    m_IsInputImported[inputIndex] = <span class="keyword">true</span>;</div><div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;                }</div><div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160;                importedInputIdIndex++;</div><div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;            }</div><div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;            <span class="keywordflow">else</span></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;                <span class="keywordflow">if</span> (m_IsInputImported[inputIndex])</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;                    <a class="code" href="classarmnn_1_1_output_handler.xhtml">OutputHandler</a>&amp; handler = <span class="keyword">const_cast&lt;</span><a class="code" href="classarmnn_1_1_output_handler.xhtml">OutputHandler</a>&amp;<span class="keyword">&gt;</span>(inputLayer-&gt;GetOutputHandler(0));</div><div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;</div><div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;                    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; workloadInfo: m_InputWorkloadSlotPairs[inputLayer-&gt;GetBindingId()])</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;                        <span class="keyword">auto</span> workload = m_WorkloadQueue[workloadInfo.m_WorkloadIndex].get();</div><div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;                        workload-&gt;ReplaceInputTensorHandle(handler.<a class="code" href="classarmnn_1_1_output_handler.xhtml#afe3429ac30b180c11f01ea0f9f546f0e">GetData</a>(), workloadInfo.m_SlotIndex);</div><div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160;                    }</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;                    m_IsInputImported[inputIndex] = <span class="keyword">false</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;</div><div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;                <span class="comment">// InputTensorHandle is not imported yet, process to enqueue input</span></div><div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;                <span class="keyword">const</span> TensorPin&amp; pin = workloadData.GetInputTensorPin(inputLayer-&gt;GetBindingId());</div><div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160;                EnqueueInput(*inputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());</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;            inputIndex++;</div><div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;        }</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;    <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="l00815"></a><span class="lineno">  815</span>&#160;    {</div><div class="line"><a name="l00816"></a><span class="lineno">  816</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="l00817"></a><span class="lineno">  817</span>&#160;        m_OutputQueue.clear();</div><div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;        m_OutputQueue.reserve(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">GetNumOutputs</a>());</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">if</span> (preImportedOutputIds.size() &gt; graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">GetNumOutputs</a>())</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">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;Invalid number of preImportedOutputIds&quot;</span>);</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;</div><div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputIndex = 0;</div><div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> importedOutputIdIndex = 0;</div><div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;        std::sort(preImportedOutputIds.begin(), preImportedOutputIds.end());</div><div class="line"><a name="l00828"></a><span class="lineno">  828</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="l00829"></a><span class="lineno">  829</span>&#160;        {</div><div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;            <span class="keywordflow">if</span> (importedOutputIdIndex &lt; preImportedOutputIds.size() &amp;&amp;</div><div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;                outputIndex == preImportedOutputIds[importedOutputIdIndex])</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;                <span class="comment">// Only replace tensorhandles if they have not already been replaced</span></div><div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;                <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = m_PreImportedOutputHandles[outputIndex].m_TensorHandle.get();</div><div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;</div><div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;                <span class="keywordflow">if</span> (!m_IsOutputImported[outputIndex])</div><div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;                {</div><div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;                    <span class="keyword">const</span> <span class="keyword">auto</span> bindingId = outputLayer-&gt;GetBindingId();</div><div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160;                    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; indices = m_OutputWorkloadSlotPairs[bindingId];</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;                    <span class="keyword">auto</span> outputWorkload = m_WorkloadQueue[indices.m_OutputSlotIndices.m_WorkloadIndex].get();</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;                    outputWorkload-&gt;ReplaceOutputTensorHandle(inputTensorHandle,</div><div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;                                                              indices.m_OutputSlotIndices.m_SlotIndex);</div><div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;</div><div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160;                    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; workloadInfo: indices.m_InputSlotIndices)</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="keyword">auto</span> inputWorkload = m_WorkloadQueue[workloadInfo.m_WorkloadIndex].get();</div><div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;                        inputWorkload-&gt;ReplaceInputTensorHandle(inputTensorHandle, workloadInfo.m_SlotIndex);</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;                    m_IsOutputImported[outputIndex] = <span class="keyword">true</span>;</div><div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;                }</div><div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;</div><div class="line"><a name="l00854"></a><span class="lineno">  854</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="l00855"></a><span class="lineno">  855</span>&#160;                <a class="code" href="structarmnn_1_1_mem_sync_queue_descriptor.xhtml">MemSyncQueueDescriptor</a> syncDesc;</div><div class="line"><a name="l00856"></a><span class="lineno">  856</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="l00857"></a><span class="lineno">  857</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="l00858"></a><span class="lineno">  858</span>&#160;                info.<a class="code" href="structarmnn_1_1_workload_info.xhtml#ac97905bfa0daab357b91df1347600309">m_InputTensorInfos</a>.push_back(</div><div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;                        outputLayer-&gt;GetInputSlot(0).GetConnectedOutputSlot()-&gt;GetTensorInfo());</div><div class="line"><a name="l00860"></a><span class="lineno">  860</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="l00861"></a><span class="lineno">  861</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="l00862"></a><span class="lineno">  862</span>&#160;                m_OutputQueue.push_back(move(syncWorkload));</div><div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;                importedOutputIdIndex++;</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">else</span></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="keywordflow">if</span> (m_IsOutputImported[outputIndex])</div><div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;                {</div><div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;                    <span class="keyword">const</span> <span class="keyword">auto</span> bindingId = outputLayer-&gt;GetBindingId();</div><div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;                    <span class="keyword">const</span> <span class="keyword">auto</span>&amp; indices = m_OutputWorkloadSlotPairs[bindingId];</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="keyword">auto</span> outputWorkload = m_WorkloadQueue[indices.m_OutputSlotIndices.m_WorkloadIndex].get();</div><div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;                    <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_output_handler.xhtml">OutputHandler</a>&amp; outputHandler =</div><div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;                            outputLayer-&gt;GetInputSlot(0).GetConnectedOutputSlot()-&gt;GetOutputHandler();</div><div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;</div><div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;                    outputWorkload-&gt;ReplaceOutputTensorHandle(</div><div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;                            outputHandler.<a class="code" href="classarmnn_1_1_output_handler.xhtml#afe3429ac30b180c11f01ea0f9f546f0e">GetData</a>(), indices.m_OutputSlotIndices.m_SlotIndex);</div><div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;</div><div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;                    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; workloadInfo: indices.m_InputSlotIndices)</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="keyword">auto</span> inputWorkload = m_WorkloadQueue[workloadInfo.m_WorkloadIndex].get();</div><div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;                        inputWorkload-&gt;ReplaceInputTensorHandle(outputHandler.<a class="code" href="classarmnn_1_1_output_handler.xhtml#afe3429ac30b180c11f01ea0f9f546f0e">GetData</a>(), workloadInfo.m_SlotIndex);</div><div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;                    }</div><div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;                    m_IsOutputImported[outputIndex] = <span class="keyword">false</span>;</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;</div><div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;                <span class="keyword">const</span> TensorPin&amp; pin = workloadData.GetOutputTensorPin(outputLayer-&gt;GetBindingId());</div><div class="line"><a name="l00888"></a><span class="lineno">  888</span>&#160;                <span class="comment">// OutputTensorHandle is not imported yet, process to enqueue Output</span></div><div class="line"><a name="l00889"></a><span class="lineno">  889</span>&#160;                EnqueueOutput(*outputLayer, pin.GetTensorHandle(), pin.GetTensorInfo());</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;            outputIndex++;</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;    }</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;    std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00896"></a><span class="lineno">  896</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="l00897"></a><span class="lineno">  897</span>&#160;    ProfilingGuid inferenceGuid = m_ProfilingService.GetNextGuid();</div><div class="line"><a name="l00898"></a><span class="lineno">  898</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</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;        <span class="comment">// Add inference timeline trace if profiling is enabled.</span></div><div class="line"><a name="l00901"></a><span class="lineno">  901</span>&#160;        ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l00902"></a><span class="lineno">  902</span>&#160;        timelineUtils-&gt;CreateTypedEntity(inferenceGuid, LabelsAndEventClasses::INFERENCE_GUID);</div><div class="line"><a name="l00903"></a><span class="lineno">  903</span>&#160;        timelineUtils-&gt;CreateRelationship(ProfilingRelationshipType::RetentionLink,</div><div class="line"><a name="l00904"></a><span class="lineno">  904</span>&#160;                                          networkGuid,</div><div class="line"><a name="l00905"></a><span class="lineno">  905</span>&#160;                                          inferenceGuid,</div><div class="line"><a name="l00906"></a><span class="lineno">  906</span>&#160;                                          LabelsAndEventClasses::EXECUTION_OF_GUID);</div><div class="line"><a name="l00907"></a><span class="lineno">  907</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</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;</div><div class="line"><a name="l00910"></a><span class="lineno">  910</span>&#160;    <span class="keywordtype">bool</span> executionSucceeded = <span class="keyword">true</span>;</div><div class="line"><a name="l00911"></a><span class="lineno">  911</span>&#160;</div><div class="line"><a name="l00912"></a><span class="lineno">  912</span>&#160;    {</div><div class="line"><a name="l00913"></a><span class="lineno">  913</span>&#160;        <span class="keywordflow">if</span> (m_ProfilingService.IsProfilingEnabled())</div><div class="line"><a name="l00914"></a><span class="lineno">  914</span>&#160;        {</div><div class="line"><a name="l00915"></a><span class="lineno">  915</span>&#160;            m_ProfilingService.IncrementCounterValue(armnn::profiling::INFERENCES_RUN);</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;        <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="l00918"></a><span class="lineno">  918</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="l00919"></a><span class="lineno">  919</span>&#160;        executionSucceeded = Execute(timelineUtils, inferenceGuid);</div><div class="line"><a name="l00920"></a><span class="lineno">  920</span>&#160;    }</div><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;</div><div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    {</div><div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;        <span class="comment">// Add end of life of the inference timeline if profiling is enabled.</span></div><div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS);</div><div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;        timelineUtils-&gt;Commit();</div><div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    }</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;    <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="l00930"></a><span class="lineno">  930</span>&#160;}</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;<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="l00933"></a><span class="lineno">  933</span>&#160;{</div><div class="line"><a name="l00934"></a><span class="lineno">  934</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="l00935"></a><span class="lineno">  935</span>&#160;    {</div><div class="line"><a name="l00936"></a><span class="lineno">  936</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="l00937"></a><span class="lineno">  937</span>&#160;    }</div><div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160;</div><div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;    <span class="keywordflow">if</span> (tensorHandle == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160;    {</div><div class="line"><a name="l00941"></a><span class="lineno">  941</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="l00942"></a><span class="lineno">  942</span>&#160;    }</div><div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;</div><div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;    <a class="code" href="structarmnn_1_1_mem_copy_queue_descriptor.xhtml">InputQueueDescriptor</a> inputQueueDescriptor;</div><div class="line"><a name="l00945"></a><span class="lineno">  945</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="l00946"></a><span class="lineno">  946</span>&#160;</div><div class="line"><a name="l00947"></a><span class="lineno">  947</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="l00948"></a><span class="lineno">  948</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="l00949"></a><span class="lineno">  949</span>&#160;</div><div class="line"><a name="l00950"></a><span class="lineno">  950</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="l00951"></a><span class="lineno">  951</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="l00952"></a><span class="lineno">  952</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="l00953"></a><span class="lineno">  953</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* outputTensorHandle = handler.GetData();</div><div class="line"><a name="l00954"></a><span class="lineno">  954</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="l00955"></a><span class="lineno">  955</span>&#160;                     <span class="stringliteral">&quot;Data should have been allocated.&quot;</span>);</div><div class="line"><a name="l00956"></a><span class="lineno">  956</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="l00957"></a><span class="lineno">  957</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="l00958"></a><span class="lineno">  958</span>&#160;</div><div class="line"><a name="l00959"></a><span class="lineno">  959</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="l00960"></a><span class="lineno">  960</span>&#160;    <span class="keywordtype">bool</span> needMemCopy = <span class="keyword">true</span>;</div><div class="line"><a name="l00961"></a><span class="lineno">  961</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="l00962"></a><span class="lineno">  962</span>&#160;    {</div><div class="line"><a name="l00963"></a><span class="lineno">  963</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="l00964"></a><span class="lineno">  964</span>&#160;        {</div><div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;            needMemCopy = <span class="keyword">false</span>;</div><div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;            <span class="comment">// This assumes a CPU Tensor handle</span></div><div class="line"><a name="l00967"></a><span class="lineno">  967</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="l00968"></a><span class="lineno">  968</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="l00969"></a><span class="lineno">  969</span>&#160;            {</div><div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;                tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00971"></a><span class="lineno">  971</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="l00972"></a><span class="lineno">  972</span>&#160;            }</div><div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;            tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l00974"></a><span class="lineno">  974</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="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">  977</span>&#160;    <span class="keywordflow">if</span> (needMemCopy)</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="comment">// Create a mem copy workload for input since we did not import</span></div><div class="line"><a name="l00980"></a><span class="lineno">  980</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="l00981"></a><span class="lineno">  981</span>&#160;</div><div class="line"><a name="l00982"></a><span class="lineno">  982</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="l00983"></a><span class="lineno">  983</span>&#160;</div><div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;        std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l00985"></a><span class="lineno">  985</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="l00986"></a><span class="lineno">  986</span>&#160;        <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;        {</div><div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;            <span class="comment">// Add Input Workload to the post-optimisation network structure</span></div><div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;            AddWorkloadStructure(timelineUtils, inputWorkload, layer);</div><div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;            timelineUtils-&gt;Commit();</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;</div><div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;        m_InputQueue.push_back(move(inputWorkload));</div><div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;    }</div><div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;}</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="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="l00998"></a><span class="lineno">  998</span>&#160;{</div><div class="line"><a name="l00999"></a><span class="lineno">  999</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="l01000"></a><span class="lineno"> 1000</span>&#160;    {</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</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="l01002"></a><span class="lineno"> 1002</span>&#160;    }</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;    <span class="keywordflow">if</span> (tensorHandle == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;    {</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</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="l01007"></a><span class="lineno"> 1007</span>&#160;    }</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;    <a class="code" href="structarmnn_1_1_mem_copy_queue_descriptor.xhtml">OutputQueueDescriptor</a> outputQueueDescriptor;</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</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="l01011"></a><span class="lineno"> 1011</span>&#160;</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</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="l01013"></a><span class="lineno"> 1013</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="l01014"></a><span class="lineno"> 1014</span>&#160;</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</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="l01016"></a><span class="lineno"> 1016</span>&#160;</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160;    <span class="comment">// Gets the output handler from the previous node.</span></div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</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="l01019"></a><span class="lineno"> 1019</span>&#160;</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</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="l01021"></a><span class="lineno"> 1021</span>&#160;    <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = outputHandler.GetData();</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</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="l01023"></a><span class="lineno"> 1023</span>&#160;</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160;    <span class="comment">// Try import the output tensor.</span></div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</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="l01026"></a><span class="lineno"> 1026</span>&#160;    <span class="comment">// a) The imported pointer is aligned sufficiently</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160;    <span class="comment">// b) The tensor has zero padding</span></div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</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="l01029"></a><span class="lineno"> 1029</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="l01030"></a><span class="lineno"> 1030</span>&#160;    <span class="comment">// e) m_IsExportEnabled must be set to true</span></div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    <span class="keywordtype">bool</span> needMemCopy = <span class="keyword">true</span>;</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160;    <span class="keywordflow">if</span> (m_NetworkProperties.m_ExportEnabled &amp;&amp;</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</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="l01034"></a><span class="lineno"> 1034</span>&#160;    {</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</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="l01036"></a><span class="lineno"> 1036</span>&#160;        {</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</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="l01038"></a><span class="lineno"> 1038</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="l01039"></a><span class="lineno"> 1039</span>&#160;            {</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160;                needMemCopy = <span class="keyword">false</span>;</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</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="l01042"></a><span class="lineno"> 1042</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="l01043"></a><span class="lineno"> 1043</span>&#160;                tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a563609828050f1b3a7868c23f3365923">Unmap</a>();</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160;</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160;                <span class="keywordflow">if</span> (importOk)</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="comment">// Insert synchronization workload</span></div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160;                    <a class="code" href="structarmnn_1_1_mem_sync_queue_descriptor.xhtml">MemSyncQueueDescriptor</a> syncDesc;</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</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="l01050"></a><span class="lineno"> 1050</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="l01051"></a><span class="lineno"> 1051</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="l01052"></a><span class="lineno"> 1052</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="l01053"></a><span class="lineno"> 1053</span>&#160;                    m_OutputQueue.push_back(move(syncWorkload));</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;                }</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160;                {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</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="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;        }</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;    <span class="keywordflow">if</span> (needMemCopy)</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    {</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</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="l01065"></a><span class="lineno"> 1065</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="l01066"></a><span class="lineno"> 1066</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="l01067"></a><span class="lineno"> 1067</span>&#160;</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;        std::unique_ptr&lt;IWorkload&gt; outputWorkload =</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;            std::make_unique&lt;CopyMemGenericWorkload&gt;(outputQueueDescriptor, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>);</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</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="l01071"></a><span class="lineno"> 1071</span>&#160;</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;        std::unique_ptr&lt;TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</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="l01074"></a><span class="lineno"> 1074</span>&#160;        <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;        {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;            <span class="comment">// Add Output Workload to the post-optimisation network structure</span></div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;            AddWorkloadStructure(timelineUtils, outputWorkload, layer);</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;            timelineUtils-&gt;Commit();</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;        }</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;        m_OutputQueue.push_back(move(outputWorkload));</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="keywordtype">void</span> LoadedNetwork::AllocateWorkingMemory(std::lock_guard&lt;std::mutex&gt;&amp; lock)</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;    <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="l01088"></a><span class="lineno"> 1088</span>&#160;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</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="l01090"></a><span class="lineno"> 1090</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a44affeeb090c3c6a3062830562672e84">IgnoreUnused</a>(lock);</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;    <span class="keywordflow">if</span> (m_IsWorkingMemAllocated)</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;    {</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;    }</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;    <span class="keywordflow">if</span> (m_ExternalMemoryManager)</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;    {</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;        m_ExternalMemoryManager-&gt;Allocate();</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;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; m_TensorMemory.size(); ++i)</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;        {</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;            m_Tensorhandles[i]-&gt;Import(m_TensorMemory[i].first-&gt;m_Data, m_TensorMemory[i].second);</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;        }</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;    }</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; memoryManager : m_BackendMemoryMangers)</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;        <span class="keywordflow">if</span> (memoryManager)</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;        {</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;            memoryManager-&gt;Acquire();</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;        }</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;    }</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;    m_TensorHandleFactoryRegistry.AquireMemory();</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;    m_IsWorkingMemAllocated = <span class="keyword">true</span>;</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;}</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"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#aaf8558a23ae9be6e7ea165989f1fa808"> 1118</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="l01119"></a><span class="lineno"> 1119</span>&#160;{</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160;    std::lock_guard&lt;std::mutex&gt; lockGuard(m_WorkingMemMutex);</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;    <span class="keywordflow">if</span> (!m_IsWorkingMemAllocated)</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;    {</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;    }</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;    <span class="keywordflow">if</span> (m_ExternalMemoryManager)</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;    {</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;        m_ExternalMemoryManager-&gt;Deallocate();</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;    }</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;    <span class="comment">// Informs the memory managers to release memory in its respective memory group</span></div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; memoryManager : m_BackendMemoryMangers)</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;    {</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;        <span class="keywordflow">if</span> (memoryManager)</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;        {</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160;            memoryManager-&gt;Release();</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;    m_TensorHandleFactoryRegistry.ReleaseMemory();</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;    m_IsWorkingMemAllocated = <span class="keyword">false</span>;</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;}</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a95b1c23f6f296a0c39383bef20fdd46a">LoadedNetwork::Execute</a>(std::unique_ptr&lt;TimelineUtilityMethods&gt;&amp; timelineUtils,</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;                            profiling::ProfilingGuid inferenceGuid)</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;    <span class="keywordtype">bool</span> success = <span class="keyword">true</span>;</div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</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="l01150"></a><span class="lineno"> 1150</span>&#160;    {</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</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="l01152"></a><span class="lineno"> 1152</span>&#160;        success = <span class="keyword">false</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;</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;    {</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;        std::lock_guard&lt;std::mutex&gt; lockGuard(m_WorkingMemMutex);</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;        AllocateWorkingMemory(lockGuard);</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;        ProfilingDynamicGuid workloadInferenceID(0);</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</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="l01162"></a><span class="lineno"> 1162</span>&#160;        {</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; workload : queue)</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="keywordflow">if</span>(timelineUtils)</div><div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;                {</div><div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;                    workloadInferenceID = timelineUtils-&gt;RecordWorkloadInferenceAndStartOfLifeEvent(workload-&gt;GetGuid(),</div><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;                                                                                                    inferenceGuid);</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;                workload-&gt;Execute();</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;                <span class="keywordflow">if</span>(timelineUtils)</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;                {</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;                    timelineUtils-&gt;RecordEndOfLifeEvent(workloadInferenceID);</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;                }</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160;            }</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;        };</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;        ExecuteQueue(m_InputQueue);</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160;        ExecuteQueue(m_WorkloadQueue);</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160;        ExecuteQueue(m_OutputQueue);</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="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="l01183"></a><span class="lineno"> 1183</span>&#160;    {</div><div class="line"><a name="l01184"></a><span class="lineno"> 1184</span>&#160;        Fail(error);</div><div class="line"><a name="l01185"></a><span class="lineno"> 1185</span>&#160;    }</div><div class="line"><a name="l01186"></a><span class="lineno"> 1186</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</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;        Fail(error);</div><div class="line"><a name="l01189"></a><span class="lineno"> 1189</span>&#160;    }</div><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;</div><div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;    <span class="keywordflow">return</span> success;</div><div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;}</div><div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;</div><div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::EnqueueInput(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_const_tensor.xhtml">ConstTensor</a>&amp; inputTensor, <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle)</div><div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;{</div><div class="line"><a name="l01196"></a><span class="lineno"> 1196</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="l01197"></a><span class="lineno"> 1197</span>&#160;    {</div><div class="line"><a name="l01198"></a><span class="lineno"> 1198</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="l01199"></a><span class="lineno"> 1199</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="l01200"></a><span class="lineno"> 1200</span>&#160;        {</div><div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l01202"></a><span class="lineno"> 1202</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="l01203"></a><span class="lineno"> 1203</span>&#160;                                                                   inputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l01204"></a><span class="lineno"> 1204</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="l01205"></a><span class="lineno"> 1205</span>&#160;</div><div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160;            <span class="keywordflow">if</span> (inputTensorHandle-&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="l01207"></a><span class="lineno"> 1207</span>&#160;            {</div><div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;                tensorHandle-&gt;Unmap();</div><div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;                <span class="keywordflow">return</span>;</div><div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;            }</div><div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;            tensorHandle-&gt;Unmap();</div><div class="line"><a name="l01212"></a><span class="lineno"> 1212</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="l01213"></a><span class="lineno"> 1213</span>&#160;        }</div><div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;        <span class="keywordflow">else</span></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;            <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="l01217"></a><span class="lineno"> 1217</span>&#160;        }</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160;    {</div><div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;        std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l01222"></a><span class="lineno"> 1222</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="l01223"></a><span class="lineno"> 1223</span>&#160;</div><div class="line"><a name="l01224"></a><span class="lineno"> 1224</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="l01225"></a><span class="lineno"> 1225</span>&#160;        {</div><div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;            memcpy(dst, src, size);</div><div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;        };</div><div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;</div><div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        <a class="code" href="namespacearmnn.xhtml#a92c91193007aa49f4732d6dba5397f8d">CopyTensorContentsGeneric</a>(tensorHandle.get(), inputTensorHandle, copyFunc);</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;</div><div class="line"><a name="l01233"></a><span class="lineno"> 1233</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="l01234"></a><span class="lineno"> 1234</span>&#160;<span class="comment">// a) The imported pointer is aligned sufficiently</span></div><div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;<span class="comment">// b) The tensor has zero padding</span></div><div class="line"><a name="l01236"></a><span class="lineno"> 1236</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="l01237"></a><span class="lineno"> 1237</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="l01238"></a><span class="lineno"> 1238</span>&#160;<span class="comment">// e) m_IsExportEnabled must be set to true</span></div><div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::ImportOutputTensor(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor.xhtml">Tensor</a>&amp; outputTensor, <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* outputTensorHandle)</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;    <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(outputTensorHandle != <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Data should have been allocated.&quot;</span>);</div><div class="line"><a name="l01242"></a><span class="lineno"> 1242</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="l01243"></a><span class="lineno"> 1243</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="l01244"></a><span class="lineno"> 1244</span>&#160;    {</div><div class="line"><a name="l01245"></a><span class="lineno"> 1245</span>&#160;        std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l01246"></a><span class="lineno"> 1246</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="l01247"></a><span class="lineno"> 1247</span>&#160;                                                          outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</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"> 1249</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="l01250"></a><span class="lineno"> 1250</span>&#160;        <span class="keywordtype">bool</span> importOk = outputTensorHandle-&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="l01251"></a><span class="lineno"> 1251</span>&#160;        tensorHandle-&gt;Unmap();</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;        <span class="keywordflow">if</span> (!importOk)</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;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;ImportOutputTensor: Memory Export failed&quot;</span>);</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="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;    {</div><div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;        <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_export_exception.xhtml">MemoryExportException</a>(<span class="stringliteral">&quot;ImportOutputTensor: Memory Export failed, attempting to export Input Layer&quot;</span>);</div><div class="line"><a name="l01261"></a><span class="lineno"> 1261</span>&#160;    }</div><div class="line"><a name="l01262"></a><span class="lineno"> 1262</span>&#160;</div><div class="line"><a name="l01263"></a><span class="lineno"> 1263</span>&#160;}</div><div class="line"><a name="l01264"></a><span class="lineno"> 1264</span>&#160;</div><div class="line"><a name="l01265"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a5acae80f1d8fd03cdb3878bd356683d7"> 1265</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn.xhtml#a5acae80f1d8fd03cdb3878bd356683d7">CopyToOutputTensor</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor.xhtml">Tensor</a>&amp; outputTensor, <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* outputTensorHandle)</div><div class="line"><a name="l01266"></a><span class="lineno"> 1266</span>&#160;{</div><div class="line"><a name="l01267"></a><span class="lineno"> 1267</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="l01268"></a><span class="lineno"> 1268</span>&#160;    {</div><div class="line"><a name="l01269"></a><span class="lineno"> 1269</span>&#160;        memcpy(dst, src, size);</div><div class="line"><a name="l01270"></a><span class="lineno"> 1270</span>&#160;    };</div><div class="line"><a name="l01271"></a><span class="lineno"> 1271</span>&#160;</div><div class="line"><a name="l01272"></a><span class="lineno"> 1272</span>&#160;    std::unique_ptr&lt;ITensorHandle&gt; tensorHandle =</div><div class="line"><a name="l01273"></a><span class="lineno"> 1273</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="l01274"></a><span class="lineno"> 1274</span>&#160;                                                      outputTensor.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;</div><div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160;    <a class="code" href="namespacearmnn.xhtml#a92c91193007aa49f4732d6dba5397f8d">CopyTensorContentsGeneric</a>(outputTensorHandle, tensorHandle.get(), copyFunc);</div><div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;}</div><div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160;</div><div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;</div><div class="line"><a name="l01280"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#a9ef4b4b6c421b5fd4b62274e63d08f11"> 1280</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="l01281"></a><span class="lineno"> 1281</span>&#160;{</div><div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> inputTensorPair : inputTensors)</div><div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    {</div><div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;        <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span> = inputTensorPair.first;</div><div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> == layerId)</div><div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160;        {</div><div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;            <span class="keywordflow">return</span> inputTensorPair.second;</div><div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160;        }</div><div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    }</div><div class="line"><a name="l01290"></a><span class="lineno"> 1290</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="l01291"></a><span class="lineno"> 1291</span>&#160;}</div><div class="line"><a name="l01292"></a><span class="lineno"> 1292</span>&#160;</div><div class="line"><a name="l01293"></a><span class="lineno"><a class="line" href="namespacearmnn.xhtml#ac624e40d8096e61c73b246934f18afd0"> 1293</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="l01294"></a><span class="lineno"> 1294</span>&#160;{</div><div class="line"><a name="l01295"></a><span class="lineno"> 1295</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> outputTensorPair : outputTensors)</div><div class="line"><a name="l01296"></a><span class="lineno"> 1296</span>&#160;    {</div><div class="line"><a name="l01297"></a><span class="lineno"> 1297</span>&#160;        <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> <span class="keywordtype">id</span> = outputTensorPair.first;</div><div class="line"><a name="l01298"></a><span class="lineno"> 1298</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> == layerId)</div><div class="line"><a name="l01299"></a><span class="lineno"> 1299</span>&#160;        {</div><div class="line"><a name="l01300"></a><span class="lineno"> 1300</span>&#160;            <span class="keywordflow">return</span> outputTensorPair.second;</div><div class="line"><a name="l01301"></a><span class="lineno"> 1301</span>&#160;        }</div><div class="line"><a name="l01302"></a><span class="lineno"> 1302</span>&#160;    }</div><div class="line"><a name="l01303"></a><span class="lineno"> 1303</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="l01304"></a><span class="lineno"> 1304</span>&#160;}</div><div class="line"><a name="l01305"></a><span class="lineno"> 1305</span>&#160;</div><div class="line"><a name="l01306"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a704bd570f39deda992bccdc639640dc7"> 1306</a></span>&#160;std::vector&lt;ImportedInputId&gt; <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a704bd570f39deda992bccdc639640dc7">LoadedNetwork::ImportInputs</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#aa01bce88f89975a5a031db4cc8861527">InputTensors</a>&amp; inputTensors,</div><div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;                                                         <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a> forceImportMemorySource)</div><div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;{</div><div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;    <span class="keywordflow">if</span> (!m_NetworkProperties.m_AsyncEnabled)</div><div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;    {</div><div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;        <span class="comment">// Cannot import if import is not enabled and forceImportMemorySource is undefined</span></div><div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;        <span class="keywordflow">if</span> (forceImportMemorySource == <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>)</div><div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;        {</div><div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportInputs: Memory Import failed, NetworkProperties.m_ImportEnabled&quot;</span>);</div><div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;        }</div><div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160;        <span class="keywordflow">if</span> (inputTensors.size() != m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().GetNumInputs())</div><div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;        {</div><div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportInputs: Force Import failed, incorrect number of tensors&quot;</span>);</div><div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;        }</div><div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;</div><div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;        std::vector&lt;ImportedInputId&gt; importedInputs;</div><div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;        <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputIndex = 0;</div><div class="line"><a name="l01324"></a><span class="lineno"> 1324</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="l01325"></a><span class="lineno"> 1325</span>&#160;        {</div><div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;            <span class="keyword">auto</span> outputTensorHandle = m_PreImportedInputHandles[inputIndex].m_TensorHandle.get();</div><div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;</div><div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;            <span class="keywordflow">if</span> (!outputTensorHandle)</div><div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;            {</div><div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;                inputIndex++;</div><div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;            }</div><div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;</div><div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;            <span class="keyword">auto</span> layerBindingId = inputLayer-&gt;GetBindingId();</div><div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160;            <span class="keyword">auto</span> it = std::find_if(inputTensors.begin(), inputTensors.end(), [=](<span class="keyword">const</span> <span class="keyword">auto</span>&amp; inputTensor)</div><div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;            {</div><div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;                <span class="keywordflow">return</span> inputTensor.first == layerBindingId;</div><div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;            });</div><div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;</div><div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160;            <span class="keywordflow">if</span> (it == inputTensors.end())</div><div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;            {</div><div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;                inputIndex++;</div><div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;            }</div><div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;</div><div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span>&amp; inputTensor = *it;</div><div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; passThroughTensorHandle =</div><div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;                    std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(),</div><div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;                                                                   inputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160;</div><div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;            <span class="keywordflow">if</span> (outputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a6caeedd55f4d685fd04b8fcb352dae4e">CanBeImported</a>(passThroughTensorHandle-&gt;Map(), forceImportMemorySource)</div><div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;                &amp;&amp; (outputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(passThroughTensorHandle-&gt;Map(), forceImportMemorySource)))</div><div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;            {</div><div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;                importedInputs.push_back(inputIndex);</div><div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;            }</div><div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160;            passThroughTensorHandle-&gt;Unmap();</div><div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;</div><div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160;            inputIndex++;</div><div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;        }</div><div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;</div><div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;        <span class="keywordflow">return</span> importedInputs;</div><div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160;    }</div><div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;    {</div><div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;        <span class="comment">// Import when the import of network properties is enabled</span></div><div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;        std::vector&lt;ImportedInputId&gt; importedInputs;</div><div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;        <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;</div><div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> inputTensor : inputTensors)</div><div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;        {</div><div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160;            <span class="keyword">auto</span> layerBindingId = inputTensor.first;</div><div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;            <span class="keyword">auto</span> it = std::find_if(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">GetInputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_input_layers_accessor.xhtml#af6f3e2b0ee65cd102e20c9f734160b90">begin</a>(), graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">GetInputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_input_layers_accessor.xhtml#a39ebf520b6f30ab8776bdcb99ee38b93">end</a>(), [=](<span class="keyword">auto</span>* layer)</div><div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;            {</div><div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;                <span class="keywordflow">return</span> layer-&gt;<a class="code" href="classarmnn_1_1_bindable_layer.xhtml#a7352bd7421ce8b5e86281b995848ed82">GetBindingId</a>() == layerBindingId;</div><div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;            });</div><div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;</div><div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;            <span class="keywordflow">if</span> (it == graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a919fb58873ef3a6549e4490e226f2eae">GetInputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_input_layers_accessor.xhtml#a39ebf520b6f30ab8776bdcb99ee38b93">end</a>())</div><div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;            {</div><div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(fmt::format(</div><div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;                    <span class="stringliteral">&quot;ImportInputs: Memory Import failed, unknown LayerBindingId: {}&quot;</span>, layerBindingId));</div><div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;            }</div><div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;</div><div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* layer = *it;</div><div class="line"><a name="l01384"></a><span class="lineno"> 1384</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#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;            {</div><div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;ImportInputs: given layer not an InputLayer&quot;</span>);</div><div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160;            }</div><div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;</div><div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;            <span class="keyword">auto</span>&amp; backend = m_Backends.at(layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>());</div><div class="line"><a name="l01390"></a><span class="lineno"> 1390</span>&#160;            <span class="keywordflow">if</span> (!<a class="code" href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">HasCapability</a>(<a class="code" href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">BackendOptions::BackendOption</a>{<span class="stringliteral">&quot;PreImportIOTensors&quot;</span>, <span class="keyword">true</span>}, backend-&gt;GetCapabilities()))</div><div class="line"><a name="l01391"></a><span class="lineno"> 1391</span>&#160;            {</div><div class="line"><a name="l01392"></a><span class="lineno"> 1392</span>&#160;                std::string er = backend-&gt;GetId();</div><div class="line"><a name="l01393"></a><span class="lineno"> 1393</span>&#160;                er += <span class="stringliteral">&quot; does not have PreImportIOTensors capability&quot;</span>;</div><div class="line"><a name="l01394"></a><span class="lineno"> 1394</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_backend_capability_exception.xhtml">BackendCapabilityException</a>(er);</div><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;            }</div><div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;</div><div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_output_slot.xhtml">OutputSlot</a>&amp; outputSlot = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>()[0];</div><div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;</div><div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = outputSlot.<a class="code" href="classarmnn_1_1_output_slot.xhtml#af303cf872a3f95e29992e45224e4cf8e">GetTensorHandleFactoryId</a>();</div><div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo = outputSlot.<a class="code" href="classarmnn_1_1_output_slot.xhtml#ada2ad7d1caeeb4ef6195c8925fad6a65">GetTensorInfo</a>();</div><div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;</div><div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a>* handleFactory = m_TensorHandleFactoryRegistry.GetFactory(factoryId);</div><div class="line"><a name="l01403"></a><span class="lineno"> 1403</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(handleFactory);</div><div class="line"><a name="l01404"></a><span class="lineno"> 1404</span>&#160;</div><div class="line"><a name="l01405"></a><span class="lineno"> 1405</span>&#160;            ImportedTensorHandlePin importedTensorHandlePin{layerBindingId,</div><div class="line"><a name="l01406"></a><span class="lineno"> 1406</span>&#160;                                                            handleFactory-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">CreateTensorHandle</a>(tensorInfo, <span class="keyword">false</span>)};</div><div class="line"><a name="l01407"></a><span class="lineno"> 1407</span>&#160;</div><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = importedTensorHandlePin.m_TensorHandle.get();</div><div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;</div><div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160;            <span class="keywordflow">if</span> (!<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">GetImportFlags</a>(), m_NetworkProperties.m_InputSource))</div><div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;            {</div><div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(</div><div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;                    fmt::format(<span class="stringliteral">&quot;ImportInputs: Memory Import failed, backend: &quot;</span></div><div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;                                <span class="stringliteral">&quot;{} does not support importing from source {}&quot;</span></div><div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160;                                , factoryId, m_NetworkProperties.m_InputSource));</div><div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;            }</div><div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;</div><div class="line"><a name="l01418"></a><span class="lineno"> 1418</span>&#160;            std::unique_ptr&lt;ITensorHandle&gt; passThroughTensorHandle =</div><div class="line"><a name="l01419"></a><span class="lineno"> 1419</span>&#160;                    std::make_unique&lt;ConstPassthroughTensorHandle&gt;(inputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#a8aeddebdcf02e1832b22203c08a6b678">GetInfo</a>(),</div><div class="line"><a name="l01420"></a><span class="lineno"> 1420</span>&#160;                                                                   inputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>());</div><div class="line"><a name="l01421"></a><span class="lineno"> 1421</span>&#160;</div><div class="line"><a name="l01422"></a><span class="lineno"> 1422</span>&#160;            <span class="keywordflow">if</span> (tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(passThroughTensorHandle-&gt;Map(), m_NetworkProperties.m_InputSource))</div><div class="line"><a name="l01423"></a><span class="lineno"> 1423</span>&#160;            {</div><div class="line"><a name="l01424"></a><span class="lineno"> 1424</span>&#160;                importedInputs.push_back(m_CurImportedInputId++);</div><div class="line"><a name="l01425"></a><span class="lineno"> 1425</span>&#160;                passThroughTensorHandle-&gt;Unmap();</div><div class="line"><a name="l01426"></a><span class="lineno"> 1426</span>&#160;            }</div><div class="line"><a name="l01427"></a><span class="lineno"> 1427</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l01428"></a><span class="lineno"> 1428</span>&#160;            {</div><div class="line"><a name="l01429"></a><span class="lineno"> 1429</span>&#160;                passThroughTensorHandle-&gt;Unmap();</div><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;                <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportInputs: Memory Import failed&quot;</span>);</div><div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;            }</div><div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;</div><div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;            m_PreImportedInputHandles.push_back(std::move(importedTensorHandlePin));</div><div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;        }</div><div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160;        <span class="keywordflow">return</span> importedInputs;</div><div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    }</div><div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;}</div><div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;</div><div class="line"><a name="l01439"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#ac88d932e6e015a59551322b25796b11a"> 1439</a></span>&#160;std::vector&lt;ImportedOutputId&gt; <a class="code" href="classarmnn_1_1_loaded_network.xhtml#ac88d932e6e015a59551322b25796b11a">LoadedNetwork::ImportOutputs</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors,</div><div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;                                                           <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a> forceImportMemorySource)</div><div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160;{</div><div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;    <span class="keywordflow">if</span> (!m_NetworkProperties.m_AsyncEnabled)</div><div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;    {</div><div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;        <span class="comment">// Cannot import if import is not enabled and forceImportMemorySource is undefined</span></div><div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;        <span class="keywordflow">if</span> (forceImportMemorySource == <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>)</div><div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;        {</div><div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportOutputs: Memory Import failed, NetworkProperties.m_ImportEnabled&quot;</span>);</div><div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160;        }</div><div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;        <span class="comment">// If forceImportMemorySource is defined, try import if memory is aligned</span></div><div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;        <span class="keywordflow">if</span> (outputTensors.size() != m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().GetNumOutputs())</div><div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;        {</div><div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportOutputs: Force Import failed, incorrect number of tensors&quot;</span>);</div><div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;        }</div><div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;        std::vector&lt;ImportedInputId&gt; importedOutputs;</div><div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;        <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;</div><div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputIndex = 0;</div><div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>* <span class="keyword">const</span> outputLayer : graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>())</div><div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;        {</div><div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;            <span class="keyword">auto</span> inputTensorHandle = m_PreImportedOutputHandles[outputIndex].m_TensorHandle.get();</div><div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;</div><div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;            <span class="keywordflow">if</span> (!inputTensorHandle)</div><div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160;            {</div><div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;                outputIndex++;</div><div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;            }</div><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;</div><div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;            <span class="keyword">auto</span> layerBindingId = outputLayer-&gt;GetBindingId();</div><div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;            <span class="keyword">auto</span> it = std::find_if(outputTensors.begin(), outputTensors.end(), [=] (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; outputTensor)</div><div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;            {</div><div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;                <span class="keywordflow">return</span> outputTensor.first == layerBindingId;</div><div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;            });</div><div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;</div><div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;            <span class="keywordflow">if</span> (it == outputTensors.end())</div><div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160;            {</div><div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;                outputIndex++;</div><div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160;            }</div><div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;</div><div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span> outputTensor = *it;</div><div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;            <span class="comment">// Check if the output memory can be imported</span></div><div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;            <span class="keywordflow">if</span> (inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a6caeedd55f4d685fd04b8fcb352dae4e">CanBeImported</a>(outputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>(), forceImportMemorySource)</div><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;                &amp;&amp; inputTensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(outputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>(), forceImportMemorySource))</div><div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;            {</div><div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;                importedOutputs.push_back(outputIndex);</div><div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;            }</div><div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160;            outputIndex++;</div><div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;        }</div><div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;        <span class="keywordflow">return</span> importedOutputs;</div><div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;    }</div><div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;</div><div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;    std::vector&lt;ImportedOutputId&gt; importedOutputs;</div><div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;    <a class="code" href="classarmnn_1_1_graph.xhtml">Graph</a>&amp; graph = m_OptimizedNetwork-&gt;pOptimizedNetworkImpl-&gt;GetGraph().<a class="code" href="classarmnn_1_1_graph.xhtml#a9a7209345edfdb2b066b0ceb66414d7c">TopologicalSort</a>();</div><div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;</div><div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; outputTensor : outputTensors)</div><div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    {</div><div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;        <span class="keyword">auto</span> layerBindingId = outputTensor.first;</div><div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;        <span class="keyword">auto</span> it = std::find_if(graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_output_layers_accessor.xhtml#a660efe3cd8761bd55b70ae83a7ea4334">begin</a>(), graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_output_layers_accessor.xhtml#ad2a661f37e89422e29dc70b3e4cc7185">end</a>(), [=](<span class="keyword">auto</span>* layer)</div><div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;        {</div><div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;            <span class="keywordflow">return</span> layer-&gt;<a class="code" href="classarmnn_1_1_bindable_layer.xhtml#a7352bd7421ce8b5e86281b995848ed82">GetBindingId</a>() == layerBindingId;</div><div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;        });</div><div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;</div><div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;        <span class="keywordflow">if</span> (it == graph.<a class="code" href="classarmnn_1_1_graph.xhtml#aa311c7fe7e05406c9ff4e4ed3ba09825">GetOutputLayers</a>().<a class="code" href="structarmnn_1_1_graph_1_1_output_layers_accessor.xhtml#ad2a661f37e89422e29dc70b3e4cc7185">end</a>())</div><div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;        {</div><div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(fmt::format(<span class="stringliteral">&quot;ImportOutputs: Memory Import failed, unknown LayerBindingId: {}&quot;</span>,</div><div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;                                                     layerBindingId));</div><div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;        }</div><div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;</div><div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>* layer = *it;</div><div class="line"><a name="l01510"></a><span class="lineno"> 1510</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#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>)</div><div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;        {</div><div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;ImportOutputs: given layer not an OutputLayer&quot;</span>);</div><div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;        }</div><div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;</div><div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;        <span class="keyword">auto</span>&amp; backend = m_Backends.at(layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>());</div><div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">HasCapability</a>(<a class="code" href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">BackendOptions::BackendOption</a>{<span class="stringliteral">&quot;PreImportIOTensors&quot;</span>, <span class="keyword">true</span>}, backend-&gt;GetCapabilities()))</div><div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;        {</div><div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;            std::string er = backend-&gt;GetId();</div><div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;            er += <span class="stringliteral">&quot; does not have PreImportIOTensors capability&quot;</span>;</div><div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_backend_capability_exception.xhtml">BackendCapabilityException</a>(er);</div><div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;        }</div><div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;</div><div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_input_slot.xhtml">InputSlot</a>&amp; inputSlot = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>()[0];</div><div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a32f4aa6a7089d877af08928139c2c277">ITensorHandleFactory::FactoryId</a> factoryId = inputSlot.<a class="code" href="classarmnn_1_1_input_slot.xhtml#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>()-&gt;<a class="code" href="classarmnn_1_1_output_slot.xhtml#af303cf872a3f95e29992e45224e4cf8e">GetTensorHandleFactoryId</a>();</div><div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>&amp; tensorInfo = inputSlot.<a class="code" href="classarmnn_1_1_input_slot.xhtml#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>()-&gt;<a class="code" href="classarmnn_1_1_output_slot.xhtml#ada2ad7d1caeeb4ef6195c8925fad6a65">GetTensorInfo</a>();</div><div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;</div><div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a>* handleFactory = m_TensorHandleFactoryRegistry.GetFactory(factoryId);</div><div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;        <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(handleFactory);</div><div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;</div><div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;        ImportedTensorHandlePin importedTensorHandlePin{layerBindingId,</div><div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;                                                        handleFactory-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml#a375f11dd42ff042435e8771cf287b20c">CreateTensorHandle</a>(tensorInfo, <span class="keyword">false</span>)};</div><div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;</div><div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = importedTensorHandlePin.m_TensorHandle.get();</div><div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;</div><div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;        <span class="keywordflow">if</span> (!<a class="code" href="namespacearmnn.xhtml#a84f86b4de5adf0b164e811c87051a0ee">CheckFlag</a>(tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a55cddc2dbb32d680cd85b635ba370e48">GetImportFlags</a>(), m_NetworkProperties.m_OutputSource))</div><div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;        {</div><div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(fmt::format(<span class="stringliteral">&quot;ImportInputs: Memory Import failed, backend: &quot;</span></div><div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;                                                    <span class="stringliteral">&quot;{} does not support importing from source {}&quot;</span></div><div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;                                                    , factoryId, m_NetworkProperties.m_OutputSource));</div><div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;        }</div><div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;</div><div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160;        <span class="keywordflow">if</span> (tensorHandle-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a4f81a9eff30c9b9fe76f5b83af470ba7">Import</a>(outputTensor.second.<a class="code" href="classarmnn_1_1_base_tensor.xhtml#aa81f67ac64f0c249e26499600c45d996">GetMemoryArea</a>(), m_NetworkProperties.m_OutputSource))</div><div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;        {</div><div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;            importedOutputs.push_back(m_CurImportedOutputId++);</div><div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;        }</div><div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;        {</div><div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_memory_import_exception.xhtml">MemoryImportException</a>(<span class="stringliteral">&quot;ImportInputs: Memory Import failed&quot;</span>);</div><div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;        }</div><div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160;</div><div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;        m_PreImportedOutputHandles.push_back(std::move(importedTensorHandlePin));</div><div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;    }</div><div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;</div><div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;    <span class="keywordflow">return</span> importedOutputs;</div><div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;}</div><div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;</div><div class="line"><a name="l01557"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#aa792fd8b43401e3d6665110cdb0af27b"> 1557</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#aa792fd8b43401e3d6665110cdb0af27b">LoadedNetwork::ClearImportedInputs</a>(<span class="keyword">const</span> std::vector&lt;ImportedInputId&gt; inputIds)</div><div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160;{</div><div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keywordtype">id</span> : inputIds)</div><div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160;    {</div><div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> &gt; m_PreImportedInputHandles.size())</div><div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;        {</div><div class="line"><a name="l01563"></a><span class="lineno"> 1563</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;ClearImportedInputs::Unknown ImportedInputId: {}&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;        }</div><div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;</div><div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;        <span class="keyword">auto</span>&amp; importedTensorHandle = m_PreImportedInputHandles[id].m_TensorHandle;</div><div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;        <span class="keywordflow">if</span> (!importedTensorHandle)</div><div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;        {</div><div class="line"><a name="l01569"></a><span class="lineno"> 1569</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="l01570"></a><span class="lineno"> 1570</span>&#160;                    fmt::format(<span class="stringliteral">&quot;ClearImportedInputs::ImportedInput with id: {} has already been deleted&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;        }</div><div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;        <span class="comment">// Call Unimport then destroy the tensorHandle</span></div><div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;        importedTensorHandle-&gt;Unimport();</div><div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;        importedTensorHandle = {};</div><div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;    }</div><div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160;}</div><div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;</div><div class="line"><a name="l01578"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#af06f742ce80985a8fbbbc028c20259b1"> 1578</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#af06f742ce80985a8fbbbc028c20259b1">LoadedNetwork::ClearImportedOutputs</a>(<span class="keyword">const</span> std::vector&lt;ImportedOutputId&gt; outputIds)</div><div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;{</div><div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> <span class="keywordtype">id</span> : outputIds)</div><div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;    {</div><div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;        <span class="keywordflow">if</span> (<span class="keywordtype">id</span> &gt; m_PreImportedOutputHandles.size())</div><div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;        {</div><div class="line"><a name="l01584"></a><span class="lineno"> 1584</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;ClearImportedOutputs::Unknown ImportedOutputId: {}&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;        }</div><div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;</div><div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160;       <span class="keyword">auto</span>&amp; importedTensorHandle = m_PreImportedOutputHandles[id].m_TensorHandle;</div><div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;       <span class="keywordflow">if</span> (!importedTensorHandle)</div><div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;       {</div><div class="line"><a name="l01590"></a><span class="lineno"> 1590</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="l01591"></a><span class="lineno"> 1591</span>&#160;                   fmt::format(<span class="stringliteral">&quot;ClearImportedOutputs::ImportedOutput with id: {} has already been deleted&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;       }</div><div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;       <span class="comment">// Call Unimport then destroy the tensorHandle</span></div><div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160;       importedTensorHandle-&gt;Unimport();</div><div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;       importedTensorHandle = {};</div><div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;    }</div><div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;}</div><div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;</div><div class="line"><a name="l01599"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a95b1c23f6f296a0c39383bef20fdd46a"> 1599</a></span>&#160;<a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70b">Status</a> <a class="code" href="classarmnn_1_1_loaded_network.xhtml#a95b1c23f6f296a0c39383bef20fdd46a">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="l01600"></a><span class="lineno"> 1600</span>&#160;                              <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a8f091a512915d1cb29a4ebf13dfc53ea">OutputTensors</a>&amp; outputTensors,</div><div class="line"><a name="l01601"></a><span class="lineno"> 1601</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="l01602"></a><span class="lineno"> 1602</span>&#160;                              std::vector&lt;ImportedInputId&gt; preImportedInputs,</div><div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160;                              std::vector&lt;ImportedOutputId&gt; preImportedOutputs)</div><div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;{</div><div class="line"><a name="l01605"></a><span class="lineno"> 1605</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="l01606"></a><span class="lineno"> 1606</span>&#160;</div><div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    <span class="keywordflow">if</span> (inputTensors.size() + preImportedInputs.size() != graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a8d8179a4a0703602a5d7dbb6e92eaf69">GetNumInputs</a>())</div><div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;    {</div><div class="line"><a name="l01609"></a><span class="lineno"> 1609</span>&#160;        <span class="keywordflow">if</span> (preImportedInputs.empty())</div><div class="line"><a name="l01610"></a><span class="lineno"> 1610</span>&#160;        {</div><div class="line"><a name="l01611"></a><span class="lineno"> 1611</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;LoadedNetwork::Execute: Number of inputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l01612"></a><span class="lineno"> 1612</span>&#160;        }</div><div class="line"><a name="l01613"></a><span class="lineno"> 1613</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01614"></a><span class="lineno"> 1614</span>&#160;        {</div><div class="line"><a name="l01615"></a><span class="lineno"> 1615</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;LoadedNetwork::Execute: &quot;</span></div><div class="line"><a name="l01616"></a><span class="lineno"> 1616</span>&#160;                                           <span class="stringliteral">&quot;Number of inputs + preImportedInputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l01617"></a><span class="lineno"> 1617</span>&#160;        }</div><div class="line"><a name="l01618"></a><span class="lineno"> 1618</span>&#160;    }</div><div class="line"><a name="l01619"></a><span class="lineno"> 1619</span>&#160;</div><div class="line"><a name="l01620"></a><span class="lineno"> 1620</span>&#160;    <span class="keywordflow">if</span> (outputTensors.size() + preImportedOutputs.size() != graph.<a class="code" href="classarmnn_1_1_graph.xhtml#a604654b453ec291a503d62a0beb849d3">GetNumOutputs</a>())</div><div class="line"><a name="l01621"></a><span class="lineno"> 1621</span>&#160;    {</div><div class="line"><a name="l01622"></a><span class="lineno"> 1622</span>&#160;        <span class="keywordflow">if</span> (preImportedOutputs.empty())</div><div class="line"><a name="l01623"></a><span class="lineno"> 1623</span>&#160;        {</div><div class="line"><a name="l01624"></a><span class="lineno"> 1624</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;LoadedNetwork::Execute: &quot;</span></div><div class="line"><a name="l01625"></a><span class="lineno"> 1625</span>&#160;                                           <span class="stringliteral">&quot;Number of outputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l01626"></a><span class="lineno"> 1626</span>&#160;        }</div><div class="line"><a name="l01627"></a><span class="lineno"> 1627</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01628"></a><span class="lineno"> 1628</span>&#160;        {</div><div class="line"><a name="l01629"></a><span class="lineno"> 1629</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn_1_1_invalid_argument_exception.xhtml">InvalidArgumentException</a>(<span class="stringliteral">&quot;LoadedNetwork::Execute: &quot;</span></div><div class="line"><a name="l01630"></a><span class="lineno"> 1630</span>&#160;                                           <span class="stringliteral">&quot;Number of outputs + preImportedOutputs provided does not match network.&quot;</span>);</div><div class="line"><a name="l01631"></a><span class="lineno"> 1631</span>&#160;        }</div><div class="line"><a name="l01632"></a><span class="lineno"> 1632</span>&#160;    }</div><div class="line"><a name="l01633"></a><span class="lineno"> 1633</span>&#160;</div><div class="line"><a name="l01634"></a><span class="lineno"> 1634</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="l01635"></a><span class="lineno"> 1635</span>&#160;    <span class="comment">// Collect all the given LayerBindingIds and check them for duplicates and unknowns.</span></div><div class="line"><a name="l01636"></a><span class="lineno"> 1636</span>&#160;    std::vector&lt;LayerBindingId&gt;&amp; bindingIds = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#abdfaf46d2e4cd003c0f13cdb1f1e6a20">GetBindingIdVector</a>();</div><div class="line"><a name="l01637"></a><span class="lineno"> 1637</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index = 0;</div><div class="line"><a name="l01638"></a><span class="lineno"> 1638</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> pair : inputTensors)</div><div class="line"><a name="l01639"></a><span class="lineno"> 1639</span>&#160;    {</div><div class="line"><a name="l01640"></a><span class="lineno"> 1640</span>&#160;        bindingIds[index++] = pair.first;</div><div class="line"><a name="l01641"></a><span class="lineno"> 1641</span>&#160;    }</div><div class="line"><a name="l01642"></a><span class="lineno"> 1642</span>&#160;    <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#a1c5ec805688cb558465a82a8d9f56a90">ImportedInputId</a> <span class="keywordtype">id</span> : preImportedInputs)</div><div class="line"><a name="l01643"></a><span class="lineno"> 1643</span>&#160;    {</div><div class="line"><a name="l01644"></a><span class="lineno"> 1644</span>&#160;        bindingIds[index++] = ValidateImportedInputID(<span class="keywordtype">id</span>);</div><div class="line"><a name="l01645"></a><span class="lineno"> 1645</span>&#160;    }</div><div class="line"><a name="l01646"></a><span class="lineno"> 1646</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span> pair : outputTensors)</div><div class="line"><a name="l01647"></a><span class="lineno"> 1647</span>&#160;    {</div><div class="line"><a name="l01648"></a><span class="lineno"> 1648</span>&#160;        bindingIds[index++] = pair.first;</div><div class="line"><a name="l01649"></a><span class="lineno"> 1649</span>&#160;    }</div><div class="line"><a name="l01650"></a><span class="lineno"> 1650</span>&#160;    <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#ac68a434f0e78e33726bfb22a39ec813f">ImportedOutputId</a> <span class="keywordtype">id</span> : preImportedOutputs)</div><div class="line"><a name="l01651"></a><span class="lineno"> 1651</span>&#160;    {</div><div class="line"><a name="l01652"></a><span class="lineno"> 1652</span>&#160;        bindingIds[index++] = ValidateImportedOutputID(<span class="keywordtype">id</span>);</div><div class="line"><a name="l01653"></a><span class="lineno"> 1653</span>&#160;    }</div><div class="line"><a name="l01654"></a><span class="lineno"> 1654</span>&#160;</div><div class="line"><a name="l01655"></a><span class="lineno"> 1655</span>&#160;    workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ab35a0f45d4b1bdad5c8e6614c7bf8d18">ValidateBindingIds</a>();</div><div class="line"><a name="l01656"></a><span class="lineno"> 1656</span>&#160;</div><div class="line"><a name="l01657"></a><span class="lineno"> 1657</span>&#160;    <span class="keyword">auto</span> resetMemHandle = [&amp;]()</div><div class="line"><a name="l01658"></a><span class="lineno"> 1658</span>&#160;    {</div><div class="line"><a name="l01659"></a><span class="lineno"> 1659</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#a1c5ec805688cb558465a82a8d9f56a90">ImportedInputId</a> <span class="keywordtype">id</span>: preImportedInputs)</div><div class="line"><a name="l01660"></a><span class="lineno"> 1660</span>&#160;        {</div><div class="line"><a name="l01661"></a><span class="lineno"> 1661</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerBindingId = m_PreImportedInputHandles[id].m_LayerBindingId;</div><div class="line"><a name="l01662"></a><span class="lineno"> 1662</span>&#160;</div><div class="line"><a name="l01663"></a><span class="lineno"> 1663</span>&#160;            <span class="keyword">auto</span> inputHandle = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ab0ba2e3d5e666b99e28a485d117ddfc3">GetInputHandle</a>(layerBindingId);</div><div class="line"><a name="l01664"></a><span class="lineno"> 1664</span>&#160;            <span class="keyword">auto</span> inputConnections = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ae65834ecb69e3bc6a41ca1a57e4b63ab">GetInputConnections</a>(layerBindingId);</div><div class="line"><a name="l01665"></a><span class="lineno"> 1665</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> it : inputConnections)</div><div class="line"><a name="l01666"></a><span class="lineno"> 1666</span>&#160;            {</div><div class="line"><a name="l01667"></a><span class="lineno"> 1667</span>&#160;                *it = inputHandle;</div><div class="line"><a name="l01668"></a><span class="lineno"> 1668</span>&#160;            }</div><div class="line"><a name="l01669"></a><span class="lineno"> 1669</span>&#160;        }</div><div class="line"><a name="l01670"></a><span class="lineno"> 1670</span>&#160;</div><div class="line"><a name="l01671"></a><span class="lineno"> 1671</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#ac68a434f0e78e33726bfb22a39ec813f">ImportedOutputId</a> <span class="keywordtype">id</span>: preImportedOutputs)</div><div class="line"><a name="l01672"></a><span class="lineno"> 1672</span>&#160;        {</div><div class="line"><a name="l01673"></a><span class="lineno"> 1673</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerBindingId = m_PreImportedOutputHandles[id].m_LayerBindingId;</div><div class="line"><a name="l01674"></a><span class="lineno"> 1674</span>&#160;</div><div class="line"><a name="l01675"></a><span class="lineno"> 1675</span>&#160;            <span class="keyword">auto</span> outputHandle = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ad5e03a241b63b19580f8fdd08c3647b7">GetOutputHandle</a>(layerBindingId);</div><div class="line"><a name="l01676"></a><span class="lineno"> 1676</span>&#160;            <span class="keyword">auto</span> outputConnections = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a39754dbf5b5cb692d3ba97f23b23962f">GetOutputConnection</a>(layerBindingId);</div><div class="line"><a name="l01677"></a><span class="lineno"> 1677</span>&#160;</div><div class="line"><a name="l01678"></a><span class="lineno"> 1678</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> it : outputConnections)</div><div class="line"><a name="l01679"></a><span class="lineno"> 1679</span>&#160;            {</div><div class="line"><a name="l01680"></a><span class="lineno"> 1680</span>&#160;                *it = outputHandle;</div><div class="line"><a name="l01681"></a><span class="lineno"> 1681</span>&#160;            }</div><div class="line"><a name="l01682"></a><span class="lineno"> 1682</span>&#160;        }</div><div class="line"><a name="l01683"></a><span class="lineno"> 1683</span>&#160;    };</div><div class="line"><a name="l01684"></a><span class="lineno"> 1684</span>&#160;</div><div class="line"><a name="l01685"></a><span class="lineno"> 1685</span>&#160;    std::unique_ptr&lt;profiling::TimelineUtilityMethods&gt; timelineUtils =</div><div class="line"><a name="l01686"></a><span class="lineno"> 1686</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="l01687"></a><span class="lineno"> 1687</span>&#160;    profiling::ProfilingGuid inferenceGuid = m_ProfilingService.GetNextGuid();</div><div class="line"><a name="l01688"></a><span class="lineno"> 1688</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01689"></a><span class="lineno"> 1689</span>&#160;    {</div><div class="line"><a name="l01690"></a><span class="lineno"> 1690</span>&#160;        <span class="comment">// Add inference timeline trace if profiling is enabled.</span></div><div class="line"><a name="l01691"></a><span class="lineno"> 1691</span>&#160;        profiling::ProfilingGuid networkGuid = m_OptimizedNetwork-&gt;GetGuid();</div><div class="line"><a name="l01692"></a><span class="lineno"> 1692</span>&#160;        timelineUtils-&gt;CreateTypedEntity(inferenceGuid, profiling::LabelsAndEventClasses::INFERENCE_GUID);</div><div class="line"><a name="l01693"></a><span class="lineno"> 1693</span>&#160;        timelineUtils-&gt;CreateRelationship(<a class="code" href="namespacearmnn_1_1profiling.xhtml#ab805f5aa9f101e7f6d971daba044c3c2afc04d023850b425f3b9c62b3a55dc110">profiling::ProfilingRelationshipType::RetentionLink</a>,</div><div class="line"><a name="l01694"></a><span class="lineno"> 1694</span>&#160;                                          networkGuid,</div><div class="line"><a name="l01695"></a><span class="lineno"> 1695</span>&#160;                                          inferenceGuid,</div><div class="line"><a name="l01696"></a><span class="lineno"> 1696</span>&#160;                                          profiling::LabelsAndEventClasses::EXECUTION_OF_GUID);</div><div class="line"><a name="l01697"></a><span class="lineno"> 1697</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, profiling::LabelsAndEventClasses::ARMNN_PROFILING_SOL_EVENT_CLASS);</div><div class="line"><a name="l01698"></a><span class="lineno"> 1698</span>&#160;    }</div><div class="line"><a name="l01699"></a><span class="lineno"> 1699</span>&#160;</div><div class="line"><a name="l01700"></a><span class="lineno"> 1700</span>&#160;    <span class="keywordtype">bool</span> executionSucceeded = <span class="keyword">true</span>;</div><div class="line"><a name="l01701"></a><span class="lineno"> 1701</span>&#160;</div><div class="line"><a name="l01702"></a><span class="lineno"> 1702</span>&#160;    <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01703"></a><span class="lineno"> 1703</span>&#160;    {</div><div class="line"><a name="l01704"></a><span class="lineno"> 1704</span>&#160;        <span class="comment">// Add end of life of the inference timeline if profiling is enabled.</span></div><div class="line"><a name="l01705"></a><span class="lineno"> 1705</span>&#160;        timelineUtils-&gt;RecordEvent(inferenceGuid, profiling::LabelsAndEventClasses::ARMNN_PROFILING_EOL_EVENT_CLASS);</div><div class="line"><a name="l01706"></a><span class="lineno"> 1706</span>&#160;        timelineUtils-&gt;Commit();</div><div class="line"><a name="l01707"></a><span class="lineno"> 1707</span>&#160;    }</div><div class="line"><a name="l01708"></a><span class="lineno"> 1708</span>&#160;</div><div class="line"><a name="l01709"></a><span class="lineno"> 1709</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="l01710"></a><span class="lineno"> 1710</span>&#160;    {</div><div class="line"><a name="l01711"></a><span class="lineno"> 1711</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="l01712"></a><span class="lineno"> 1712</span>&#160;    }</div><div class="line"><a name="l01713"></a><span class="lineno"> 1713</span>&#160;</div><div class="line"><a name="l01714"></a><span class="lineno"> 1714</span>&#160;    {</div><div class="line"><a name="l01715"></a><span class="lineno"> 1715</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="l01716"></a><span class="lineno"> 1716</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> pair : inputTensors)</div><div class="line"><a name="l01717"></a><span class="lineno"> 1717</span>&#160;        {</div><div class="line"><a name="l01718"></a><span class="lineno"> 1718</span>&#160;            EnqueueInput(pair.second, workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ab0ba2e3d5e666b99e28a485d117ddfc3">GetInputHandle</a>(pair.first));</div><div class="line"><a name="l01719"></a><span class="lineno"> 1719</span>&#160;        }</div><div class="line"><a name="l01720"></a><span class="lineno"> 1720</span>&#160;</div><div class="line"><a name="l01721"></a><span class="lineno"> 1721</span>&#160;        <span class="comment">// Swap in the pre-imported inputs if any</span></div><div class="line"><a name="l01722"></a><span class="lineno"> 1722</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#a1c5ec805688cb558465a82a8d9f56a90">ImportedInputId</a> <span class="keywordtype">id</span> : preImportedInputs)</div><div class="line"><a name="l01723"></a><span class="lineno"> 1723</span>&#160;        {</div><div class="line"><a name="l01724"></a><span class="lineno"> 1724</span>&#160;            <span class="keyword">const</span> ImportedTensorHandlePin&amp; importedInputPin = m_PreImportedInputHandles[id];</div><div class="line"><a name="l01725"></a><span class="lineno"> 1725</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerBindingId = m_PreImportedInputHandles[id].m_LayerBindingId;</div><div class="line"><a name="l01726"></a><span class="lineno"> 1726</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span>&amp; preimportedHandle = importedInputPin.m_TensorHandle;</div><div class="line"><a name="l01727"></a><span class="lineno"> 1727</span>&#160;</div><div class="line"><a name="l01728"></a><span class="lineno"> 1728</span>&#160;            <span class="keyword">auto</span> inputConnections = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ae65834ecb69e3bc6a41ca1a57e4b63ab">GetInputConnections</a>(layerBindingId);</div><div class="line"><a name="l01729"></a><span class="lineno"> 1729</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> it : inputConnections)</div><div class="line"><a name="l01730"></a><span class="lineno"> 1730</span>&#160;            {</div><div class="line"><a name="l01731"></a><span class="lineno"> 1731</span>&#160;                *it = preimportedHandle.get();</div><div class="line"><a name="l01732"></a><span class="lineno"> 1732</span>&#160;            }</div><div class="line"><a name="l01733"></a><span class="lineno"> 1733</span>&#160;        }</div><div class="line"><a name="l01734"></a><span class="lineno"> 1734</span>&#160;    }</div><div class="line"><a name="l01735"></a><span class="lineno"> 1735</span>&#160;    {</div><div class="line"><a name="l01736"></a><span class="lineno"> 1736</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="l01737"></a><span class="lineno"> 1737</span>&#160;        <span class="keywordflow">if</span> (m_NetworkProperties.m_ExportEnabled)</div><div class="line"><a name="l01738"></a><span class="lineno"> 1738</span>&#160;        {</div><div class="line"><a name="l01739"></a><span class="lineno"> 1739</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> pair: outputTensors)</div><div class="line"><a name="l01740"></a><span class="lineno"> 1740</span>&#160;            {</div><div class="line"><a name="l01741"></a><span class="lineno"> 1741</span>&#160;                ImportOutputTensor(pair.second, workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ad5e03a241b63b19580f8fdd08c3647b7">GetOutputHandle</a>(pair.first));</div><div class="line"><a name="l01742"></a><span class="lineno"> 1742</span>&#160;            }</div><div class="line"><a name="l01743"></a><span class="lineno"> 1743</span>&#160;        }</div><div class="line"><a name="l01744"></a><span class="lineno"> 1744</span>&#160;</div><div class="line"><a name="l01745"></a><span class="lineno"> 1745</span>&#160;        <span class="keywordflow">for</span> (<a class="code" href="namespacearmnn.xhtml#ac68a434f0e78e33726bfb22a39ec813f">ImportedOutputId</a> <span class="keywordtype">id</span> : preImportedOutputs)</div><div class="line"><a name="l01746"></a><span class="lineno"> 1746</span>&#160;        {</div><div class="line"><a name="l01747"></a><span class="lineno"> 1747</span>&#160;            <span class="keyword">const</span> ImportedTensorHandlePin&amp; importedOutputPin = m_PreImportedOutputHandles[id];</div><div class="line"><a name="l01748"></a><span class="lineno"> 1748</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> layerBindingId = m_PreImportedOutputHandles[id].m_LayerBindingId;</div><div class="line"><a name="l01749"></a><span class="lineno"> 1749</span>&#160;            <span class="keyword">const</span> <span class="keyword">auto</span>&amp; preimportedHandle = importedOutputPin.m_TensorHandle;</div><div class="line"><a name="l01750"></a><span class="lineno"> 1750</span>&#160;</div><div class="line"><a name="l01751"></a><span class="lineno"> 1751</span>&#160;            <span class="keyword">auto</span> outputConnections = workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a39754dbf5b5cb692d3ba97f23b23962f">GetOutputConnection</a>(layerBindingId);</div><div class="line"><a name="l01752"></a><span class="lineno"> 1752</span>&#160;</div><div class="line"><a name="l01753"></a><span class="lineno"> 1753</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span> it : outputConnections)</div><div class="line"><a name="l01754"></a><span class="lineno"> 1754</span>&#160;            {</div><div class="line"><a name="l01755"></a><span class="lineno"> 1755</span>&#160;                *it = preimportedHandle.get();</div><div class="line"><a name="l01756"></a><span class="lineno"> 1756</span>&#160;            }</div><div class="line"><a name="l01757"></a><span class="lineno"> 1757</span>&#160;        }</div><div class="line"><a name="l01758"></a><span class="lineno"> 1758</span>&#160;    }</div><div class="line"><a name="l01759"></a><span class="lineno"> 1759</span>&#160;</div><div class="line"><a name="l01760"></a><span class="lineno"> 1760</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="l01761"></a><span class="lineno"> 1761</span>&#160;    {</div><div class="line"><a name="l01762"></a><span class="lineno"> 1762</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="l01763"></a><span class="lineno"> 1763</span>&#160;        executionSucceeded = <span class="keyword">false</span>;</div><div class="line"><a name="l01764"></a><span class="lineno"> 1764</span>&#160;    };</div><div class="line"><a name="l01765"></a><span class="lineno"> 1765</span>&#160;    profiling::ProfilingDynamicGuid workloadInferenceID(0);</div><div class="line"><a name="l01766"></a><span class="lineno"> 1766</span>&#160;</div><div class="line"><a name="l01767"></a><span class="lineno"> 1767</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l01768"></a><span class="lineno"> 1768</span>&#160;    {</div><div class="line"><a name="l01769"></a><span class="lineno"> 1769</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="l01770"></a><span class="lineno"> 1770</span>&#160;        {</div><div class="line"><a name="l01771"></a><span class="lineno"> 1771</span>&#160;            <span class="keyword">auto</span>&amp; workload = m_WorkloadQueue[i];</div><div class="line"><a name="l01772"></a><span class="lineno"> 1772</span>&#160;            <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01773"></a><span class="lineno"> 1773</span>&#160;            {</div><div class="line"><a name="l01774"></a><span class="lineno"> 1774</span>&#160;                workloadInferenceID = timelineUtils-&gt;RecordWorkloadInferenceAndStartOfLifeEvent(workload-&gt;GetGuid(),</div><div class="line"><a name="l01775"></a><span class="lineno"> 1775</span>&#160;                                                                                                inferenceGuid);</div><div class="line"><a name="l01776"></a><span class="lineno"> 1776</span>&#160;            }</div><div class="line"><a name="l01777"></a><span class="lineno"> 1777</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="l01778"></a><span class="lineno"> 1778</span>&#160;</div><div class="line"><a name="l01779"></a><span class="lineno"> 1779</span>&#160;            <span class="keywordflow">if</span> (timelineUtils)</div><div class="line"><a name="l01780"></a><span class="lineno"> 1780</span>&#160;            {</div><div class="line"><a name="l01781"></a><span class="lineno"> 1781</span>&#160;                timelineUtils-&gt;RecordEndOfLifeEvent(workloadInferenceID);</div><div class="line"><a name="l01782"></a><span class="lineno"> 1782</span>&#160;            }</div><div class="line"><a name="l01783"></a><span class="lineno"> 1783</span>&#160;        }</div><div class="line"><a name="l01784"></a><span class="lineno"> 1784</span>&#160;    }</div><div class="line"><a name="l01785"></a><span class="lineno"> 1785</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="l01786"></a><span class="lineno"> 1786</span>&#160;    {</div><div class="line"><a name="l01787"></a><span class="lineno"> 1787</span>&#160;        resetMemHandle();</div><div class="line"><a name="l01788"></a><span class="lineno"> 1788</span>&#160;        Fail(error);</div><div class="line"><a name="l01789"></a><span class="lineno"> 1789</span>&#160;    }</div><div class="line"><a name="l01790"></a><span class="lineno"> 1790</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error&amp; error)</div><div class="line"><a name="l01791"></a><span class="lineno"> 1791</span>&#160;    {</div><div class="line"><a name="l01792"></a><span class="lineno"> 1792</span>&#160;        resetMemHandle();</div><div class="line"><a name="l01793"></a><span class="lineno"> 1793</span>&#160;        Fail(error);</div><div class="line"><a name="l01794"></a><span class="lineno"> 1794</span>&#160;    }</div><div class="line"><a name="l01795"></a><span class="lineno"> 1795</span>&#160;    <span class="keywordflow">catch</span> (...)</div><div class="line"><a name="l01796"></a><span class="lineno"> 1796</span>&#160;    {</div><div class="line"><a name="l01797"></a><span class="lineno"> 1797</span>&#160;        resetMemHandle();</div><div class="line"><a name="l01798"></a><span class="lineno"> 1798</span>&#160;        <span class="keywordflow">throw</span>;</div><div class="line"><a name="l01799"></a><span class="lineno"> 1799</span>&#160;    }</div><div class="line"><a name="l01800"></a><span class="lineno"> 1800</span>&#160;</div><div class="line"><a name="l01801"></a><span class="lineno"> 1801</span>&#160;    <span class="keywordflow">if</span> (!m_NetworkProperties.m_ExportEnabled)</div><div class="line"><a name="l01802"></a><span class="lineno"> 1802</span>&#160;    {</div><div class="line"><a name="l01803"></a><span class="lineno"> 1803</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span> pair: outputTensors)</div><div class="line"><a name="l01804"></a><span class="lineno"> 1804</span>&#160;        {</div><div class="line"><a name="l01805"></a><span class="lineno"> 1805</span>&#160;            <a class="code" href="namespacearmnn.xhtml#a5acae80f1d8fd03cdb3878bd356683d7">CopyToOutputTensor</a>(pair.second, workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ad5e03a241b63b19580f8fdd08c3647b7">GetOutputHandle</a>(pair.first));</div><div class="line"><a name="l01806"></a><span class="lineno"> 1806</span>&#160;        }</div><div class="line"><a name="l01807"></a><span class="lineno"> 1807</span>&#160;    }</div><div class="line"><a name="l01808"></a><span class="lineno"> 1808</span>&#160;    <span class="keywordflow">else</span></div><div class="line"><a name="l01809"></a><span class="lineno"> 1809</span>&#160;    {</div><div class="line"><a name="l01810"></a><span class="lineno"> 1810</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="l01811"></a><span class="lineno"> 1811</span>&#160;       workingMemHandle.<a class="code" href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a7487c3835e842582920969f2663bcc30">MemSyncOutputs</a>();</div><div class="line"><a name="l01812"></a><span class="lineno"> 1812</span>&#160;    }</div><div class="line"><a name="l01813"></a><span class="lineno"> 1813</span>&#160;</div><div class="line"><a name="l01814"></a><span class="lineno"> 1814</span>&#160;    resetMemHandle();</div><div class="line"><a name="l01815"></a><span class="lineno"> 1815</span>&#160;</div><div class="line"><a name="l01816"></a><span class="lineno"> 1816</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="l01817"></a><span class="lineno"> 1817</span>&#160;}</div><div class="line"><a name="l01818"></a><span class="lineno"> 1818</span>&#160;<span class="comment"></span></div><div class="line"><a name="l01819"></a><span class="lineno"> 1819</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="l01820"></a><span class="lineno"> 1820</span>&#160;<span class="comment">/// overlapped Execution by calling this function from different threads.</span></div><div class="line"><a name="l01821"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a16e72675c37a8f251cf02951e222d4ab"> 1821</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="l01822"></a><span class="lineno"> 1822</span>&#160;{</div><div class="line"><a name="l01823"></a><span class="lineno"> 1823</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="l01824"></a><span class="lineno"> 1824</span>&#160;</div><div class="line"><a name="l01825"></a><span class="lineno"> 1825</span>&#160;    <span class="comment">// Tensors that will need to be allocated internally within armnn</span></div><div class="line"><a name="l01826"></a><span class="lineno"> 1826</span>&#160;    std::vector&lt;std::unique_ptr&lt;ITensorHandle&gt;&gt; managedTensorHandles;</div><div class="line"><a name="l01827"></a><span class="lineno"> 1827</span>&#160;    <span class="comment">// Tensors that will be allocated externally by the user</span></div><div class="line"><a name="l01828"></a><span class="lineno"> 1828</span>&#160;    std::vector&lt;std::unique_ptr&lt;ITensorHandle&gt;&gt; unmanagedTensorHandles;</div><div class="line"><a name="l01829"></a><span class="lineno"> 1829</span>&#160;</div><div class="line"><a name="l01830"></a><span class="lineno"> 1830</span>&#160;    std::vector&lt;WorkingMemDescriptor&gt; workingMemDescriptors;</div><div class="line"><a name="l01831"></a><span class="lineno"> 1831</span>&#160;    std::unordered_map&lt;LayerGuid, WorkingMemDescriptor&gt; workingMemDescriptorMap;</div><div class="line"><a name="l01832"></a><span class="lineno"> 1832</span>&#160;</div><div class="line"><a name="l01833"></a><span class="lineno"> 1833</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)</div><div class="line"><a name="l01834"></a><span class="lineno"> 1834</span>&#160;    {</div><div class="line"><a name="l01835"></a><span class="lineno"> 1835</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="l01836"></a><span class="lineno"> 1836</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="l01837"></a><span class="lineno"> 1837</span>&#160;</div><div class="line"><a name="l01838"></a><span class="lineno"> 1838</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="l01839"></a><span class="lineno"> 1839</span>&#160;        {</div><div class="line"><a name="l01840"></a><span class="lineno"> 1840</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="l01841"></a><span class="lineno"> 1841</span>&#160;            <a class="code" href="_deprecated_8hpp.xhtml#ab66a241a0ed3ee89c866e777b035d0ed">ARMNN_NO_DEPRECATE_WARN_BEGIN</a></div><div class="line"><a name="l01842"></a><span class="lineno"> 1842</span>&#160;            <span class="keywordflow">return</span> m_WorkloadFactories.at(<span class="keywordtype">id</span>)-&gt;CreateTensorHandle(tensorInfo, <span class="keyword">false</span>);</div><div class="line"><a name="l01843"></a><span class="lineno"> 1843</span>&#160;            <a class="code" href="_deprecated_8hpp.xhtml#ad762b11b48e5c1d1c1743f529485728a">ARMNN_NO_DEPRECATE_WARN_END</a></div><div class="line"><a name="l01844"></a><span class="lineno"> 1844</span>&#160;        }</div><div class="line"><a name="l01845"></a><span class="lineno"> 1845</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l01846"></a><span class="lineno"> 1846</span>&#160;        {</div><div class="line"><a name="l01847"></a><span class="lineno"> 1847</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle_factory.xhtml">ITensorHandleFactory</a>* handleFactory = m_TensorHandleFactoryRegistry.GetFactory(factoryId);</div><div class="line"><a name="l01848"></a><span class="lineno"> 1848</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(handleFactory);</div><div class="line"><a name="l01849"></a><span class="lineno"> 1849</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, <span class="keyword">false</span>);</div><div class="line"><a name="l01850"></a><span class="lineno"> 1850</span>&#160;        }</div><div class="line"><a name="l01851"></a><span class="lineno"> 1851</span>&#160;    };</div><div class="line"><a name="l01852"></a><span class="lineno"> 1852</span>&#160;</div><div class="line"><a name="l01853"></a><span class="lineno"> 1853</span>&#160;    <span class="keyword">struct </span>HandleInfo</div><div class="line"><a name="l01854"></a><span class="lineno"> 1854</span>&#160;    {</div><div class="line"><a name="l01855"></a><span class="lineno"> 1855</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* m_TensorHandle;</div><div class="line"><a name="l01856"></a><span class="lineno"> 1856</span>&#160;</div><div class="line"><a name="l01857"></a><span class="lineno"> 1857</span>&#160;        <span class="keywordtype">bool</span> m_IsInputLayerHandle = <span class="keyword">false</span>;</div><div class="line"><a name="l01858"></a><span class="lineno"> 1858</span>&#160;        <span class="keywordtype">bool</span> m_IsOutputLayerHandle = <span class="keyword">false</span>;</div><div class="line"><a name="l01859"></a><span class="lineno"> 1859</span>&#160;</div><div class="line"><a name="l01860"></a><span class="lineno"> 1860</span>&#160;        <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_input_mem_descriptor_coords.xhtml">WorkingMemHandle::InputMemDescriptorCoords</a> m_InputMemDescriptorCoords;</div><div class="line"><a name="l01861"></a><span class="lineno"> 1861</span>&#160;        <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_output_mem_descriptor_coords.xhtml">WorkingMemHandle::OutputMemDescriptorCoords</a> m_OutputMemDescriptorCoords;</div><div class="line"><a name="l01862"></a><span class="lineno"> 1862</span>&#160;    };</div><div class="line"><a name="l01863"></a><span class="lineno"> 1863</span>&#160;</div><div class="line"><a name="l01864"></a><span class="lineno"> 1864</span>&#160;    std::unordered_map&lt;const OutputSlot*, HandleInfo&gt; outputToHandleInfoMap;</div><div class="line"><a name="l01865"></a><span class="lineno"> 1865</span>&#160;</div><div class="line"><a name="l01866"></a><span class="lineno"> 1866</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> layerIndex = 0;</div><div class="line"><a name="l01867"></a><span class="lineno"> 1867</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l01868"></a><span class="lineno"> 1868</span>&#160;    {</div><div class="line"><a name="l01869"></a><span class="lineno"> 1869</span>&#160;        <span class="comment">// Constant layers execution and management is handled during loaded network construction</span></div><div class="line"><a name="l01870"></a><span class="lineno"> 1870</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#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l01871"></a><span class="lineno"> 1871</span>&#160;        {</div><div class="line"><a name="l01872"></a><span class="lineno"> 1872</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01873"></a><span class="lineno"> 1873</span>&#160;        }</div><div class="line"><a name="l01874"></a><span class="lineno"> 1874</span>&#160;</div><div class="line"><a name="l01875"></a><span class="lineno"> 1875</span>&#160;        <a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml">WorkingMemDescriptor</a> workingMemDescriptor;</div><div class="line"><a name="l01876"></a><span class="lineno"> 1876</span>&#160;</div><div class="line"><a name="l01877"></a><span class="lineno"> 1877</span>&#160;        <span class="keywordtype">bool</span> isMemoryManaged = <span class="keyword">true</span>;</div><div class="line"><a name="l01878"></a><span class="lineno"> 1878</span>&#160;        <span class="keywordtype">bool</span> isInputLayer = <span class="keyword">false</span>;</div><div class="line"><a name="l01879"></a><span class="lineno"> 1879</span>&#160;        <span class="keywordtype">bool</span> isOutputLayer = <span class="keyword">false</span>;</div><div class="line"><a name="l01880"></a><span class="lineno"> 1880</span>&#160;        <span class="keywordtype">bool</span> isConnectedToOutputLayer = <span class="keyword">false</span>;</div><div class="line"><a name="l01881"></a><span class="lineno"> 1881</span>&#160;</div><div class="line"><a name="l01882"></a><span class="lineno"> 1882</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#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="l01883"></a><span class="lineno"> 1883</span>&#160;        {</div><div class="line"><a name="l01884"></a><span class="lineno"> 1884</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="l01885"></a><span class="lineno"> 1885</span>&#160;            <span class="comment">// However we will still need to manage the tensorHandle</span></div><div class="line"><a name="l01886"></a><span class="lineno"> 1886</span>&#160;            isInputLayer = <span class="keyword">true</span>;</div><div class="line"><a name="l01887"></a><span class="lineno"> 1887</span>&#160;            isMemoryManaged = !m_NetworkProperties.m_ImportEnabled;</div><div class="line"><a name="l01888"></a><span class="lineno"> 1888</span>&#160;        }</div><div class="line"><a name="l01889"></a><span class="lineno"> 1889</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#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>)</div><div class="line"><a name="l01890"></a><span class="lineno"> 1890</span>&#160;        {</div><div class="line"><a name="l01891"></a><span class="lineno"> 1891</span>&#160;            isOutputLayer = <span class="keyword">true</span>;</div><div class="line"><a name="l01892"></a><span class="lineno"> 1892</span>&#160;        }</div><div class="line"><a name="l01893"></a><span class="lineno"> 1893</span>&#160;</div><div class="line"><a name="l01894"></a><span class="lineno"> 1894</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> slotIndex = 0;</div><div class="line"><a name="l01895"></a><span class="lineno"> 1895</span>&#160;        <span class="comment">// Create a tensor handle for each output slot of a layer</span></div><div class="line"><a name="l01896"></a><span class="lineno"> 1896</span>&#160;        <span class="comment">// Once we create it, we start managing its lifetime</span></div><div class="line"><a name="l01897"></a><span class="lineno"> 1897</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="l01898"></a><span class="lineno"> 1898</span>&#160;        {</div><div class="line"><a name="l01899"></a><span class="lineno"> 1899</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; slot.GetNumConnections(); ++i)</div><div class="line"><a name="l01900"></a><span class="lineno"> 1900</span>&#160;            {</div><div class="line"><a name="l01901"></a><span class="lineno"> 1901</span>&#160;                <span class="keywordflow">if</span> ((slot.GetConnection(i)-&gt;GetOwningLayer().GetType() == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a>))</div><div class="line"><a name="l01902"></a><span class="lineno"> 1902</span>&#160;                {</div><div class="line"><a name="l01903"></a><span class="lineno"> 1903</span>&#160;                    <span class="keywordflow">if</span> (!isConnectedToOutputLayer)</div><div class="line"><a name="l01904"></a><span class="lineno"> 1904</span>&#160;                    {</div><div class="line"><a name="l01905"></a><span class="lineno"> 1905</span>&#160;                        isConnectedToOutputLayer = <span class="keyword">true</span>;</div><div class="line"><a name="l01906"></a><span class="lineno"> 1906</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="l01907"></a><span class="lineno"> 1907</span>&#160;                        isMemoryManaged = !m_NetworkProperties.m_ExportEnabled;</div><div class="line"><a name="l01908"></a><span class="lineno"> 1908</span>&#160;                    }</div><div class="line"><a name="l01909"></a><span class="lineno"> 1909</span>&#160;                    <span class="keywordflow">else</span></div><div class="line"><a name="l01910"></a><span class="lineno"> 1910</span>&#160;                    {</div><div class="line"><a name="l01911"></a><span class="lineno"> 1911</span>&#160;                        <span class="comment">// Importing in this case would likely cause unexpected behaviour, so we disallow it.</span></div><div class="line"><a name="l01912"></a><span class="lineno"> 1912</span>&#160;                        <a class="code" href="_logging_8hpp.xhtml#a7b6ad073975f437ec38ca7d20154727f">ARMNN_LOG</a>(<a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407a7b83d3f08fa392b79e3f553b585971cd">warning</a>) &lt;&lt;</div><div class="line"><a name="l01913"></a><span class="lineno"> 1913</span>&#160;                           fmt::format(<span class="stringliteral">&quot;Layer name: &#39;{0}&#39; guid: &#39;{1}&#39; has two or more OutputLayers connected to it. &quot;</span></div><div class="line"><a name="l01914"></a><span class="lineno"> 1914</span>&#160;                                       <span class="stringliteral">&quot;This will prevent importing on the connected OutputLayers.&quot;</span>,</div><div class="line"><a name="l01915"></a><span class="lineno"> 1915</span>&#160;                                        layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">GetName</a>(), layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a8dc12f0ee5b232d397bd18ced1a72a64">GetGuid</a>());</div><div class="line"><a name="l01916"></a><span class="lineno"> 1916</span>&#160;                        isMemoryManaged = <span class="keyword">true</span>;</div><div class="line"><a name="l01917"></a><span class="lineno"> 1917</span>&#160;                    }</div><div class="line"><a name="l01918"></a><span class="lineno"> 1918</span>&#160;                }</div><div class="line"><a name="l01919"></a><span class="lineno"> 1919</span>&#160;            }</div><div class="line"><a name="l01920"></a><span class="lineno"> 1920</span>&#160;</div><div class="line"><a name="l01921"></a><span class="lineno"> 1921</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle;</div><div class="line"><a name="l01922"></a><span class="lineno"> 1922</span>&#160;            <span class="keywordflow">if</span> (isMemoryManaged)</div><div class="line"><a name="l01923"></a><span class="lineno"> 1923</span>&#160;            {</div><div class="line"><a name="l01924"></a><span class="lineno"> 1924</span>&#160;                managedTensorHandles.emplace_back(GetTensorHandle(layer, slot));</div><div class="line"><a name="l01925"></a><span class="lineno"> 1925</span>&#160;                tensorHandle = managedTensorHandles.back().get();</div><div class="line"><a name="l01926"></a><span class="lineno"> 1926</span>&#160;            }</div><div class="line"><a name="l01927"></a><span class="lineno"> 1927</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l01928"></a><span class="lineno"> 1928</span>&#160;            {</div><div class="line"><a name="l01929"></a><span class="lineno"> 1929</span>&#160;                unmanagedTensorHandles.emplace_back(GetTensorHandle(layer, slot));</div><div class="line"><a name="l01930"></a><span class="lineno"> 1930</span>&#160;                tensorHandle = unmanagedTensorHandles.back().get();</div><div class="line"><a name="l01931"></a><span class="lineno"> 1931</span>&#160;            }</div><div class="line"><a name="l01932"></a><span class="lineno"> 1932</span>&#160;</div><div class="line"><a name="l01933"></a><span class="lineno"> 1933</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="l01934"></a><span class="lineno"> 1934</span>&#160;</div><div class="line"><a name="l01935"></a><span class="lineno"> 1935</span>&#160;            HandleInfo&amp; handleInfo = outputToHandleInfoMap[&amp;slot];</div><div class="line"><a name="l01936"></a><span class="lineno"> 1936</span>&#160;            handleInfo.m_TensorHandle = tensorHandle;</div><div class="line"><a name="l01937"></a><span class="lineno"> 1937</span>&#160;</div><div class="line"><a name="l01938"></a><span class="lineno"> 1938</span>&#160;            <span class="comment">// Store the coordinates of the current layer&#39;s OutputSlot that is connected to the OutputLayer</span></div><div class="line"><a name="l01939"></a><span class="lineno"> 1939</span>&#160;            <span class="keywordflow">if</span> (isConnectedToOutputLayer)</div><div class="line"><a name="l01940"></a><span class="lineno"> 1940</span>&#160;            {</div><div class="line"><a name="l01941"></a><span class="lineno"> 1941</span>&#160;                handleInfo.m_IsOutputLayerHandle = <span class="keyword">true</span>;</div><div class="line"><a name="l01942"></a><span class="lineno"> 1942</span>&#160;                handleInfo.m_OutputMemDescriptorCoords.m_OutputSlotCoords = {layerIndex, slotIndex};</div><div class="line"><a name="l01943"></a><span class="lineno"> 1943</span>&#160;            }</div><div class="line"><a name="l01944"></a><span class="lineno"> 1944</span>&#160;            <span class="comment">// Store the LayerBindingId of the InputLayer</span></div><div class="line"><a name="l01945"></a><span class="lineno"> 1945</span>&#160;            <span class="keywordflow">if</span> (isInputLayer)</div><div class="line"><a name="l01946"></a><span class="lineno"> 1946</span>&#160;            {</div><div class="line"><a name="l01947"></a><span class="lineno"> 1947</span>&#160;                handleInfo.m_IsInputLayerHandle = <span class="keyword">true</span>;</div><div class="line"><a name="l01948"></a><span class="lineno"> 1948</span>&#160;                <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> bindingId = <span class="keyword">static_cast&lt;</span><a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>*<span class="keyword">&gt;</span>(layer)-&gt;GetBindingId();</div><div class="line"><a name="l01949"></a><span class="lineno"> 1949</span>&#160;                handleInfo.m_InputMemDescriptorCoords.m_LayerBindingId = bindingId;</div><div class="line"><a name="l01950"></a><span class="lineno"> 1950</span>&#160;            }</div><div class="line"><a name="l01951"></a><span class="lineno"> 1951</span>&#160;            slotIndex++;</div><div class="line"><a name="l01952"></a><span class="lineno"> 1952</span>&#160;        }</div><div class="line"><a name="l01953"></a><span class="lineno"> 1953</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="l01954"></a><span class="lineno"> 1954</span>&#160;        <span class="comment">// to each tensor handle we encounter.</span></div><div class="line"><a name="l01955"></a><span class="lineno"> 1955</span>&#160;        <span class="comment">// Once it reaches zero, the lifetime of the tensor handle has ended, and we mark its memory as available</span></div><div class="line"><a name="l01956"></a><span class="lineno"> 1956</span>&#160;        <span class="comment">// so that the next tensor handle with a non overlapping lifetime can share its memory.</span></div><div class="line"><a name="l01957"></a><span class="lineno"> 1957</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="l01958"></a><span class="lineno"> 1958</span>&#160;        {</div><div class="line"><a name="l01959"></a><span class="lineno"> 1959</span>&#160;            <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(slot.GetConnection());</div><div class="line"><a name="l01960"></a><span class="lineno"> 1960</span>&#160;            <span class="keyword">auto</span> outputSlot = slot.GetConnectedOutputSlot();</div><div class="line"><a name="l01961"></a><span class="lineno"> 1961</span>&#160;            <span class="keyword">auto</span> key = outputSlot-&gt;GetOwningLayer().GetGuid();</div><div class="line"><a name="l01962"></a><span class="lineno"> 1962</span>&#160;</div><div class="line"><a name="l01963"></a><span class="lineno"> 1963</span>&#160;            <span class="comment">// Constant layers execution and management is handled during loaded network construction</span></div><div class="line"><a name="l01964"></a><span class="lineno"> 1964</span>&#160;            <span class="keyword">auto</span> found = m_ConstantTensorHandles.find(key);</div><div class="line"><a name="l01965"></a><span class="lineno"> 1965</span>&#160;            <span class="keywordflow">if</span> (found != m_ConstantTensorHandles.end())</div><div class="line"><a name="l01966"></a><span class="lineno"> 1966</span>&#160;            {</div><div class="line"><a name="l01967"></a><span class="lineno"> 1967</span>&#160;                <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = found-&gt;second;</div><div class="line"><a name="l01968"></a><span class="lineno"> 1968</span>&#160;                workingMemDescriptor.<a class="code" href="structarmnn_1_1experimental_1_1_working_mem_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>.push_back(tensorHandle);</div><div class="line"><a name="l01969"></a><span class="lineno"> 1969</span>&#160;</div><div class="line"><a name="l01970"></a><span class="lineno"> 1970</span>&#160;                <span class="comment">// Odd case where a constant layer is connected to an output layer</span></div><div class="line"><a name="l01971"></a><span class="lineno"> 1971</span>&#160;                <span class="comment">// We will need to create a HandleInfo to track it</span></div><div class="line"><a name="l01972"></a><span class="lineno"> 1972</span>&#160;                <span class="keywordflow">if</span> (isOutputLayer)</div><div class="line"><a name="l01973"></a><span class="lineno"> 1973</span>&#160;                {</div><div class="line"><a name="l01974"></a><span class="lineno"> 1974</span>&#160;                    <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> bindingId = <span class="keyword">static_cast&lt;</span><a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>*<span class="keyword">&gt;</span>(layer)-&gt;GetBindingId();</div><div class="line"><a name="l01975"></a><span class="lineno"> 1975</span>&#160;</div><div class="line"><a name="l01976"></a><span class="lineno"> 1976</span>&#160;                    HandleInfo&amp; handleInfo = outputToHandleInfoMap[outputSlot];</div><div class="line"><a name="l01977"></a><span class="lineno"> 1977</span>&#160;                    handleInfo.m_TensorHandle = tensorHandle;</div><div class="line"><a name="l01978"></a><span class="lineno"> 1978</span>&#160;                    handleInfo.m_IsOutputLayerHandle = <span class="keyword">true</span>;</div><div class="line"><a name="l01979"></a><span class="lineno"> 1979</span>&#160;                    handleInfo.m_OutputMemDescriptorCoords.m_LayerBindingIds.push_back(bindingId);</div><div class="line"><a name="l01980"></a><span class="lineno"> 1980</span>&#160;                    handleInfo.m_OutputMemDescriptorCoords.m_InputSlotCoords.push_back({layerIndex, 0});</div><div class="line"><a name="l01981"></a><span class="lineno"> 1981</span>&#160;                }</div><div class="line"><a name="l01982"></a><span class="lineno"> 1982</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l01983"></a><span class="lineno"> 1983</span>&#160;            }</div><div class="line"><a name="l01984"></a><span class="lineno"> 1984</span>&#160;</div><div class="line"><a name="l01985"></a><span class="lineno"> 1985</span>&#160;            HandleInfo&amp; handleInfo = outputToHandleInfoMap.at(outputSlot);</div><div class="line"><a name="l01986"></a><span class="lineno"> 1986</span>&#160;</div><div class="line"><a name="l01987"></a><span class="lineno"> 1987</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* inputTensorHandle = handleInfo.m_TensorHandle;</div><div class="line"><a name="l01988"></a><span class="lineno"> 1988</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="l01989"></a><span class="lineno"> 1989</span>&#160;</div><div class="line"><a name="l01990"></a><span class="lineno"> 1990</span>&#160;            <span class="comment">// Store the LayerBindingId of the OutputLayer</span></div><div class="line"><a name="l01991"></a><span class="lineno"> 1991</span>&#160;            <span class="keywordflow">if</span> (isOutputLayer)</div><div class="line"><a name="l01992"></a><span class="lineno"> 1992</span>&#160;            {</div><div class="line"><a name="l01993"></a><span class="lineno"> 1993</span>&#160;                <a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> bindingId = <span class="keyword">static_cast&lt;</span><a class="code" href="classarmnn_1_1_bindable_layer.xhtml">BindableLayer</a>*<span class="keyword">&gt;</span>(layer)-&gt;GetBindingId();</div><div class="line"><a name="l01994"></a><span class="lineno"> 1994</span>&#160;                handleInfo.m_OutputMemDescriptorCoords.m_LayerBindingIds.push_back(bindingId);</div><div class="line"><a name="l01995"></a><span class="lineno"> 1995</span>&#160;                handleInfo.m_OutputMemDescriptorCoords.m_InputSlotCoords.push_back({layerIndex, 0});</div><div class="line"><a name="l01996"></a><span class="lineno"> 1996</span>&#160;            }</div><div class="line"><a name="l01997"></a><span class="lineno"> 1997</span>&#160;            <span class="comment">// In this case the layer is not an Output Layer but shares its input tensorhandle with an OutputLayer</span></div><div class="line"><a name="l01998"></a><span class="lineno"> 1998</span>&#160;            <span class="comment">// It will need to be updated as well, if we swap out the tensorhandle</span></div><div class="line"><a name="l01999"></a><span class="lineno"> 1999</span>&#160;            <span class="keywordflow">else</span> <span class="keywordflow">if</span> (handleInfo.m_IsOutputLayerHandle)</div><div class="line"><a name="l02000"></a><span class="lineno"> 2000</span>&#160;            {</div><div class="line"><a name="l02001"></a><span class="lineno"> 2001</span>&#160;                handleInfo.m_OutputMemDescriptorCoords.m_InputSlotCoords.push_back({layerIndex, slot.GetSlotIndex()});</div><div class="line"><a name="l02002"></a><span class="lineno"> 2002</span>&#160;            }</div><div class="line"><a name="l02003"></a><span class="lineno"> 2003</span>&#160;</div><div class="line"><a name="l02004"></a><span class="lineno"> 2004</span>&#160;            <span class="comment">// Store the coordinates of the InputSlots connected to the InputLayer</span></div><div class="line"><a name="l02005"></a><span class="lineno"> 2005</span>&#160;            <span class="comment">// There can be more than one InputSlot connected to an InputLayer, so we use a vector</span></div><div class="line"><a name="l02006"></a><span class="lineno"> 2006</span>&#160;            <span class="keywordflow">if</span> (handleInfo.m_IsInputLayerHandle)</div><div class="line"><a name="l02007"></a><span class="lineno"> 2007</span>&#160;            {</div><div class="line"><a name="l02008"></a><span class="lineno"> 2008</span>&#160;                std::pair&lt;LayerGuid, unsigned int&gt; connectionLocation{layerIndex, slot.GetSlotIndex()};</div><div class="line"><a name="l02009"></a><span class="lineno"> 2009</span>&#160;                handleInfo.m_InputMemDescriptorCoords.m_InputSlotCoords.emplace_back(connectionLocation);</div><div class="line"><a name="l02010"></a><span class="lineno"> 2010</span>&#160;            }</div><div class="line"><a name="l02011"></a><span class="lineno"> 2011</span>&#160;        }</div><div class="line"><a name="l02012"></a><span class="lineno"> 2012</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="l02013"></a><span class="lineno"> 2013</span>&#160;</div><div class="line"><a name="l02014"></a><span class="lineno"> 2014</span>&#160;        <span class="comment">// Input/Output layers/workloads will not be executed, so the descriptor is not added to workingMemDescriptors</span></div><div class="line"><a name="l02015"></a><span class="lineno"> 2015</span>&#160;        <span class="comment">// However we will still need to manage the tensorHandle</span></div><div class="line"><a name="l02016"></a><span class="lineno"> 2016</span>&#160;        <span class="keywordflow">if</span> (!isInputLayer)</div><div class="line"><a name="l02017"></a><span class="lineno"> 2017</span>&#160;        {</div><div class="line"><a name="l02018"></a><span class="lineno"> 2018</span>&#160;            workingMemDescriptors.push_back(workingMemDescriptor);</div><div class="line"><a name="l02019"></a><span class="lineno"> 2019</span>&#160;            layerIndex++;</div><div class="line"><a name="l02020"></a><span class="lineno"> 2020</span>&#160;        }</div><div class="line"><a name="l02021"></a><span class="lineno"> 2021</span>&#160;    }</div><div class="line"><a name="l02022"></a><span class="lineno"> 2022</span>&#160;</div><div class="line"><a name="l02023"></a><span class="lineno"> 2023</span>&#160;    std::vector&lt;std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&gt; tensorMemory;</div><div class="line"><a name="l02024"></a><span class="lineno"> 2024</span>&#160;</div><div class="line"><a name="l02025"></a><span class="lineno"> 2025</span>&#160;    <span class="keyword">auto</span> externalMemoryManager = CreateExternalMemoryManger(tensorMemory);</div><div class="line"><a name="l02026"></a><span class="lineno"> 2026</span>&#160;</div><div class="line"><a name="l02027"></a><span class="lineno"> 2027</span>&#160;    <span class="comment">// Sort m_TensorMemory, so it&#39;s order matches the outputSlot order</span></div><div class="line"><a name="l02028"></a><span class="lineno"> 2028</span>&#160;    std::sort(tensorMemory.begin(), tensorMemory.end(),</div><div class="line"><a name="l02029"></a><span class="lineno"> 2029</span>&#160;              [](<span class="keyword">const</span> std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&amp; lhs,</div><div class="line"><a name="l02030"></a><span class="lineno"> 2030</span>&#160;                 <span class="keyword">const</span> std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&amp; rhs)</div><div class="line"><a name="l02031"></a><span class="lineno"> 2031</span>&#160;              {</div><div class="line"><a name="l02032"></a><span class="lineno"> 2032</span>&#160;                  <span class="keywordflow">return</span> lhs.first-&gt;m_OutputSlotId &lt; rhs.first-&gt;m_OutputSlotId;</div><div class="line"><a name="l02033"></a><span class="lineno"> 2033</span>&#160;              });</div><div class="line"><a name="l02034"></a><span class="lineno"> 2034</span>&#160;</div><div class="line"><a name="l02035"></a><span class="lineno"> 2035</span>&#160;    std::vector&lt;WorkingMemHandle::InputMemDescriptorCoords&gt; inputConnectionsInfo;</div><div class="line"><a name="l02036"></a><span class="lineno"> 2036</span>&#160;    std::vector&lt;WorkingMemHandle::OutputMemDescriptorCoords&gt; outputConnectionsInfo;</div><div class="line"><a name="l02037"></a><span class="lineno"> 2037</span>&#160;</div><div class="line"><a name="l02038"></a><span class="lineno"> 2038</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>&amp; handleInfo: outputToHandleInfoMap)</div><div class="line"><a name="l02039"></a><span class="lineno"> 2039</span>&#160;    {</div><div class="line"><a name="l02040"></a><span class="lineno"> 2040</span>&#160;        <span class="keywordflow">if</span> (handleInfo.second.m_IsOutputLayerHandle)</div><div class="line"><a name="l02041"></a><span class="lineno"> 2041</span>&#160;        {</div><div class="line"><a name="l02042"></a><span class="lineno"> 2042</span>&#160;            outputConnectionsInfo.emplace_back(handleInfo.second.m_OutputMemDescriptorCoords);</div><div class="line"><a name="l02043"></a><span class="lineno"> 2043</span>&#160;        }</div><div class="line"><a name="l02044"></a><span class="lineno"> 2044</span>&#160;</div><div class="line"><a name="l02045"></a><span class="lineno"> 2045</span>&#160;        <span class="keywordflow">if</span> (handleInfo.second.m_IsInputLayerHandle)</div><div class="line"><a name="l02046"></a><span class="lineno"> 2046</span>&#160;        {</div><div class="line"><a name="l02047"></a><span class="lineno"> 2047</span>&#160;            inputConnectionsInfo.emplace_back(handleInfo.second.m_InputMemDescriptorCoords);</div><div class="line"><a name="l02048"></a><span class="lineno"> 2048</span>&#160;        }</div><div class="line"><a name="l02049"></a><span class="lineno"> 2049</span>&#160;    }</div><div class="line"><a name="l02050"></a><span class="lineno"> 2050</span>&#160;</div><div class="line"><a name="l02051"></a><span class="lineno"> 2051</span>&#160;    <span class="keywordflow">return</span> std::make_unique&lt;WorkingMemHandle&gt;(networkId,</div><div class="line"><a name="l02052"></a><span class="lineno"> 2052</span>&#160;                                              inputConnectionsInfo,</div><div class="line"><a name="l02053"></a><span class="lineno"> 2053</span>&#160;                                              outputConnectionsInfo,</div><div class="line"><a name="l02054"></a><span class="lineno"> 2054</span>&#160;                                              workingMemDescriptors,</div><div class="line"><a name="l02055"></a><span class="lineno"> 2055</span>&#160;                                              workingMemDescriptorMap,</div><div class="line"><a name="l02056"></a><span class="lineno"> 2056</span>&#160;                                              std::move(externalMemoryManager),</div><div class="line"><a name="l02057"></a><span class="lineno"> 2057</span>&#160;                                              std::move(tensorMemory),</div><div class="line"><a name="l02058"></a><span class="lineno"> 2058</span>&#160;                                              std::move(managedTensorHandles),</div><div class="line"><a name="l02059"></a><span class="lineno"> 2059</span>&#160;                                              std::move(unmanagedTensorHandles));</div><div class="line"><a name="l02060"></a><span class="lineno"> 2060</span>&#160;}</div><div class="line"><a name="l02061"></a><span class="lineno"> 2061</span>&#160;</div><div class="line"><a name="l02062"></a><span class="lineno"><a class="line" href="classarmnn_1_1_loaded_network.xhtml#a091ea8d2d804c8902f3120fdf2a36512"> 2062</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="l02063"></a><span class="lineno"> 2063</span>&#160;{</div><div class="line"><a name="l02064"></a><span class="lineno"> 2064</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; workloadPtr: m_WorkloadQueue)</div><div class="line"><a name="l02065"></a><span class="lineno"> 2065</span>&#160;    {</div><div class="line"><a name="l02066"></a><span class="lineno"> 2066</span>&#160;        workloadPtr.get()-&gt;RegisterDebugCallback(func);</div><div class="line"><a name="l02067"></a><span class="lineno"> 2067</span>&#160;    }</div><div class="line"><a name="l02068"></a><span class="lineno"> 2068</span>&#160;}</div><div class="line"><a name="l02069"></a><span class="lineno"> 2069</span>&#160;</div><div class="line"><a name="l02070"></a><span class="lineno"> 2070</span>&#160;</div><div class="line"><a name="l02071"></a><span class="lineno"> 2071</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::CreateMemoryProfileAsync()</div><div class="line"><a name="l02072"></a><span class="lineno"> 2072</span>&#160;{</div><div class="line"><a name="l02073"></a><span class="lineno"> 2073</span>&#160;    <span class="keyword">struct </span>PartialBlock</div><div class="line"><a name="l02074"></a><span class="lineno"> 2074</span>&#160;    {</div><div class="line"><a name="l02075"></a><span class="lineno"> 2075</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_StartOfLife;</div><div class="line"><a name="l02076"></a><span class="lineno"> 2076</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_Lifetime;</div><div class="line"><a name="l02077"></a><span class="lineno"> 2077</span>&#160;</div><div class="line"><a name="l02078"></a><span class="lineno"> 2078</span>&#160;        <span class="keywordtype">size_t</span> m_MemSize;</div><div class="line"><a name="l02079"></a><span class="lineno"> 2079</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_Index;</div><div class="line"><a name="l02080"></a><span class="lineno"> 2080</span>&#160;</div><div class="line"><a name="l02081"></a><span class="lineno"> 2081</span>&#160;        <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> m_BackendId;</div><div class="line"><a name="l02082"></a><span class="lineno"> 2082</span>&#160;    };</div><div class="line"><a name="l02083"></a><span class="lineno"> 2083</span>&#160;</div><div class="line"><a name="l02084"></a><span class="lineno"> 2084</span>&#160;    <span class="keyword">auto</span> align = [](<span class="keywordtype">size_t</span> numToAlign)</div><div class="line"><a name="l02085"></a><span class="lineno"> 2085</span>&#160;    {</div><div class="line"><a name="l02086"></a><span class="lineno"> 2086</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> alignment = <span class="keyword">sizeof</span>(float);</div><div class="line"><a name="l02087"></a><span class="lineno"> 2087</span>&#160;        <span class="keywordflow">return</span> ((numToAlign + alignment - 1) / alignment) * alignment;</div><div class="line"><a name="l02088"></a><span class="lineno"> 2088</span>&#160;    };</div><div class="line"><a name="l02089"></a><span class="lineno"> 2089</span>&#160;</div><div class="line"><a name="l02090"></a><span class="lineno"> 2090</span>&#160;    std::unordered_map&lt;const OutputSlot*, PartialBlock&gt; memBlockTrackerMap;</div><div class="line"><a name="l02091"></a><span class="lineno"> 2091</span>&#160;</div><div class="line"><a name="l02092"></a><span class="lineno"> 2092</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> inputImportingEnabled = m_NetworkProperties.m_InputSource != <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>;</div><div class="line"><a name="l02093"></a><span class="lineno"> 2093</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> outputImportingEnabled = m_NetworkProperties.m_OutputSource != <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>;</div><div class="line"><a name="l02094"></a><span class="lineno"> 2094</span>&#160;</div><div class="line"><a name="l02095"></a><span class="lineno"> 2095</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timestep = 0;</div><div class="line"><a name="l02096"></a><span class="lineno"> 2096</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputIndex = 0;</div><div class="line"><a name="l02097"></a><span class="lineno"> 2097</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="l02098"></a><span class="lineno"> 2098</span>&#160;</div><div class="line"><a name="l02099"></a><span class="lineno"> 2099</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l02100"></a><span class="lineno"> 2100</span>&#160;    {</div><div class="line"><a name="l02101"></a><span class="lineno"> 2101</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4">LayerType</a>&amp; layerType = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>();</div><div class="line"><a name="l02102"></a><span class="lineno"> 2102</span>&#160;        <span class="comment">// Don&#39;t manage memory if importing.</span></div><div class="line"><a name="l02103"></a><span class="lineno"> 2103</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a> &amp;&amp; inputImportingEnabled)</div><div class="line"><a name="l02104"></a><span class="lineno"> 2104</span>&#160;        {</div><div class="line"><a name="l02105"></a><span class="lineno"> 2105</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02106"></a><span class="lineno"> 2106</span>&#160;        }</div><div class="line"><a name="l02107"></a><span class="lineno"> 2107</span>&#160;        <span class="comment">// Don&#39;t manage memory if importing.</span></div><div class="line"><a name="l02108"></a><span class="lineno"> 2108</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a> &amp;&amp; outputImportingEnabled</div><div class="line"><a name="l02109"></a><span class="lineno"> 2109</span>&#160;            &amp;&amp; layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0).<a class="code" href="classarmnn_1_1_input_slot.xhtml#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>()-&gt;<a class="code" href="classarmnn_1_1_output_slot.xhtml#a25b0119c02aece1d341b99953d169c0f">GetNumConnections</a>() == 1)</div><div class="line"><a name="l02110"></a><span class="lineno"> 2110</span>&#160;        {</div><div class="line"><a name="l02111"></a><span class="lineno"> 2111</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02112"></a><span class="lineno"> 2112</span>&#160;        }</div><div class="line"><a name="l02113"></a><span class="lineno"> 2113</span>&#160;        <span class="comment">// Because Constant Layer memory can not be shared, the memory must persist for the lifetime of execution,</span></div><div class="line"><a name="l02114"></a><span class="lineno"> 2114</span>&#160;        <span class="comment">// management is done separately.</span></div><div class="line"><a name="l02115"></a><span class="lineno"> 2115</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l02116"></a><span class="lineno"> 2116</span>&#160;        {</div><div class="line"><a name="l02117"></a><span class="lineno"> 2117</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02118"></a><span class="lineno"> 2118</span>&#160;        }</div><div class="line"><a name="l02119"></a><span class="lineno"> 2119</span>&#160;</div><div class="line"><a name="l02120"></a><span class="lineno"> 2120</span>&#160;        <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> backendId = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>();</div><div class="line"><a name="l02121"></a><span class="lineno"> 2121</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; outputSlot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>())</div><div class="line"><a name="l02122"></a><span class="lineno"> 2122</span>&#160;        {</div><div class="line"><a name="l02123"></a><span class="lineno"> 2123</span>&#160;            <span class="keywordflow">if</span> (!m_SupportsExternallyManagedMemory[backendId])</div><div class="line"><a name="l02124"></a><span class="lineno"> 2124</span>&#160;            {</div><div class="line"><a name="l02125"></a><span class="lineno"> 2125</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02126"></a><span class="lineno"> 2126</span>&#160;            }</div><div class="line"><a name="l02127"></a><span class="lineno"> 2127</span>&#160;</div><div class="line"><a name="l02128"></a><span class="lineno"> 2128</span>&#160;            PartialBlock partialBlock;</div><div class="line"><a name="l02129"></a><span class="lineno"> 2129</span>&#160;</div><div class="line"><a name="l02130"></a><span class="lineno"> 2130</span>&#160;            partialBlock.m_StartOfLife = timestep;</div><div class="line"><a name="l02131"></a><span class="lineno"> 2131</span>&#160;</div><div class="line"><a name="l02132"></a><span class="lineno"> 2132</span>&#160;            <span class="keywordtype">size_t</span> alignedSize = align(outputSlot.GetOutputHandler().GetTensorInfo().GetNumBytes());</div><div class="line"><a name="l02133"></a><span class="lineno"> 2133</span>&#160;            partialBlock.m_MemSize = alignedSize;</div><div class="line"><a name="l02134"></a><span class="lineno"> 2134</span>&#160;            partialBlock.m_Index = outputIndex++;</div><div class="line"><a name="l02135"></a><span class="lineno"> 2135</span>&#160;            partialBlock.m_Lifetime = outputSlot.GetNumConnections();</div><div class="line"><a name="l02136"></a><span class="lineno"> 2136</span>&#160;            partialBlock.m_BackendId = backendId;</div><div class="line"><a name="l02137"></a><span class="lineno"> 2137</span>&#160;</div><div class="line"><a name="l02138"></a><span class="lineno"> 2138</span>&#160;            <span class="keywordflow">if</span> (partialBlock.m_Lifetime == 0)</div><div class="line"><a name="l02139"></a><span class="lineno"> 2139</span>&#160;            {</div><div class="line"><a name="l02140"></a><span class="lineno"> 2140</span>&#160;                m_MemBlockMap[partialBlock.m_BackendId].emplace_back(partialBlock.m_StartOfLife,</div><div class="line"><a name="l02141"></a><span class="lineno"> 2141</span>&#160;                                                                     partialBlock.m_StartOfLife,</div><div class="line"><a name="l02142"></a><span class="lineno"> 2142</span>&#160;                                                                     partialBlock.m_MemSize,</div><div class="line"><a name="l02143"></a><span class="lineno"> 2143</span>&#160;                                                                     0,</div><div class="line"><a name="l02144"></a><span class="lineno"> 2144</span>&#160;                                                                     partialBlock.m_Index);</div><div class="line"><a name="l02145"></a><span class="lineno"> 2145</span>&#160;            }</div><div class="line"><a name="l02146"></a><span class="lineno"> 2146</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l02147"></a><span class="lineno"> 2147</span>&#160;            {</div><div class="line"><a name="l02148"></a><span class="lineno"> 2148</span>&#160;                memBlockTrackerMap[&amp;outputSlot] = partialBlock;</div><div class="line"><a name="l02149"></a><span class="lineno"> 2149</span>&#160;            }</div><div class="line"><a name="l02150"></a><span class="lineno"> 2150</span>&#160;        }</div><div class="line"><a name="l02151"></a><span class="lineno"> 2151</span>&#160;</div><div class="line"><a name="l02152"></a><span class="lineno"> 2152</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; inputSlot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>())</div><div class="line"><a name="l02153"></a><span class="lineno"> 2153</span>&#160;        {</div><div class="line"><a name="l02154"></a><span class="lineno"> 2154</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>&amp; connectedInputLayer = inputSlot.GetConnectedOutputSlot()-&gt;GetOwningLayer();</div><div class="line"><a name="l02155"></a><span class="lineno"> 2155</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4">LayerType</a>&amp; owningLayerType = connectedInputLayer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>();</div><div class="line"><a name="l02156"></a><span class="lineno"> 2156</span>&#160;</div><div class="line"><a name="l02157"></a><span class="lineno"> 2157</span>&#160;            <span class="keywordflow">if</span> (owningLayerType == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l02158"></a><span class="lineno"> 2158</span>&#160;            {</div><div class="line"><a name="l02159"></a><span class="lineno"> 2159</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02160"></a><span class="lineno"> 2160</span>&#160;            }</div><div class="line"><a name="l02161"></a><span class="lineno"> 2161</span>&#160;            <span class="keywordflow">if</span> (inputImportingEnabled &amp;&amp; owningLayerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l02162"></a><span class="lineno"> 2162</span>&#160;            {</div><div class="line"><a name="l02163"></a><span class="lineno"> 2163</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02164"></a><span class="lineno"> 2164</span>&#160;            }</div><div class="line"><a name="l02165"></a><span class="lineno"> 2165</span>&#160;</div><div class="line"><a name="l02166"></a><span class="lineno"> 2166</span>&#160;            <span class="keyword">auto</span> outputSlot = inputSlot.GetConnectedOutputSlot();</div><div class="line"><a name="l02167"></a><span class="lineno"> 2167</span>&#160;</div><div class="line"><a name="l02168"></a><span class="lineno"> 2168</span>&#160;            PartialBlock&amp; partialBlock = memBlockTrackerMap.at(outputSlot);</div><div class="line"><a name="l02169"></a><span class="lineno"> 2169</span>&#160;</div><div class="line"><a name="l02170"></a><span class="lineno"> 2170</span>&#160;            <span class="keyword">auto</span>&amp; lifetime = partialBlock.m_Lifetime;</div><div class="line"><a name="l02171"></a><span class="lineno"> 2171</span>&#160;            --lifetime;</div><div class="line"><a name="l02172"></a><span class="lineno"> 2172</span>&#160;</div><div class="line"><a name="l02173"></a><span class="lineno"> 2173</span>&#160;            <span class="keywordflow">if</span> (lifetime == 0)</div><div class="line"><a name="l02174"></a><span class="lineno"> 2174</span>&#160;            {</div><div class="line"><a name="l02175"></a><span class="lineno"> 2175</span>&#160;                m_MemBlockMap[partialBlock.m_BackendId].emplace_back(partialBlock.m_StartOfLife,</div><div class="line"><a name="l02176"></a><span class="lineno"> 2176</span>&#160;                                                                     timestep,</div><div class="line"><a name="l02177"></a><span class="lineno"> 2177</span>&#160;                                                                     partialBlock.m_MemSize,</div><div class="line"><a name="l02178"></a><span class="lineno"> 2178</span>&#160;                                                                     0,</div><div class="line"><a name="l02179"></a><span class="lineno"> 2179</span>&#160;                                                                     partialBlock.m_Index);</div><div class="line"><a name="l02180"></a><span class="lineno"> 2180</span>&#160;            }</div><div class="line"><a name="l02181"></a><span class="lineno"> 2181</span>&#160;        }</div><div class="line"><a name="l02182"></a><span class="lineno"> 2182</span>&#160;        ++timestep;</div><div class="line"><a name="l02183"></a><span class="lineno"> 2183</span>&#160;    }</div><div class="line"><a name="l02184"></a><span class="lineno"> 2184</span>&#160;}</div><div class="line"><a name="l02185"></a><span class="lineno"> 2185</span>&#160;</div><div class="line"><a name="l02186"></a><span class="lineno"> 2186</span>&#160;<span class="keywordtype">void</span> LoadedNetwork::CreateMemoryProfile()</div><div class="line"><a name="l02187"></a><span class="lineno"> 2187</span>&#160;{</div><div class="line"><a name="l02188"></a><span class="lineno"> 2188</span>&#160;    <span class="comment">// Finds the first TensorHandle ancestor of a SubTensorHandle. If the ITensorHandle provided</span></div><div class="line"><a name="l02189"></a><span class="lineno"> 2189</span>&#160;    <span class="comment">// is a TensorHandle, the function just returns it</span></div><div class="line"><a name="l02190"></a><span class="lineno"> 2190</span>&#160;    <span class="keyword">auto</span> TraceSubTensorHandleAncestry = [](<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* <span class="keyword">const</span> subTensorHandle)</div><div class="line"><a name="l02191"></a><span class="lineno"> 2191</span>&#160;    {</div><div class="line"><a name="l02192"></a><span class="lineno"> 2192</span>&#160;        <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* ancestor = subTensorHandle;</div><div class="line"><a name="l02193"></a><span class="lineno"> 2193</span>&#160;        <span class="keywordflow">while</span> (ancestor &amp;&amp; ancestor-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a437893b8dcf58a0b68b70e1ad7933be6">GetParent</a>())</div><div class="line"><a name="l02194"></a><span class="lineno"> 2194</span>&#160;        {</div><div class="line"><a name="l02195"></a><span class="lineno"> 2195</span>&#160;            ancestor = ancestor-&gt;<a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml#a437893b8dcf58a0b68b70e1ad7933be6">GetParent</a>();</div><div class="line"><a name="l02196"></a><span class="lineno"> 2196</span>&#160;        }</div><div class="line"><a name="l02197"></a><span class="lineno"> 2197</span>&#160;        <span class="keywordflow">return</span> ancestor;</div><div class="line"><a name="l02198"></a><span class="lineno"> 2198</span>&#160;    };</div><div class="line"><a name="l02199"></a><span class="lineno"> 2199</span>&#160;</div><div class="line"><a name="l02200"></a><span class="lineno"> 2200</span>&#160;    <span class="keyword">struct </span>PartialBlock</div><div class="line"><a name="l02201"></a><span class="lineno"> 2201</span>&#160;    {</div><div class="line"><a name="l02202"></a><span class="lineno"> 2202</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_StartOfLife;</div><div class="line"><a name="l02203"></a><span class="lineno"> 2203</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_Lifetime;</div><div class="line"><a name="l02204"></a><span class="lineno"> 2204</span>&#160;</div><div class="line"><a name="l02205"></a><span class="lineno"> 2205</span>&#160;        <span class="keywordtype">size_t</span> m_MemSize;</div><div class="line"><a name="l02206"></a><span class="lineno"> 2206</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m_Index;</div><div class="line"><a name="l02207"></a><span class="lineno"> 2207</span>&#160;</div><div class="line"><a name="l02208"></a><span class="lineno"> 2208</span>&#160;        <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> m_BackendId;</div><div class="line"><a name="l02209"></a><span class="lineno"> 2209</span>&#160;    };</div><div class="line"><a name="l02210"></a><span class="lineno"> 2210</span>&#160;</div><div class="line"><a name="l02211"></a><span class="lineno"> 2211</span>&#160;    <span class="keyword">auto</span> align = [](<span class="keywordtype">size_t</span> numToAlign)</div><div class="line"><a name="l02212"></a><span class="lineno"> 2212</span>&#160;    {</div><div class="line"><a name="l02213"></a><span class="lineno"> 2213</span>&#160;        <span class="keyword">const</span> <span class="keywordtype">size_t</span> alignment = <span class="keyword">sizeof</span>(float);</div><div class="line"><a name="l02214"></a><span class="lineno"> 2214</span>&#160;        <span class="keywordflow">return</span> ((numToAlign + alignment - 1) / alignment) * alignment;</div><div class="line"><a name="l02215"></a><span class="lineno"> 2215</span>&#160;    };</div><div class="line"><a name="l02216"></a><span class="lineno"> 2216</span>&#160;</div><div class="line"><a name="l02217"></a><span class="lineno"> 2217</span>&#160;    std::unordered_map&lt;ITensorHandle*, PartialBlock&gt; memBlockTrackerMap;</div><div class="line"><a name="l02218"></a><span class="lineno"> 2218</span>&#160;</div><div class="line"><a name="l02219"></a><span class="lineno"> 2219</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> inputImportingEnabled = m_NetworkProperties.m_InputSource != <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>;</div><div class="line"><a name="l02220"></a><span class="lineno"> 2220</span>&#160;    <span class="keyword">const</span> <span class="keywordtype">bool</span> outputImportingEnabled = m_NetworkProperties.m_OutputSource != <a class="code" href="namespacearmnn.xhtml#ae2f04a162585c0a5222a537efd5456aeaec0fc0100c4fc1ce4eea230c3dc10360">MemorySource::Undefined</a>;</div><div class="line"><a name="l02221"></a><span class="lineno"> 2221</span>&#160;</div><div class="line"><a name="l02222"></a><span class="lineno"> 2222</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> timestep = 0;</div><div class="line"><a name="l02223"></a><span class="lineno"> 2223</span>&#160;    <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputIndex = 0;</div><div class="line"><a name="l02224"></a><span class="lineno"> 2224</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="l02225"></a><span class="lineno"> 2225</span>&#160;</div><div class="line"><a name="l02226"></a><span class="lineno"> 2226</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp;&amp; layer : order)</div><div class="line"><a name="l02227"></a><span class="lineno"> 2227</span>&#160;    {</div><div class="line"><a name="l02228"></a><span class="lineno"> 2228</span>&#160;        <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4">LayerType</a>&amp; layerType = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>();</div><div class="line"><a name="l02229"></a><span class="lineno"> 2229</span>&#160;        <span class="comment">// Don&#39;t manage memory if importing.</span></div><div class="line"><a name="l02230"></a><span class="lineno"> 2230</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a> &amp;&amp; inputImportingEnabled)</div><div class="line"><a name="l02231"></a><span class="lineno"> 2231</span>&#160;        {</div><div class="line"><a name="l02232"></a><span class="lineno"> 2232</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02233"></a><span class="lineno"> 2233</span>&#160;        }</div><div class="line"><a name="l02234"></a><span class="lineno"> 2234</span>&#160;        <span class="comment">// Don&#39;t manage memory if importing.</span></div><div class="line"><a name="l02235"></a><span class="lineno"> 2235</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a29c2c02a361c9d7028472e5d92cd4a54">LayerType::Output</a> &amp;&amp; outputImportingEnabled</div><div class="line"><a name="l02236"></a><span class="lineno"> 2236</span>&#160;            &amp;&amp; layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">GetInputSlot</a>(0).<a class="code" href="classarmnn_1_1_input_slot.xhtml#a9effd325a6d512a3f8ff4bd207d53255">GetConnectedOutputSlot</a>()-&gt;<a class="code" href="classarmnn_1_1_output_slot.xhtml#a25b0119c02aece1d341b99953d169c0f">GetNumConnections</a>() == 1)</div><div class="line"><a name="l02237"></a><span class="lineno"> 2237</span>&#160;        {</div><div class="line"><a name="l02238"></a><span class="lineno"> 2238</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02239"></a><span class="lineno"> 2239</span>&#160;        }</div><div class="line"><a name="l02240"></a><span class="lineno"> 2240</span>&#160;        <span class="comment">// Because Constant Layer memory can not be shared, the memory must persist for the lifetime of execution,</span></div><div class="line"><a name="l02241"></a><span class="lineno"> 2241</span>&#160;        <span class="comment">// management is done separately.</span></div><div class="line"><a name="l02242"></a><span class="lineno"> 2242</span>&#160;        <span class="keywordflow">if</span> (layerType == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l02243"></a><span class="lineno"> 2243</span>&#160;        {</div><div class="line"><a name="l02244"></a><span class="lineno"> 2244</span>&#160;            <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02245"></a><span class="lineno"> 2245</span>&#160;        }</div><div class="line"><a name="l02246"></a><span class="lineno"> 2246</span>&#160;</div><div class="line"><a name="l02247"></a><span class="lineno"> 2247</span>&#160;        <a class="code" href="classarmnn_1_1_backend_id.xhtml">BackendId</a> backendId = layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>();</div><div class="line"><a name="l02248"></a><span class="lineno"> 2248</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; outputSlot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#a98cdff4e0b45f4c80bfcedaf926e16e0">GetOutputSlots</a>())</div><div class="line"><a name="l02249"></a><span class="lineno"> 2249</span>&#160;        {</div><div class="line"><a name="l02250"></a><span class="lineno"> 2250</span>&#160;            <span class="keywordflow">if</span> (!m_SupportsExternallyManagedMemory[backendId])</div><div class="line"><a name="l02251"></a><span class="lineno"> 2251</span>&#160;            {</div><div class="line"><a name="l02252"></a><span class="lineno"> 2252</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02253"></a><span class="lineno"> 2253</span>&#160;            }</div><div class="line"><a name="l02254"></a><span class="lineno"> 2254</span>&#160;</div><div class="line"><a name="l02255"></a><span class="lineno"> 2255</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = outputSlot.GetOutputHandler().GetData();</div><div class="line"><a name="l02256"></a><span class="lineno"> 2256</span>&#160;            tensorHandle = TraceSubTensorHandleAncestry(tensorHandle);</div><div class="line"><a name="l02257"></a><span class="lineno"> 2257</span>&#160;</div><div class="line"><a name="l02258"></a><span class="lineno"> 2258</span>&#160;            <span class="keywordflow">if</span> (memBlockTrackerMap.find(tensorHandle) == memBlockTrackerMap.end())</div><div class="line"><a name="l02259"></a><span class="lineno"> 2259</span>&#160;            {</div><div class="line"><a name="l02260"></a><span class="lineno"> 2260</span>&#160;                PartialBlock partialBlock;</div><div class="line"><a name="l02261"></a><span class="lineno"> 2261</span>&#160;</div><div class="line"><a name="l02262"></a><span class="lineno"> 2262</span>&#160;                partialBlock.m_StartOfLife = timestep;</div><div class="line"><a name="l02263"></a><span class="lineno"> 2263</span>&#160;</div><div class="line"><a name="l02264"></a><span class="lineno"> 2264</span>&#160;                <span class="keywordtype">size_t</span> alignedSize = align(outputSlot.GetOutputHandler().GetTensorInfo().GetNumBytes());</div><div class="line"><a name="l02265"></a><span class="lineno"> 2265</span>&#160;                partialBlock.m_MemSize = alignedSize;</div><div class="line"><a name="l02266"></a><span class="lineno"> 2266</span>&#160;                partialBlock.m_Index = outputIndex++;</div><div class="line"><a name="l02267"></a><span class="lineno"> 2267</span>&#160;                partialBlock.m_Lifetime = outputSlot.GetNumConnections();</div><div class="line"><a name="l02268"></a><span class="lineno"> 2268</span>&#160;                partialBlock.m_BackendId = backendId;</div><div class="line"><a name="l02269"></a><span class="lineno"> 2269</span>&#160;</div><div class="line"><a name="l02270"></a><span class="lineno"> 2270</span>&#160;                <span class="keywordflow">if</span> (partialBlock.m_Lifetime == 0)</div><div class="line"><a name="l02271"></a><span class="lineno"> 2271</span>&#160;                {</div><div class="line"><a name="l02272"></a><span class="lineno"> 2272</span>&#160;                    m_MemBlockMap[partialBlock.m_BackendId].emplace_back(partialBlock.m_StartOfLife,</div><div class="line"><a name="l02273"></a><span class="lineno"> 2273</span>&#160;                                                                         partialBlock.m_StartOfLife,</div><div class="line"><a name="l02274"></a><span class="lineno"> 2274</span>&#160;                                                                         partialBlock.m_MemSize,</div><div class="line"><a name="l02275"></a><span class="lineno"> 2275</span>&#160;                                                                         0,</div><div class="line"><a name="l02276"></a><span class="lineno"> 2276</span>&#160;                                                                         partialBlock.m_Index);</div><div class="line"><a name="l02277"></a><span class="lineno"> 2277</span>&#160;                }</div><div class="line"><a name="l02278"></a><span class="lineno"> 2278</span>&#160;                <span class="keywordflow">else</span></div><div class="line"><a name="l02279"></a><span class="lineno"> 2279</span>&#160;                {</div><div class="line"><a name="l02280"></a><span class="lineno"> 2280</span>&#160;                    memBlockTrackerMap[tensorHandle] = partialBlock;</div><div class="line"><a name="l02281"></a><span class="lineno"> 2281</span>&#160;                }</div><div class="line"><a name="l02282"></a><span class="lineno"> 2282</span>&#160;                m_Tensorhandles.push_back(tensorHandle);</div><div class="line"><a name="l02283"></a><span class="lineno"> 2283</span>&#160;</div><div class="line"><a name="l02284"></a><span class="lineno"> 2284</span>&#160;            }</div><div class="line"><a name="l02285"></a><span class="lineno"> 2285</span>&#160;            <span class="keywordflow">else</span></div><div class="line"><a name="l02286"></a><span class="lineno"> 2286</span>&#160;            {</div><div class="line"><a name="l02287"></a><span class="lineno"> 2287</span>&#160;                memBlockTrackerMap.at(tensorHandle).m_Lifetime += outputSlot.GetNumConnections();</div><div class="line"><a name="l02288"></a><span class="lineno"> 2288</span>&#160;            }</div><div class="line"><a name="l02289"></a><span class="lineno"> 2289</span>&#160;        }</div><div class="line"><a name="l02290"></a><span class="lineno"> 2290</span>&#160;</div><div class="line"><a name="l02291"></a><span class="lineno"> 2291</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; inputSlot : layer-&gt;<a class="code" href="classarmnn_1_1_layer.xhtml#af5f530544d09a44d726f24702b67b35b">GetInputSlots</a>())</div><div class="line"><a name="l02292"></a><span class="lineno"> 2292</span>&#160;        {</div><div class="line"><a name="l02293"></a><span class="lineno"> 2293</span>&#160;            <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_layer.xhtml">Layer</a>&amp; connectedInputLayer = inputSlot.GetConnectedOutputSlot()-&gt;GetOwningLayer();</div><div class="line"><a name="l02294"></a><span class="lineno"> 2294</span>&#160;            <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4">LayerType</a>&amp; owningLayerType = connectedInputLayer.<a class="code" href="classarmnn_1_1_layer.xhtml#ad8e15c530c929ab823d89ae9fd2d3f11">GetType</a>();</div><div class="line"><a name="l02295"></a><span class="lineno"> 2295</span>&#160;</div><div class="line"><a name="l02296"></a><span class="lineno"> 2296</span>&#160;            <span class="keywordflow">if</span> (owningLayerType == <a class="code" href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">LayerType::Constant</a>)</div><div class="line"><a name="l02297"></a><span class="lineno"> 2297</span>&#160;            {</div><div class="line"><a name="l02298"></a><span class="lineno"> 2298</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02299"></a><span class="lineno"> 2299</span>&#160;            }</div><div class="line"><a name="l02300"></a><span class="lineno"> 2300</span>&#160;            <span class="keywordflow">if</span> (inputImportingEnabled &amp;&amp; owningLayerType == <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4a324118a6721dd6b8a9b9f4e327df2bf5">LayerType::Input</a>)</div><div class="line"><a name="l02301"></a><span class="lineno"> 2301</span>&#160;            {</div><div class="line"><a name="l02302"></a><span class="lineno"> 2302</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02303"></a><span class="lineno"> 2303</span>&#160;            }</div><div class="line"><a name="l02304"></a><span class="lineno"> 2304</span>&#160;            <span class="keywordflow">if</span> (!m_SupportsExternallyManagedMemory[connectedInputLayer.<a class="code" href="classarmnn_1_1_layer.xhtml#afdb1d37740e7a083b625d669588b6a0e">GetBackendId</a>()])</div><div class="line"><a name="l02305"></a><span class="lineno"> 2305</span>&#160;            {</div><div class="line"><a name="l02306"></a><span class="lineno"> 2306</span>&#160;                <span class="keywordflow">continue</span>;</div><div class="line"><a name="l02307"></a><span class="lineno"> 2307</span>&#160;            }</div><div class="line"><a name="l02308"></a><span class="lineno"> 2308</span>&#160;</div><div class="line"><a name="l02309"></a><span class="lineno"> 2309</span>&#160;            <span class="keyword">auto</span> outputSlot = inputSlot.GetConnectedOutputSlot();</div><div class="line"><a name="l02310"></a><span class="lineno"> 2310</span>&#160;</div><div class="line"><a name="l02311"></a><span class="lineno"> 2311</span>&#160;            <a class="code" href="classarmnn_1_1_i_tensor_handle.xhtml">ITensorHandle</a>* tensorHandle = outputSlot-&gt;GetOutputHandler().GetData();</div><div class="line"><a name="l02312"></a><span class="lineno"> 2312</span>&#160;            tensorHandle = TraceSubTensorHandleAncestry(tensorHandle);</div><div class="line"><a name="l02313"></a><span class="lineno"> 2313</span>&#160;</div><div class="line"><a name="l02314"></a><span class="lineno"> 2314</span>&#160;            PartialBlock&amp; partialBlock = memBlockTrackerMap.at(tensorHandle);</div><div class="line"><a name="l02315"></a><span class="lineno"> 2315</span>&#160;</div><div class="line"><a name="l02316"></a><span class="lineno"> 2316</span>&#160;            <span class="keyword">auto</span>&amp; lifetime = partialBlock.m_Lifetime;</div><div class="line"><a name="l02317"></a><span class="lineno"> 2317</span>&#160;            --lifetime;</div><div class="line"><a name="l02318"></a><span class="lineno"> 2318</span>&#160;</div><div class="line"><a name="l02319"></a><span class="lineno"> 2319</span>&#160;            <span class="keywordflow">if</span> (lifetime == 0)</div><div class="line"><a name="l02320"></a><span class="lineno"> 2320</span>&#160;            {</div><div class="line"><a name="l02321"></a><span class="lineno"> 2321</span>&#160;                m_MemBlockMap[partialBlock.m_BackendId].emplace_back(partialBlock.m_StartOfLife,</div><div class="line"><a name="l02322"></a><span class="lineno"> 2322</span>&#160;                                                                     timestep,</div><div class="line"><a name="l02323"></a><span class="lineno"> 2323</span>&#160;                                                                     partialBlock.m_MemSize,</div><div class="line"><a name="l02324"></a><span class="lineno"> 2324</span>&#160;                                                                     0,</div><div class="line"><a name="l02325"></a><span class="lineno"> 2325</span>&#160;                                                                     partialBlock.m_Index);</div><div class="line"><a name="l02326"></a><span class="lineno"> 2326</span>&#160;            }</div><div class="line"><a name="l02327"></a><span class="lineno"> 2327</span>&#160;        }</div><div class="line"><a name="l02328"></a><span class="lineno"> 2328</span>&#160;        ++timestep;</div><div class="line"><a name="l02329"></a><span class="lineno"> 2329</span>&#160;    }</div><div class="line"><a name="l02330"></a><span class="lineno"> 2330</span>&#160;</div><div class="line"><a name="l02331"></a><span class="lineno"> 2331</span>&#160;}</div><div class="line"><a name="l02332"></a><span class="lineno"> 2332</span>&#160;</div><div class="line"><a name="l02333"></a><span class="lineno"> 2333</span>&#160;std::unique_ptr&lt;MemoryManager&gt; LoadedNetwork::CreateExternalMemoryManger(</div><div class="line"><a name="l02334"></a><span class="lineno"> 2334</span>&#160;        std::vector&lt;std::pair&lt;std::shared_ptr&lt;TensorMemory&gt;, <a class="code" href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">MemorySource</a>&gt;&gt;&amp; tensorMemoryVec)</div><div class="line"><a name="l02335"></a><span class="lineno"> 2335</span>&#160;{</div><div class="line"><a name="l02336"></a><span class="lineno"> 2336</span>&#160;    std::unique_ptr&lt;MemoryManager&gt; memoryManager = std::make_unique&lt;MemoryManager&gt;();</div><div class="line"><a name="l02337"></a><span class="lineno"> 2337</span>&#160;    <span class="keyword">auto</span> allocatorMap = <a class="code" href="namespacearmnn.xhtml#ac2807505b850738bc8a1991ce669dd47">BackendRegistryInstance</a>().<a class="code" href="classarmnn_1_1_backend_registry.xhtml#a6dea5df9078a3e9b44176175043237f6">GetAllocators</a>();</div><div class="line"><a name="l02338"></a><span class="lineno"> 2338</span>&#160;</div><div class="line"><a name="l02339"></a><span class="lineno"> 2339</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; backend : m_MemBinMap)</div><div class="line"><a name="l02340"></a><span class="lineno"> 2340</span>&#160;    {</div><div class="line"><a name="l02341"></a><span class="lineno"> 2341</span>&#160;        std::vector&lt;BufferStorage&gt; bufferStorageVec;</div><div class="line"><a name="l02342"></a><span class="lineno"> 2342</span>&#160;</div><div class="line"><a name="l02343"></a><span class="lineno"> 2343</span>&#160;        std::shared_ptr&lt;ICustomAllocator&gt; backendAllocator;</div><div class="line"><a name="l02344"></a><span class="lineno"> 2344</span>&#160;        <span class="keywordflow">if</span> (allocatorMap.find(backend.first) != allocatorMap.end())</div><div class="line"><a name="l02345"></a><span class="lineno"> 2345</span>&#160;        {</div><div class="line"><a name="l02346"></a><span class="lineno"> 2346</span>&#160;            backendAllocator = allocatorMap[backend.first];</div><div class="line"><a name="l02347"></a><span class="lineno"> 2347</span>&#160;        }</div><div class="line"><a name="l02348"></a><span class="lineno"> 2348</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l02349"></a><span class="lineno"> 2349</span>&#160;        {</div><div class="line"><a name="l02350"></a><span class="lineno"> 2350</span>&#160;            backendAllocator = m_Backends[backend.first]-&gt;GetDefaultAllocator();</div><div class="line"><a name="l02351"></a><span class="lineno"> 2351</span>&#160;        }</div><div class="line"><a name="l02352"></a><span class="lineno"> 2352</span>&#160;</div><div class="line"><a name="l02353"></a><span class="lineno"> 2353</span>&#160;        <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; memBin : backend.second)</div><div class="line"><a name="l02354"></a><span class="lineno"> 2354</span>&#160;        {</div><div class="line"><a name="l02355"></a><span class="lineno"> 2355</span>&#160;            <a class="code" href="structarmnn_1_1_buffer_storage.xhtml">BufferStorage</a> bufferStorage;</div><div class="line"><a name="l02356"></a><span class="lineno"> 2356</span>&#160;            bufferStorage.<a class="code" href="structarmnn_1_1_buffer_storage.xhtml#afcd55b6ce066b6a3ddfcbbc1c483213f">m_BufferSize</a> = memBin.m_MemSize;</div><div class="line"><a name="l02357"></a><span class="lineno"> 2357</span>&#160;            bufferStorage.<a class="code" href="structarmnn_1_1_buffer_storage.xhtml#a0d6a6b862d9630effce75d8ca18254ba">m_TensorMemoryVector</a>.reserve(memBin.m_MemBlocks.size());</div><div class="line"><a name="l02358"></a><span class="lineno"> 2358</span>&#160;</div><div class="line"><a name="l02359"></a><span class="lineno"> 2359</span>&#160;            <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; memBlock : memBin.m_MemBlocks)</div><div class="line"><a name="l02360"></a><span class="lineno"> 2360</span>&#160;            {</div><div class="line"><a name="l02361"></a><span class="lineno"> 2361</span>&#160;                <span class="keyword">auto</span> tensorMemory = std::make_shared&lt;TensorMemory&gt;(<a class="code" href="structarmnn_1_1_tensor_memory.xhtml">TensorMemory</a>{memBlock.<a class="code" href="structarmnn_1_1_tensor_memory.xhtml#a7fa2df31ffac52484e0612a31fd4256d">m_Offset</a>, memBlock.m_Index});</div><div class="line"><a name="l02362"></a><span class="lineno"> 2362</span>&#160;</div><div class="line"><a name="l02363"></a><span class="lineno"> 2363</span>&#160;                tensorMemoryVec.emplace_back(tensorMemory, backendAllocator-&gt;GetMemorySourceType());</div><div class="line"><a name="l02364"></a><span class="lineno"> 2364</span>&#160;                bufferStorage.<a class="code" href="structarmnn_1_1_buffer_storage.xhtml#a0d6a6b862d9630effce75d8ca18254ba">m_TensorMemoryVector</a>.emplace_back(tensorMemory);</div><div class="line"><a name="l02365"></a><span class="lineno"> 2365</span>&#160;            }</div><div class="line"><a name="l02366"></a><span class="lineno"> 2366</span>&#160;</div><div class="line"><a name="l02367"></a><span class="lineno"> 2367</span>&#160;            bufferStorageVec.emplace_back(std::move(bufferStorage));</div><div class="line"><a name="l02368"></a><span class="lineno"> 2368</span>&#160;        }</div><div class="line"><a name="l02369"></a><span class="lineno"> 2369</span>&#160;</div><div class="line"><a name="l02370"></a><span class="lineno"> 2370</span>&#160;        memoryManager-&gt;StoreMemToAllocate(bufferStorageVec, backendAllocator, 4);</div><div class="line"><a name="l02371"></a><span class="lineno"> 2371</span>&#160;    }</div><div class="line"><a name="l02372"></a><span class="lineno"> 2372</span>&#160;</div><div class="line"><a name="l02373"></a><span class="lineno"> 2373</span>&#160;    <span class="keywordflow">return</span> memoryManager;</div><div class="line"><a name="l02374"></a><span class="lineno"> 2374</span>&#160;}</div><div class="line"><a name="l02375"></a><span class="lineno"> 2375</span>&#160;</div><div class="line"><a name="l02376"></a><span class="lineno"> 2376</span>&#160;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> LoadedNetwork::ValidateImportedInputID(<a class="code" href="namespacearmnn.xhtml#a1c5ec805688cb558465a82a8d9f56a90">ImportedInputId</a> <span class="keywordtype">id</span>)</div><div class="line"><a name="l02377"></a><span class="lineno"> 2377</span>&#160;{</div><div class="line"><a name="l02378"></a><span class="lineno"> 2378</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l02379"></a><span class="lineno"> 2379</span>&#160;    {</div><div class="line"><a name="l02380"></a><span class="lineno"> 2380</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span>&amp; importedTensorHandlePin = m_PreImportedInputHandles.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l02381"></a><span class="lineno"> 2381</span>&#160;        <span class="keywordflow">if</span> (!importedTensorHandlePin.m_TensorHandle)</div><div class="line"><a name="l02382"></a><span class="lineno"> 2382</span>&#160;        {</div><div class="line"><a name="l02383"></a><span class="lineno"> 2383</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;LoadedNetwork::Execute:&quot;</span></div><div class="line"><a name="l02384"></a><span class="lineno"> 2384</span>&#160;                                                       <span class="stringliteral">&quot;PreImportedInput: {} has been deleted&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l02385"></a><span class="lineno"> 2385</span>&#160;        }</div><div class="line"><a name="l02386"></a><span class="lineno"> 2386</span>&#160;        <span class="keywordflow">return</span> importedTensorHandlePin.m_LayerBindingId;</div><div class="line"><a name="l02387"></a><span class="lineno"> 2387</span>&#160;    }</div><div class="line"><a name="l02388"></a><span class="lineno"> 2388</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::out_of_range&amp;)</div><div class="line"><a name="l02389"></a><span class="lineno"> 2389</span>&#160;    {</div><div class="line"><a name="l02390"></a><span class="lineno"> 2390</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;LoadedNetwork::Execute: Unknown ImportedInputId: {}&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l02391"></a><span class="lineno"> 2391</span>&#160;    }</div><div class="line"><a name="l02392"></a><span class="lineno"> 2392</span>&#160;}</div><div class="line"><a name="l02393"></a><span class="lineno"> 2393</span>&#160;</div><div class="line"><a name="l02394"></a><span class="lineno"> 2394</span>&#160;<a class="code" href="namespacearmnn.xhtml#ab8cf8f9fb6792e654c2d8d8382f6f01b">LayerBindingId</a> LoadedNetwork::ValidateImportedOutputID(<a class="code" href="namespacearmnn.xhtml#ac68a434f0e78e33726bfb22a39ec813f">ImportedOutputId</a> <span class="keywordtype">id</span>)</div><div class="line"><a name="l02395"></a><span class="lineno"> 2395</span>&#160;{</div><div class="line"><a name="l02396"></a><span class="lineno"> 2396</span>&#160;    <span class="keywordflow">try</span></div><div class="line"><a name="l02397"></a><span class="lineno"> 2397</span>&#160;    {</div><div class="line"><a name="l02398"></a><span class="lineno"> 2398</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span>&amp; importedTensorHandlePin = m_PreImportedOutputHandles.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l02399"></a><span class="lineno"> 2399</span>&#160;        <span class="keywordflow">if</span> (!importedTensorHandlePin.m_TensorHandle)</div><div class="line"><a name="l02400"></a><span class="lineno"> 2400</span>&#160;        {</div><div class="line"><a name="l02401"></a><span class="lineno"> 2401</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;LoadedNetwork::Execute: &quot;</span></div><div class="line"><a name="l02402"></a><span class="lineno"> 2402</span>&#160;                                                       <span class="stringliteral">&quot;PreImportedOutput: {} has been deleted&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l02403"></a><span class="lineno"> 2403</span>&#160;        }</div><div class="line"><a name="l02404"></a><span class="lineno"> 2404</span>&#160;        <span class="keywordflow">return</span> importedTensorHandlePin.m_LayerBindingId;</div><div class="line"><a name="l02405"></a><span class="lineno"> 2405</span>&#160;    }</div><div class="line"><a name="l02406"></a><span class="lineno"> 2406</span>&#160;    <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::out_of_range&amp;)</div><div class="line"><a name="l02407"></a><span class="lineno"> 2407</span>&#160;    {</div><div class="line"><a name="l02408"></a><span class="lineno"> 2408</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;LoadedNetwork::Execute: Unknown ImportedOutputId: {}&quot;</span>, <span class="keywordtype">id</span>));</div><div class="line"><a name="l02409"></a><span class="lineno"> 2409</span>&#160;    }</div><div class="line"><a name="l02410"></a><span class="lineno"> 2410</span>&#160;}</div><div class="line"><a name="l02411"></a><span class="lineno"> 2411</span>&#160;</div><div class="line"><a name="l02412"></a><span class="lineno"> 2412</span>&#160;}</div><div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a95b1c23f6f296a0c39383bef20fdd46a"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a95b1c23f6f296a0c39383bef20fdd46a">armnn::LoadedNetwork::Execute</a></div><div class="ttdeci">Status Execute(const InputTensors &amp;inputTensors, const OutputTensors &amp;outputTensors, IWorkingMemHandle &amp;workingMemHandle, std::vector&lt; ImportedInputId &gt; preImportedInputs={}, std::vector&lt; ImportedOutputId &gt; preImportedOutputs={})</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#l01599">LoadedNetwork.cpp:1599</a></div></div>
<div class="ttc" id="structarmnn_1_1_buffer_storage_xhtml_a0d6a6b862d9630effce75d8ca18254ba"><div class="ttname"><a href="structarmnn_1_1_buffer_storage.xhtml#a0d6a6b862d9630effce75d8ca18254ba">armnn::BufferStorage::m_TensorMemoryVector</a></div><div class="ttdeci">std::vector&lt; std::shared_ptr&lt; TensorMemory &gt; &gt; m_TensorMemoryVector</div><div class="ttdoc">Vector of pointer to . </div><div class="ttdef"><b>Definition:</b> <a href="_memory_manager_8hpp_source.xhtml#l00032">MemoryManager.hpp:32</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#l01821">LoadedNetwork.cpp:1821</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_abd839f0f103c1ae19a4b38d59b869108"><div class="ttname"><a href="namespacearmnn.xhtml#abd839f0f103c1ae19a4b38d59b869108">armnn::HasCapability</a></div><div class="ttdeci">bool HasCapability(const std::string &amp;name, const BackendCapabilities &amp;capabilities)</div><div class="ttdoc">Convenience function to check if a capability exists in a BackendCapabilites struct. </div><div class="ttdef"><b>Definition:</b> <a href="_backend_helper_8cpp_source.xhtml#l00058">BackendHelper.cpp:58</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="structarmnn_1_1_graph_1_1_input_layers_accessor_xhtml_af6f3e2b0ee65cd102e20c9f734160b90"><div class="ttname"><a href="structarmnn_1_1_graph_1_1_input_layers_accessor.xhtml#af6f3e2b0ee65cd102e20c9f734160b90">armnn::Graph::InputLayersAccessor::begin</a></div><div class="ttdeci">ConstIteratorInputs begin() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00065">Graph.hpp:65</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_a72ca1cf423bda4b0a9ffb789627126de"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#a72ca1cf423bda4b0a9ffb789627126de">armnn::IBackendInternal::IWorkloadFactoryPtr</a></div><div class="ttdeci">std::unique_ptr&lt; IWorkloadFactory &gt; IWorkloadFactoryPtr</div><div class="ttdef"><b>Definition:</b> <a href="_i_backend_internal_8hpp_source.xhtml#l00086">IBackendInternal.hpp:86</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#l00318">Layer.hpp:318</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="_i_backend_internal_8hpp_source.xhtml#l00074">IBackendInternal.hpp:74</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#l00568">Profiling.cpp:568</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_i_backend_internal_xhtml_a0fe4c12c8f1f0722d2a91f61c02a687a"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#a0fe4c12c8f1f0722d2a91f61c02a687a">armnn::IBackendInternal::CreateMemoryManager</a></div><div class="ttdeci">virtual IMemoryManagerUniquePtr CreateMemoryManager() const</div><div class="ttdef"><b>Definition:</b> <a href="_i_backend_internal_8cpp_source.xhtml#l00012">IBackendInternal.cpp:12</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="include_2armnn_2backends_2_workload_factory_8hpp_source.xhtml#l00022">WorkloadFactory.hpp:22</a></div></div>
<div class="ttc" id="classarmnn_1_1_bindable_layer_xhtml_a7352bd7421ce8b5e86281b995848ed82"><div class="ttname"><a href="classarmnn_1_1_bindable_layer.xhtml#a7352bd7421ce8b5e86281b995848ed82">armnn::BindableLayer::GetBindingId</a></div><div class="ttdeci">LayerBindingId GetBindingId() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00455">Layer.hpp:455</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#l00056">IRuntime.hpp:56</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#l01293">LoadedNetwork.cpp:1293</a></div></div>
<div class="ttc" id="classarmnn_1_1_backend_registry_xhtml_a8a7a14a6f1f1078e1b9d31c60d09e007"><div class="ttname"><a href="classarmnn_1_1_backend_registry.xhtml#a8a7a14a6f1f1078e1b9d31c60d09e007">armnn::BackendRegistry::GetMemoryOptimizerStrategies</a></div><div class="ttdeci">MemoryOptimizerStrategiesMapRef GetMemoryOptimizerStrategies()</div><div class="ttdef"><b>Definition:</b> <a href="_backend_registry_8cpp_source.xhtml#l00148">BackendRegistry.cpp:148</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#l01243">ArmnnSchema_generated.h:1243</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ac68a434f0e78e33726bfb22a39ec813f"><div class="ttname"><a href="namespacearmnn.xhtml#ac68a434f0e78e33726bfb22a39ec813f">armnn::ImportedOutputId</a></div><div class="ttdeci">unsigned int ImportedOutputId</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00279">Types.hpp:279</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#l00442">Layer.hpp:442</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#l00088">WorkingMemHandle.hpp:88</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_backend_capability_exception_xhtml"><div class="ttname"><a href="classarmnn_1_1_backend_capability_exception.xhtml">armnn::BackendCapabilityException</a></div><div class="ttdef"><b>Definition:</b> <a href="_exceptions_8hpp_source.xhtml#l00158">Exceptions.hpp:158</a></div></div>
<div class="ttc" id="structarmnn_1_1_tensor_memory_xhtml_a7fa2df31ffac52484e0612a31fd4256d"><div class="ttname"><a href="structarmnn_1_1_tensor_memory.xhtml#a7fa2df31ffac52484e0612a31fd4256d">armnn::TensorMemory::m_Offset</a></div><div class="ttdeci">size_t m_Offset</div><div class="ttdoc">Number of bytes the value is away from the .m_Buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_memory_manager_8hpp_source.xhtml#l00022">MemoryManager.hpp:22</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="structarmnn_1_1_tensor_memory_xhtml"><div class="ttname"><a href="structarmnn_1_1_tensor_memory.xhtml">armnn::TensorMemory</a></div><div class="ttdef"><b>Definition:</b> <a href="_memory_manager_8hpp_source.xhtml#l00019">MemoryManager.hpp:19</a></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#l00588">LoadedNetwork.cpp:588</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#l00205">Logging.hpp:205</a></div></div>
<div class="ttc" id="structarmnn_1_1_buffer_storage_xhtml_afcd55b6ce066b6a3ddfcbbc1c483213f"><div class="ttname"><a href="structarmnn_1_1_buffer_storage.xhtml#afcd55b6ce066b6a3ddfcbbc1c483213f">armnn::BufferStorage::m_BufferSize</a></div><div class="ttdeci">size_t m_BufferSize</div><div class="ttdoc">Total size of the buffer. </div><div class="ttdef"><b>Definition:</b> <a href="_memory_manager_8hpp_source.xhtml#l00034">MemoryManager.hpp:34</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_ad5e03a241b63b19580f8fdd08c3647b7"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ad5e03a241b63b19580f8fdd08c3647b7">armnn::experimental::WorkingMemHandle::GetOutputHandle</a></div><div class="ttdeci">ITensorHandle * GetOutputHandle(LayerBindingId layerBindingId) const</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00098">WorkingMemHandle.hpp:98</a></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#l00392">Tensor.hpp:392</a></div></div>
<div class="ttc" id="classarmnn_1_1_input_slot_xhtml"><div class="ttname"><a href="classarmnn_1_1_input_slot.xhtml">armnn::InputSlot</a></div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00042">Layer.hpp:42</a></div></div>
<div class="ttc" id="structarmnn_1_1_i_network_properties_xhtml_abbc76b61436b870aed2c8592690e9a70"><div class="ttname"><a href="structarmnn_1_1_i_network_properties.xhtml#abbc76b61436b870aed2c8592690e9a70">armnn::INetworkProperties::m_OutputNetworkDetailsMethod</a></div><div class="ttdeci">const ProfilingDetailsMethod m_OutputNetworkDetailsMethod</div><div class="ttdef"><b>Definition:</b> <a href="_i_runtime_8hpp_source.xhtml#l00060">IRuntime.hpp:60</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#l00186">Graph.hpp:186</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a5acae80f1d8fd03cdb3878bd356683d7"><div class="ttname"><a href="namespacearmnn.xhtml#a5acae80f1d8fd03cdb3878bd356683d7">armnn::CopyToOutputTensor</a></div><div class="ttdeci">void CopyToOutputTensor(const Tensor &amp;outputTensor, ITensorHandle *outputTensorHandle)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01265">LoadedNetwork.cpp:1265</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#l00602">LoadedNetwork.cpp:602</a></div></div>
<div class="ttc" id="_backend_helper_8hpp_xhtml"><div class="ttname"><a href="_backend_helper_8hpp.xhtml">BackendHelper.hpp</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__quick__start_8dox_source.xhtml#l00006">01_00_quick_start.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#l00242">Layer.hpp:242</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a704bd570f39deda992bccdc639640dc7"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a704bd570f39deda992bccdc639640dc7">armnn::LoadedNetwork::ImportInputs</a></div><div class="ttdeci">std::vector&lt; ImportedInputId &gt; ImportInputs(const InputTensors &amp;inputTensors, MemorySource forceImportMemorySource=MemorySource::Undefined)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01306">LoadedNetwork.cpp:1306</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#l00371">Types.hpp:371</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#l00319">Layer.hpp:319</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="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#l00277">Types.hpp:277</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#l00220">Profiling.hpp:220</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#l00033">IRuntime.hpp:33</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_xhtml_aa9fc23b7155bd678232eeb351059b748"><div class="ttname"><a href="classarmnn_1_1_i_backend.xhtml#aa9fc23b7155bd678232eeb351059b748">armnn::IBackend::GetId</a></div><div class="ttdeci">virtual const BackendId &amp; GetId() const =0</div></div>
<div class="ttc" id="structarmnn_1_1_graph_1_1_output_layers_accessor_xhtml_a660efe3cd8761bd55b70ae83a7ea4334"><div class="ttname"><a href="structarmnn_1_1_graph_1_1_output_layers_accessor.xhtml#a660efe3cd8761bd55b70ae83a7ea4334">armnn::Graph::OutputLayersAccessor::begin</a></div><div class="ttdeci">ConstIteratorOutputs begin() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00084">Graph.hpp:84</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_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="classarmnn_1_1_output_slot_xhtml_a25b0119c02aece1d341b99953d169c0f"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#a25b0119c02aece1d341b99953d169c0f">armnn::OutputSlot::GetNumConnections</a></div><div class="ttdeci">unsigned int GetNumConnections() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00143">Layer.hpp:143</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#l00149">BackendId.hpp:149</a></div></div>
<div class="ttc" id="classarmnn_1_1_layer_xhtml_acf8b8e23bf647836592982f97088d375"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#acf8b8e23bf647836592982f97088d375">armnn::Layer::GetInputSlot</a></div><div class="ttdeci">const InputSlot &amp; GetInputSlot(unsigned int index) const override</div><div class="ttdoc">Get a const input slot handle by slot index. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00321">Layer.hpp:321</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="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a7487c3835e842582920969f2663bcc30"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a7487c3835e842582920969f2663bcc30">armnn::experimental::WorkingMemHandle::MemSyncOutputs</a></div><div class="ttdeci">void MemSyncOutputs()</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8cpp_source.xhtml#l00125">WorkingMemHandle.cpp:125</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_a39754dbf5b5cb692d3ba97f23b23962f"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#a39754dbf5b5cb692d3ba97f23b23962f">armnn::experimental::WorkingMemHandle::GetOutputConnection</a></div><div class="ttdeci">const std::vector&lt; std::vector&lt; ITensorHandle * &gt;::iterator &gt; &amp; GetOutputConnection(LayerBindingId layerBindingId) const</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00108">WorkingMemHandle.hpp:108</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_ab35a0f45d4b1bdad5c8e6614c7bf8d18"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ab35a0f45d4b1bdad5c8e6614c7bf8d18">armnn::experimental::WorkingMemHandle::ValidateBindingIds</a></div><div class="ttdeci">void ValidateBindingIds()</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8cpp_source.xhtml#l00134">WorkingMemHandle.cpp:134</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="_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#l00119">IBackendInternal.cpp:119</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_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#l00025">IRuntime.hpp:25</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="classarmnn_1_1_i_tensor_handle_xhtml_a437893b8dcf58a0b68b70e1ad7933be6"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a437893b8dcf58a0b68b70e1ad7933be6">armnn::ITensorHandle::GetParent</a></div><div class="ttdeci">virtual ITensorHandle * GetParent() const =0</div><div class="ttdoc">Get the parent tensor if this is a subtensor. </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#l00393">Tensor.hpp:393</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#l00225">Layer.hpp:225</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#l00270">Layer.hpp:270</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#l00086">Layer.hpp:86</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#l00018">IWorkingMemHandle.hpp:18</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_ae65834ecb69e3bc6a41ca1a57e4b63ab"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ae65834ecb69e3bc6a41ca1a57e4b63ab">armnn::experimental::WorkingMemHandle::GetInputConnections</a></div><div class="ttdeci">const std::vector&lt; std::vector&lt; ITensorHandle * &gt;::iterator &gt; &amp; GetInputConnections(LayerBindingId layerBindingId) const</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00103">WorkingMemHandle.hpp:103</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_input_slot_xhtml_a9effd325a6d512a3f8ff4bd207d53255"><div class="ttname"><a href="classarmnn_1_1_input_slot.xhtml#a9effd325a6d512a3f8ff4bd207d53255">armnn::InputSlot::GetConnectedOutputSlot</a></div><div class="ttdeci">const OutputSlot * GetConnectedOutputSlot() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00056">Layer.hpp:56</a></div></div>
<div class="ttc" id="include_2armnn_2backends_2_tensor_handle_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_2backends_2_tensor_handle_8hpp.xhtml">TensorHandle.hpp</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_aa792fd8b43401e3d6665110cdb0af27b"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#aa792fd8b43401e3d6665110cdb0af27b">armnn::LoadedNetwork::ClearImportedInputs</a></div><div class="ttdeci">void ClearImportedInputs(const std::vector&lt; ImportedInputId &gt; inputIds)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01557">LoadedNetwork.cpp:1557</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#l00170">BackendId.hpp:170</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#l01498">WorkloadFactory.cpp:1498</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_handler_xhtml_afe3429ac30b180c11f01ea0f9f546f0e"><div class="ttname"><a href="classarmnn_1_1_output_handler.xhtml#afe3429ac30b180c11f01ea0f9f546f0e">armnn::OutputHandler::GetData</a></div><div class="ttdeci">ITensorHandle * GetData() const</div><div class="ttdoc">Gets the allocated tensor memory. </div><div class="ttdef"><b>Definition:</b> <a href="_output_handler_8hpp_source.xhtml#l00046">OutputHandler.hpp:46</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#l00044">LoadedNetwork.hpp:44</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#l00209">Exceptions.hpp:209</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#l00274">Layer.hpp:274</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#l00098">WorkingMemHandle.cpp:98</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#l00030">Graph.hpp:30</a></div></div>
<div class="ttc" id="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_output_mem_descriptor_coords_xhtml"><div class="ttname"><a href="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_output_mem_descriptor_coords.xhtml">armnn::experimental::WorkingMemHandle::OutputMemDescriptorCoords</a></div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00037">WorkingMemHandle.hpp:37</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#l00243">Layer.hpp:243</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_i_tensor_handle_xhtml_a6caeedd55f4d685fd04b8fcb352dae4e"><div class="ttname"><a href="classarmnn_1_1_i_tensor_handle.xhtml#a6caeedd55f4d685fd04b8fcb352dae4e">armnn::ITensorHandle::CanBeImported</a></div><div class="ttdeci">virtual bool CanBeImported(void *memory, MemorySource source)</div><div class="ttdoc">Implementations must determine if this memory block can be imported. </div><div class="ttdef"><b>Definition:</b> <a href="include_2armnn_2backends_2_i_tensor_handle_8hpp_source.xhtml#l00085">ITensorHandle.hpp:85</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#l01118">LoadedNetwork.cpp:1118</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#l00194">Graph.hpp:194</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="include_2armnn_2backends_2_workload_data_8hpp_source.xhtml#l00074">WorkloadData.hpp:74</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a1c5ec805688cb558465a82a8d9f56a90"><div class="ttname"><a href="namespacearmnn.xhtml#a1c5ec805688cb558465a82a8d9f56a90">armnn::ImportedInputId</a></div><div class="ttdeci">unsigned int ImportedInputId</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00278">Types.hpp:278</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_a87880cba8611688cc57bec8f913958e8"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#a87880cba8611688cc57bec8f913958e8">armnn::LoadedNetwork::EnqueueWorkload</a></div><div class="ttdeci">Status EnqueueWorkload(const InputTensors &amp;inputTensors, const OutputTensors &amp;outputTensors, std::vector&lt; ImportedInputId &gt; preImportedInputIds={}, std::vector&lt; ImportedOutputId &gt; preImportedOutputIds={})</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#l00737">LoadedNetwork.cpp:737</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#l00575">Profiling.cpp:575</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#l00041">LoadedNetwork.hpp:41</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_abdfaf46d2e4cd003c0f13cdb1f1e6a20"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#abdfaf46d2e4cd003c0f13cdb1f1e6a20">armnn::experimental::WorkingMemHandle::GetBindingIdVector</a></div><div class="ttdeci">std::vector&lt; LayerBindingId &gt; &amp; GetBindingIdVector()</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00115">WorkingMemHandle.hpp:115</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#l00583">LoadedNetwork.cpp:583</a></div></div>
<div class="ttc" id="classarmnn_1_1_backend_registry_xhtml_a6dea5df9078a3e9b44176175043237f6"><div class="ttname"><a href="classarmnn_1_1_backend_registry.xhtml#a6dea5df9078a3e9b44176175043237f6">armnn::BackendRegistry::GetAllocators</a></div><div class="ttdeci">std::unordered_map&lt; BackendId, std::shared_ptr&lt; ICustomAllocator &gt; &gt; GetAllocators()</div><div class="ttdef"><b>Definition:</b> <a href="_backend_registry_8cpp_source.xhtml#l00126">BackendRegistry.cpp:126</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_backend_internal_xhtml_a057f6c5c3ab3248050ed548273c4beb9"><div class="ttname"><a href="classarmnn_1_1_i_backend_internal.xhtml#a057f6c5c3ab3248050ed548273c4beb9">armnn::IBackendInternal::GetCapabilities</a></div><div class="ttdeci">virtual BackendCapabilities GetCapabilities() const</div><div class="ttdoc">Returns a BackendCapability if the backend lists the capability The BackendCapability must then be in...</div><div class="ttdef"><b>Definition:</b> <a href="_i_backend_internal_8hpp_source.xhtml#l00169">IBackendInternal.hpp:169</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. </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="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="include_2armnn_2backends_2_workload_data_8hpp_source.xhtml#l00027">WorkloadData.hpp:27</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#l00230">Layer.hpp:230</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_ac88d932e6e015a59551322b25796b11a"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#ac88d932e6e015a59551322b25796b11a">armnn::LoadedNetwork::ImportOutputs</a></div><div class="ttdeci">std::vector&lt; ImportedOutputId &gt; ImportOutputs(const OutputTensors &amp;outputTensors, MemorySource forceImportMemorySource=MemorySource::Undefined)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01439">LoadedNetwork.cpp:1439</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a14fcd7f88d11cea0a018269dca5f9277"><div class="ttname"><a href="namespacearmnn.xhtml#a14fcd7f88d11cea0a018269dca5f9277">armnn::MemorySource</a></div><div class="ttdeci">MemorySource</div><div class="ttdoc">Define the Memory Source to reduce copies. </div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00217">Types.hpp:217</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#l00138">BackendId.hpp:138</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#l02062">LoadedNetwork.cpp:2062</a></div></div>
<div class="ttc" id="structarmnn_1_1_graph_1_1_output_layers_accessor_xhtml_ad2a661f37e89422e29dc70b3e4cc7185"><div class="ttname"><a href="structarmnn_1_1_graph_1_1_output_layers_accessor.xhtml#ad2a661f37e89422e29dc70b3e4cc7185">armnn::Graph::OutputLayersAccessor::end</a></div><div class="ttdeci">ConstIteratorOutputs end() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00090">Graph.hpp:90</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="structarmnn_1_1_buffer_storage_xhtml"><div class="ttname"><a href="structarmnn_1_1_buffer_storage.xhtml">armnn::BufferStorage</a></div><div class="ttdef"><b>Definition:</b> <a href="_memory_manager_8hpp_source.xhtml#l00029">MemoryManager.hpp:29</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a375ca3cff9f1b005d1412dc5f3cf5b6e"><div class="ttname"><a href="namespacearmnn.xhtml#a375ca3cff9f1b005d1412dc5f3cf5b6e">armnn::numeric_cast</a></div><div class="ttdeci">std::enable_if_t&lt; std::is_unsigned&lt; Source &gt;::value &amp;&amp;std::is_unsigned&lt; Dest &gt;::value, Dest &gt; numeric_cast(Source source)</div><div class="ttdef"><b>Definition:</b> <a href="_numeric_cast_8hpp_source.xhtml#l00035">NumericCast.hpp:35</a></div></div>
<div class="ttc" id="include_2armnn_2backends_2_mem_copy_workload_8hpp_xhtml"><div class="ttname"><a href="include_2armnn_2backends_2_mem_copy_workload_8hpp.xhtml">MemCopyWorkload.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_backend_options_1_1_backend_option_xhtml"><div class="ttname"><a href="structarmnn_1_1_backend_options_1_1_backend_option.xhtml">armnn::BackendOptions::BackendOption</a></div><div class="ttdef"><b>Definition:</b> <a href="_backend_options_8hpp_source.xhtml#l00215">BackendOptions.hpp:215</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_layer_xhtml_a7ddf0cf6f620d59c10e63495ace795d0"><div class="ttname"><a href="classarmnn_1_1_layer.xhtml#a7ddf0cf6f620d59c10e63495ace795d0">armnn::Layer::GetName</a></div><div class="ttdeci">const char * GetName() const override</div><div class="ttdoc">Returns the name of the layer. </div><div class="ttdef"><b>Definition:</b> <a href="_layer_8hpp_source.xhtml#l00316">Layer.hpp:316</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="classarmnn_1_1_output_slot_xhtml_af303cf872a3f95e29992e45224e4cf8e"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#af303cf872a3f95e29992e45224e4cf8e">armnn::OutputSlot::GetTensorHandleFactoryId</a></div><div class="ttdeci">ITensorHandleFactory::FactoryId GetTensorHandleFactoryId() const</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.xhtml#l00179">Layer.cpp:179</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#l00046">WorkloadUtils.hpp:46</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#l00182">Graph.hpp:182</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#l00190">Graph.hpp:190</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="include_2armnn_2backends_2_workload_data_8hpp_source.xhtml#l00026">WorkloadData.hpp:26</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#l00196">Graph.hpp:196</a></div></div>
<div class="ttc" id="structarmnn_1_1_graph_1_1_input_layers_accessor_xhtml_a39ebf520b6f30ab8776bdcb99ee38b93"><div class="ttname"><a href="structarmnn_1_1_graph_1_1_input_layers_accessor.xhtml#a39ebf520b6f30ab8776bdcb99ee38b93">armnn::Graph::InputLayersAccessor::end</a></div><div class="ttdeci">ConstIteratorInputs end() const</div><div class="ttdef"><b>Definition:</b> <a href="_graph_8hpp_source.xhtml#l00070">Graph.hpp:70</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="include_2armnn_2backends_2_workload_data_8hpp_source.xhtml#l00087">WorkloadData.hpp:87</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#l01280">LoadedNetwork.cpp:1280</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="namespacearmnn_xhtml_a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255"><div class="ttname"><a href="namespacearmnn.xhtml#a14d24d90ab4ba2956e92e27890ba4c91acb17869fe51048b5a5c4c6106551a255">armnn::PaddingMode::Constant</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="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_input_mem_descriptor_coords_xhtml"><div class="ttname"><a href="structarmnn_1_1experimental_1_1_working_mem_handle_1_1_input_mem_descriptor_coords.xhtml">armnn::experimental::WorkingMemHandle::InputMemDescriptorCoords</a></div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00030">WorkingMemHandle.hpp:30</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#l00082">LoadedNetwork.cpp:82</a></div></div>
<div class="ttc" id="classarmnn_1_1_output_slot_xhtml_ada2ad7d1caeeb4ef6195c8925fad6a65"><div class="ttname"><a href="classarmnn_1_1_output_slot.xhtml#ada2ad7d1caeeb4ef6195c8925fad6a65">armnn::OutputSlot::GetTensorInfo</a></div><div class="ttdeci">const TensorInfo &amp; GetTensorInfo() const override</div><div class="ttdef"><b>Definition:</b> <a href="_layer_8cpp_source.xhtml#l00066">Layer.cpp:66</a></div></div>
<div class="ttc" id="classarmnn_1_1experimental_1_1_working_mem_handle_xhtml_ab0ba2e3d5e666b99e28a485d117ddfc3"><div class="ttname"><a href="classarmnn_1_1experimental_1_1_working_mem_handle.xhtml#ab0ba2e3d5e666b99e28a485d117ddfc3">armnn::experimental::WorkingMemHandle::GetInputHandle</a></div><div class="ttdeci">ITensorHandle * GetInputHandle(LayerBindingId layerBindingId) const</div><div class="ttdef"><b>Definition:</b> <a href="_working_mem_handle_8hpp_source.xhtml#l00093">WorkingMemHandle.hpp:93</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#l00185">Graph.hpp:185</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#l00026">WorkingMemHandle.hpp:26</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#l00215">Layer.hpp:215</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#l00058">IRuntime.hpp:58</a></div></div>
<div class="ttc" id="classarmnn_1_1_loaded_network_xhtml_af06f742ce80985a8fbbbc028c20259b1"><div class="ttname"><a href="classarmnn_1_1_loaded_network.xhtml#af06f742ce80985a8fbbbc028c20259b1">armnn::LoadedNetwork::ClearImportedOutputs</a></div><div class="ttdeci">void ClearImportedOutputs(const std::vector&lt; ImportedOutputId &gt; outputIds)</div><div class="ttdef"><b>Definition:</b> <a href="_loaded_network_8cpp_source.xhtml#l01578">LoadedNetwork.cpp:1578</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4">armnn::LayerType</a></div><div class="ttdeci">LayerType</div><div class="ttdoc">When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below...</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00458">Types.hpp:458</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#l00327">Layer.hpp:327</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#l00545">LoadedNetwork.cpp:545</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 Wed Mar 9 2022 12:00:07 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>