aboutsummaryrefslogtreecommitdiff
path: root/22.11/_canonical_utils_8cpp_source.xhtml
blob: 1b77e902ee4da84bb8479578448b2dd753d2db44 (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
<!-- 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: shim/sl/canonical/CanonicalUtils.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.11</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('_canonical_utils_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">CanonicalUtils.cpp</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_canonical_utils_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 © 2022 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"><a class="line" href="_canonical_utils_8cpp.xhtml#a7ce0df38eb467e59f209470c8f5ac4e6">    6</a></span>&#160;<span class="preprocessor">#define LOG_TAG &quot;arm-armnn-sl&quot;</span></div><div class="line"><a name="l00007"></a><span class="lineno">    7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno">    8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="_canonical_utils_8hpp.xhtml">CanonicalUtils.hpp</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno">    9</span>&#160;</div><div class="line"><a name="l00010"></a><span class="lineno">   10</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_utils_8hpp.xhtml">armnn/Utils.hpp</a>&gt;</span></div><div class="line"><a name="l00011"></a><span class="lineno">   11</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="l00012"></a><span class="lineno">   12</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_i_serializer_8hpp.xhtml">armnnSerializer/ISerializer.hpp</a>&gt;</span></div><div class="line"><a name="l00013"></a><span class="lineno">   13</span>&#160;<span class="preprocessor">#include &lt;<a class="code" href="_permute_8hpp.xhtml">armnnUtils/Permute.hpp</a>&gt;</span></div><div class="line"><a name="l00014"></a><span class="lineno">   14</span>&#160;</div><div class="line"><a name="l00015"></a><span class="lineno">   15</span>&#160;<span class="preprocessor">#include &lt;ghc/filesystem.hpp&gt;</span></div><div class="line"><a name="l00016"></a><span class="lineno">   16</span>&#160;<span class="keyword">namespace </span>fs = ghc::filesystem;</div><div class="line"><a name="l00017"></a><span class="lineno">   17</span>&#160;<span class="preprocessor">#include &lt;half/half.hpp&gt;</span></div><div class="line"><a name="l00018"></a><span class="lineno">   18</span>&#160;<span class="preprocessor">#include &lt;log/log.h&gt;</span></div><div class="line"><a name="l00019"></a><span class="lineno">   19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno">   20</span>&#160;<span class="preprocessor">#include &lt;cassert&gt;</span></div><div class="line"><a name="l00021"></a><span class="lineno">   21</span>&#160;<span class="preprocessor">#include &lt;cerrno&gt;</span></div><div class="line"><a name="l00022"></a><span class="lineno">   22</span>&#160;<span class="preprocessor">#include &lt;cinttypes&gt;</span></div><div class="line"><a name="l00023"></a><span class="lineno">   23</span>&#160;<span class="preprocessor">#include &lt;cstdio&gt;</span></div><div class="line"><a name="l00024"></a><span class="lineno">   24</span>&#160;<span class="preprocessor">#include &lt;sstream&gt;</span></div><div class="line"><a name="l00025"></a><span class="lineno">   25</span>&#160;<span class="preprocessor">#include &lt;time.h&gt;</span></div><div class="line"><a name="l00026"></a><span class="lineno">   26</span>&#160;<span class="preprocessor">#include &lt;variant&gt;</span></div><div class="line"><a name="l00027"></a><span class="lineno">   27</span>&#160;</div><div class="line"><a name="l00028"></a><span class="lineno">   28</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a></div><div class="line"><a name="l00029"></a><span class="lineno">   29</span>&#160;{</div><div class="line"><a name="l00030"></a><span class="lineno">   30</span>&#160;<span class="keyword">using</span> <a class="code" href="namespacearmnn.xhtml#a0b49aa352b84d572942185ce72cef751">Half</a> = half_float::half; <span class="comment">//import half float implementation</span></div><div class="line"><a name="l00031"></a><span class="lineno">   31</span>&#160;} <span class="comment">//namespace armnn</span></div><div class="line"><a name="l00032"></a><span class="lineno">   32</span>&#160;</div><div class="line"><a name="l00033"></a><span class="lineno">   33</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceandroid.xhtml">android</a>;</div><div class="line"><a name="l00034"></a><span class="lineno">   34</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceandroid_1_1nn.xhtml">android::nn</a>;</div><div class="line"><a name="l00035"></a><span class="lineno">   35</span>&#160;</div><div class="line"><a name="l00036"></a><span class="lineno">   36</span>&#160;<span class="keyword">namespace </span><a class="code" href="namespacearmnn__driver.xhtml">armnn_driver</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"><a class="line" href="namespacearmnn__driver.xhtml#ae059aea66ee0867a204aa2f2d9abb42c">   38</a></span>&#160;<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">armnn::PermutationVector</a> <a class="code" href="namespacearmnn__driver.xhtml#ae059aea66ee0867a204aa2f2d9abb42c">g_DontPermute</a>{};</div><div class="line"><a name="l00039"></a><span class="lineno">   39</span>&#160;</div><div class="line"><a name="l00040"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a5665b88a0b22c6341dd8075048981689">   40</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#a5665b88a0b22c6341dd8075048981689">SwizzleAndroidNn4dTensorToArmNn</a>(<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>&amp; tensorInfo,</div><div class="line"><a name="l00041"></a><span class="lineno">   41</span>&#160;                                     <span class="keyword">const</span> <span class="keywordtype">void</span>* input,</div><div class="line"><a name="l00042"></a><span class="lineno">   42</span>&#160;                                     <span class="keywordtype">void</span>* output,</div><div class="line"><a name="l00043"></a><span class="lineno">   43</span>&#160;                                     <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_permutation_vector.xhtml">armnn::PermutationVector</a>&amp; mappings)</div><div class="line"><a name="l00044"></a><span class="lineno">   44</span>&#160;{</div><div class="line"><a name="l00045"></a><span class="lineno">   45</span>&#160;    assert(tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 4U);</div><div class="line"><a name="l00046"></a><span class="lineno">   46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno">   47</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">armnn::DataType</a> dataType = tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">GetDataType</a>();</div><div class="line"><a name="l00048"></a><span class="lineno">   48</span>&#160;    <span class="keywordflow">switch</span> (dataType)</div><div class="line"><a name="l00049"></a><span class="lineno">   49</span>&#160;    {</div><div class="line"><a name="l00050"></a><span class="lineno">   50</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a26e6ed77470c6f2f830ecf874e6c0d55">armnn::DataType::Float16</a>:</div><div class="line"><a name="l00051"></a><span class="lineno">   51</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>:</div><div class="line"><a name="l00052"></a><span class="lineno">   52</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">armnn::DataType::QAsymmU8</a>:</div><div class="line"><a name="l00053"></a><span class="lineno">   53</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9945327825b115e93a3b89f4302e76db">armnn::DataType::QSymmS8</a>:</div><div class="line"><a name="l00054"></a><span class="lineno">   54</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9d02ea768c081d4bdb2b7cab0b3f510d">armnn::DataType::QAsymmS8</a>:</div><div class="line"><a name="l00055"></a><span class="lineno">   55</span>&#160;        <span class="comment">// First swizzle tensor info</span></div><div class="line"><a name="l00056"></a><span class="lineno">   56</span>&#160;        tensorInfo = <a class="code" href="namespacearmnn_utils.xhtml#abeaf4f6785039866fd075f4569ba8e84">armnnUtils::Permuted</a>(tensorInfo, mappings);</div><div class="line"><a name="l00057"></a><span class="lineno">   57</span>&#160;        <span class="comment">// Then swizzle tensor data</span></div><div class="line"><a name="l00058"></a><span class="lineno">   58</span>&#160;        <a class="code" href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7">armnnUtils::Permute</a>(tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>(), mappings, input, output, <a class="code" href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">armnn::GetDataTypeSize</a>(dataType));</div><div class="line"><a name="l00059"></a><span class="lineno">   59</span>&#160;        <span class="keywordflow">break</span>;</div><div class="line"><a name="l00060"></a><span class="lineno">   60</span>&#160;    <span class="keywordflow">default</span>:</div><div class="line"><a name="l00061"></a><span class="lineno">   61</span>&#160;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;Unknown armnn::DataType for swizzling&quot;</span>;</div><div class="line"><a name="l00062"></a><span class="lineno">   62</span>&#160;        assert(0);</div><div class="line"><a name="l00063"></a><span class="lineno">   63</span>&#160;    }</div><div class="line"><a name="l00064"></a><span class="lineno">   64</span>&#160;}</div><div class="line"><a name="l00065"></a><span class="lineno">   65</span>&#160;</div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a96666c2945d7fe8c34aee30a449287d5">   66</a></span>&#160;<span class="keywordtype">void</span>* <a class="code" href="namespacearmnn__driver.xhtml#a96666c2945d7fe8c34aee30a449287d5">GetMemoryFromPool</a>(DataLocation location, <span class="keyword">const</span> std::vector&lt;android::nn::RunTimePoolInfo&gt;&amp; memPools)</div><div class="line"><a name="l00067"></a><span class="lineno">   67</span>&#160;{</div><div class="line"><a name="l00068"></a><span class="lineno">   68</span>&#160;    <span class="comment">// find the location within the pool</span></div><div class="line"><a name="l00069"></a><span class="lineno">   69</span>&#160;    assert(location.poolIndex &lt; memPools.size());</div><div class="line"><a name="l00070"></a><span class="lineno">   70</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno">   71</span>&#160;    <span class="keyword">const</span> android::nn::RunTimePoolInfo&amp; memPool = memPools[location.poolIndex];</div><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;    uint8_t* memPoolBuffer = memPool.getBuffer();</div><div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    uint8_t* memory = memPoolBuffer + location.offset;</div><div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    <span class="keywordflow">return</span> memory;</div><div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;}</div><div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;</div><div class="line"><a name="l00077"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a915f2652854e417e26afc297f12e107c">   77</a></span>&#160;<span class="keywordtype">void</span>* <a class="code" href="namespacearmnn__driver.xhtml#a915f2652854e417e26afc297f12e107c">GetMemoryFromPointer</a>(<span class="keyword">const</span> Request::Argument&amp; requestArg)</div><div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;{</div><div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;    <span class="comment">// get the pointer memory</span></div><div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    <span class="keyword">auto</span> ptrMemory = std::visit([](std::variant&lt;const void*, void*&gt;&amp;&amp; memory)</div><div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160;                                {</div><div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;                                    <span class="keywordflow">if</span> (std::holds_alternative&lt;const void*&gt;(memory))</div><div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;                                    {</div><div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;                                        <span class="keyword">auto</span> ptr = std::get&lt;const void*&gt;(memory);</div><div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;                                        <span class="keyword">auto</span> ptrMemory = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>uint8_t*<span class="keyword">&gt;</span>(ptr);</div><div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;                                        <span class="keywordflow">return</span> <span class="keyword">const_cast&lt;</span>uint8_t*<span class="keyword">&gt;</span>(ptrMemory);</div><div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;                                    }</div><div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;                                    <span class="keywordflow">else</span></div><div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160;                                    {</div><div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;                                        <span class="keyword">auto</span> ptr = std::get&lt;void*&gt;(memory);</div><div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160;                                        <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>uint8_t*<span class="keyword">&gt;</span>(ptr);</div><div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;                                    }</div><div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;                                }, requestArg.location.pointer);</div><div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;    <span class="keywordflow">return</span> ptrMemory;</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"><a class="line" href="namespacearmnn__driver.xhtml#a93f4874062e34819806d36b74c73dc61">   97</a></span>&#160;<a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> <a class="code" href="namespacearmnn__driver.xhtml#a93f4874062e34819806d36b74c73dc61">GetTensorInfoForOperand</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn__driver.xhtml#aa9b4bc8d4cfb04be14771dbb1bc1a1ac">Operand</a>&amp; operand)</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;    <span class="keyword">using namespace </span><a class="code" href="namespacearmnn.xhtml">armnn</a>;</div><div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;    <span class="keywordtype">bool</span> perChannel = <span class="keyword">false</span>;</div><div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160;    <span class="keywordtype">bool</span> isScalar   = <span class="keyword">false</span>;</div><div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;</div><div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;    <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">DataType</a> type;</div><div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;    <span class="keywordflow">switch</span> (operand.type)</div><div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;    {</div><div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_BOOL8:</div><div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a27226c864bac7454a8504f8edb15d95b">armnn::DataType::Boolean</a>;</div><div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_FLOAT32:</div><div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>;</div><div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_FLOAT16:</div><div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a26e6ed77470c6f2f830ecf874e6c0d55">armnn::DataType::Float16</a>;</div><div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_QUANT8_ASYMM:</div><div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">armnn::DataType::QAsymmU8</a>;</div><div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL:</div><div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;            perChannel=<span class="keyword">true</span>;</div><div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;            <a class="code" href="_utils_8hpp.xhtml#abbf421eb1186af0d505648ed2ea54a00">ARMNN_FALLTHROUGH</a>;</div><div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_QUANT8_SYMM:</div><div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9945327825b115e93a3b89f4302e76db">armnn::DataType::QSymmS8</a>;</div><div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_QUANT16_SYMM:</div><div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a053c769dcf82d66ef326c86980c02ba7">armnn::DataType::QSymmS16</a>;</div><div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_INT32:</div><div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a>;</div><div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160;        <span class="keywordflow">case</span> OperandType::INT32:</div><div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a>;</div><div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;            isScalar = <span class="keyword">true</span>;</div><div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;        <span class="keywordflow">case</span> OperandType::TENSOR_QUANT8_ASYMM_SIGNED:</div><div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;            type = <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9d02ea768c081d4bdb2b7cab0b3f510d">armnn::DataType::QAsymmS8</a>;</div><div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;            <span class="keywordflow">throw</span> <a class="code" href="classarmnn__driver_1_1_unsupported_operand.xhtml">UnsupportedOperand&lt;OperandType&gt;</a>(operand.type);</div><div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;    }</div><div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;</div><div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;    <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a> ret;</div><div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;    <span class="keywordflow">if</span> (isScalar)</div><div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160;    {</div><div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;        ret = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(<a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a>(<a class="code" href="namespacearmnn.xhtml#a8e1f31031ad31cd8cc22d7c9daa32681af60357a8d17e45793298323f1b372a74">armnn::Dimensionality::Scalar</a>), type);</div><div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;    }</div><div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;    <span class="keywordflow">else</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;        <span class="keywordflow">if</span> (operand.dimensions.size() == 0)</div><div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;        {</div><div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160;            <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> tensorShape(<a class="code" href="namespacearmnn.xhtml#a8e1f31031ad31cd8cc22d7c9daa32681a4b7d504abac49ba24b4df86c129d3cbc">Dimensionality::NotSpecified</a>);</div><div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;            ret = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(tensorShape, type);</div><div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160;        }</div><div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;        {</div><div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;            <span class="keywordtype">bool</span> dimensionsSpecificity[5] = { <span class="keyword">true</span>, <span class="keyword">true</span>, <span class="keyword">true</span>, <span class="keyword">true</span>, <span class="keyword">true</span> };</div><div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;            <span class="keywordtype">int</span> count = 0;</div><div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;            std::for_each(operand.dimensions.data(),</div><div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;                          operand.dimensions.data() +  operand.dimensions.size(),</div><div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                          [&amp;](<span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> val)</div><div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160;                          {</div><div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;                              <span class="keywordflow">if</span> (val == 0)</div><div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;                              {</div><div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                                  dimensionsSpecificity[count] = <span class="keyword">false</span>;</div><div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;                              }</div><div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;                              count++;</div><div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;                          });</div><div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;            <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">TensorShape</a> tensorShape(operand.dimensions.size(), operand.dimensions.data(), dimensionsSpecificity);</div><div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;            ret = <a class="code" href="classarmnn_1_1_tensor_info.xhtml">TensorInfo</a>(tensorShape, type);</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;    }</div><div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;    <span class="keywordflow">if</span> (perChannel)</div><div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;    {</div><div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;        <span class="comment">// ExtraParams is expected to be of type channelQuant</span></div><div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;        <span class="keyword">const</span> <span class="keyword">auto</span>&amp; perAxisQuantParams = std::get&lt;Operand::SymmPerChannelQuantParams&gt;(operand.extraParams);</div><div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;</div><div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160;        ret.SetQuantizationScales(perAxisQuantParams.scales);</div><div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;        ret.SetQuantizationDim(MakeOptional&lt;unsigned int&gt;(perAxisQuantParams.channelDim));</div><div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160;    }</div><div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;    <span class="keywordflow">else</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;        ret.SetQuantizationScale(operand.scale);</div><div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;        ret.SetQuantizationOffset(operand.zeroPoint);</div><div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;    }</div><div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160;    <span class="keywordflow">return</span> ret;</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"><a class="line" href="namespacearmnn__driver.xhtml#ac0532f3c7d143a04aee7f5991ee5d381">  189</a></span>&#160;std::string <a class="code" href="namespacearmnn__driver.xhtml#ac0532f3c7d143a04aee7f5991ee5d381">GetOperandSummary</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn__driver.xhtml#aa9b4bc8d4cfb04be14771dbb1bc1a1ac">Operand</a>&amp; operand)</div><div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;{</div><div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;    std::stringstream ss;</div><div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160;    ss &lt;&lt; <span class="stringliteral">&quot;operand dimensions: [ &quot;</span>;</div><div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;    <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt; operand.dimensions.size(); ++i)</div><div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;    {</div><div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;        ss &lt;&lt; operand.dimensions[i] &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;    }</div><div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;    ss &lt;&lt; <span class="stringliteral">&quot;] operand type: &quot;</span> &lt;&lt; operand.type;</div><div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    <span class="keywordflow">return</span> ss.str();</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;</div><div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> TensorType&gt;</div><div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="keyword">using</span> <a class="code" href="namespacearmnn__driver.xhtml#a34209101a89c1ae72081a0fb53725852">DumpElementFunction</a> = void (*)(<span class="keyword">const</span> TensorType&amp; tensor,</div><div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;                                     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> elementIndex,</div><div class="line"><a name="l00204"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a34209101a89c1ae72081a0fb53725852">  204</a></span>&#160;                                     std::ofstream&amp; fileStream);</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;<span class="keyword">namespace</span></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="keyword">template</span> &lt;<span class="keyword">typename</span> TensorType, <span class="keyword">typename</span> ElementType, <span class="keyword">typename</span> Pr<span class="keywordtype">int</span>ableType = ElementType&gt;</div><div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;<span class="keywordtype">void</span> DumpTensorElement(<span class="keyword">const</span> TensorType&amp; tensor, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> elementIndex, std::ofstream&amp; fileStream)</div><div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160;{</div><div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keyword">const</span> ElementType* elements = <span class="keyword">reinterpret_cast&lt;</span><span class="keyword">const </span>ElementType*<span class="keyword">&gt;</span>(tensor.GetMemoryArea());</div><div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;    fileStream &lt;&lt; static_cast&lt;PrintableType&gt;(elements[elementIndex]) &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00213"></a><span class="lineno">  213</span>&#160;}</div><div class="line"><a name="l00214"></a><span class="lineno">  214</span>&#160;</div><div class="line"><a name="l00215"></a><span class="lineno">  215</span>&#160;} <span class="comment">// namespace</span></div><div class="line"><a name="l00216"></a><span class="lineno">  216</span>&#160;<span class="keyword">template</span> &lt;<span class="keyword">typename</span> TensorType&gt;</div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#aa25bddb175983b2d3e0965440323d789">  217</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#aa25bddb175983b2d3e0965440323d789">DumpTensor</a>(<span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00218"></a><span class="lineno">  218</span>&#160;                <span class="keyword">const</span> std::string&amp; requestName,</div><div class="line"><a name="l00219"></a><span class="lineno">  219</span>&#160;                <span class="keyword">const</span> std::string&amp; tensorName,</div><div class="line"><a name="l00220"></a><span class="lineno">  220</span>&#160;                <span class="keyword">const</span> TensorType&amp; tensor)</div><div class="line"><a name="l00221"></a><span class="lineno">  221</span>&#160;{</div><div class="line"><a name="l00222"></a><span class="lineno">  222</span>&#160;    <span class="comment">// The dump directory must exist in advance.</span></div><div class="line"><a name="l00223"></a><span class="lineno">  223</span>&#160;    fs::path dumpPath = dumpDir;</div><div class="line"><a name="l00224"></a><span class="lineno">  224</span>&#160;    <span class="keyword">const</span> fs::path fileName = dumpPath / (requestName + <span class="stringliteral">&quot;_&quot;</span> + tensorName + <span class="stringliteral">&quot;.dump&quot;</span>);</div><div class="line"><a name="l00225"></a><span class="lineno">  225</span>&#160;</div><div class="line"><a name="l00226"></a><span class="lineno">  226</span>&#160;    std::ofstream fileStream;</div><div class="line"><a name="l00227"></a><span class="lineno">  227</span>&#160;    fileStream.open(fileName.c_str(), std::ofstream::out | std::ofstream::trunc);</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;    <span class="keywordflow">if</span> (!fileStream.good())</div><div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    {</div><div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;Could not open file %s for writing&quot;</span> &lt;&lt; fileName.c_str();</div><div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    }</div><div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    <a class="code" href="namespacearmnn__driver.xhtml#a34209101a89c1ae72081a0fb53725852">DumpElementFunction&lt;TensorType&gt;</a> dumpElementFunction = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    <span class="keywordflow">switch</span> (tensor.GetDataType())</div><div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160;    {</div><div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a>:</div><div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;        {</div><div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, float&gt;;</div><div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;            <span class="keywordflow">break</span>;</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">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">armnn::DataType::QAsymmU8</a>:</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;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, uint8_t, uint32_t&gt;;</div><div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;        }</div><div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a>:</div><div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;        {</div><div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, int32_t&gt;;</div><div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;        }</div><div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a26e6ed77470c6f2f830ecf874e6c0d55">armnn::DataType::Float16</a>:</div><div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;        {</div><div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, armnn::Half&gt;;</div><div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;        }</div><div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9d02ea768c081d4bdb2b7cab0b3f510d">armnn::DataType::QAsymmS8</a>:</div><div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;        {</div><div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, int8_t, int32_t&gt;;</div><div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;        }</div><div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a27226c864bac7454a8504f8edb15d95b">armnn::DataType::Boolean</a>:</div><div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;        {</div><div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;            dumpElementFunction = &amp;DumpTensorElement&lt;TensorType, bool&gt;;</div><div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;            <span class="keywordflow">break</span>;</div><div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;        }</div><div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;        <span class="keywordflow">default</span>:</div><div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;        {</div><div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;            dumpElementFunction = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;        }</div><div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    }</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> (dumpElementFunction != <span class="keyword">nullptr</span>)</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="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numDimensions = tensor.GetNumDimensions();</div><div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_shape.xhtml">armnn::TensorShape</a> shape = tensor.GetShape();</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;        <span class="keywordflow">if</span> (!shape.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#acccb75bd1d68a81f6ddd61687f51c5a1">AreAllDimensionsSpecified</a>())</div><div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;        {</div><div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;            fileStream &lt;&lt; <span class="stringliteral">&quot;Cannot dump tensor elements: not all dimensions are specified&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;            <span class="keywordflow">return</span>;</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;        fileStream &lt;&lt; <span class="stringliteral">&quot;# Number of elements &quot;</span> &lt;&lt; tensor.<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">GetNumElements</a>() &lt;&lt; std::endl;</div><div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160;</div><div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;        <span class="keywordflow">if</span> (numDimensions == 0)</div><div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160;        {</div><div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;            fileStream &lt;&lt; <span class="stringliteral">&quot;# Shape []&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;            <span class="keywordflow">return</span>;</div><div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;        }</div><div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;        fileStream &lt;&lt; <span class="stringliteral">&quot;# Shape [&quot;</span> &lt;&lt; shape[0];</div><div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> d = 1; d &lt; numDimensions; ++d)</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;            fileStream &lt;&lt; <span class="stringliteral">&quot;,&quot;</span> &lt;&lt; shape[d];</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;        fileStream &lt;&lt; <span class="stringliteral">&quot;]&quot;</span> &lt;&lt; std::endl;</div><div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        fileStream &lt;&lt; <span class="stringliteral">&quot;Each line contains the data of each of the elements of dimension0. In NCHW and NHWC, each line&quot;</span></div><div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;                      <span class="stringliteral">&quot; will be a batch&quot;</span> &lt;&lt; std::endl &lt;&lt; std::endl;</div><div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160;</div><div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;        <span class="comment">// Split will create a new line after all elements of the first dimension</span></div><div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;        <span class="comment">// (in a 4, 3, 2, 3 tensor, there will be 4 lines of 18 elements)</span></div><div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;        <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> split = 1;</div><div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;        <span class="keywordflow">if</span> (numDimensions == 1)</div><div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;        {</div><div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;            split = shape[0];</div><div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;        }</div><div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;        <span class="keywordflow">else</span></div><div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;        {</div><div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160;            <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1; i &lt; numDimensions; ++i)</div><div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;            {</div><div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;                split *= shape[i];</div><div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;            }</div><div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;        }</div><div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;</div><div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;        <span class="comment">// Print all elements in the tensor</span></div><div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160;        <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> elementIndex = 0; elementIndex &lt; tensor.GetNumElements(); ++elementIndex)</div><div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;        {</div><div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;            (*dumpElementFunction)(tensor, elementIndex, fileStream);</div><div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;            <span class="keywordflow">if</span> ( (elementIndex + 1) % split == 0 )</div><div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;            {</div><div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;                fileStream &lt;&lt; std::endl;</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;        }</div><div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160;        fileStream &lt;&lt; std::endl;</div><div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;    }</div><div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;    <span class="keywordflow">else</span></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;        fileStream &lt;&lt; <span class="stringliteral">&quot;Cannot dump tensor elements: Unsupported data type &quot;</span></div><div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;            &lt;&lt; <span class="keyword">static_cast&lt;</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">&gt;</span>(tensor.GetDataType()) &lt;&lt; std::endl;</div><div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;    }</div><div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;</div><div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;    <span class="keywordflow">if</span> (!fileStream.good())</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;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;An error occurred when writing to file %s&quot;</span> &lt;&lt; fileName.c_str();</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;}</div><div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;</div><div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;<span class="keyword">template</span> <span class="keywordtype">void</span> DumpTensor&lt;armnn::ConstTensor&gt;(<span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;                                             <span class="keyword">const</span> std::string&amp; requestName,</div><div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160;                                             <span class="keyword">const</span> std::string&amp; tensorName,</div><div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;                                             <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_const_tensor.xhtml">armnn::ConstTensor</a>&amp; tensor);</div><div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;</div><div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="keyword">template</span> <span class="keywordtype">void</span> DumpTensor&lt;armnn::Tensor&gt;(<span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;                                        <span class="keyword">const</span> std::string&amp; requestName,</div><div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;                                        <span class="keyword">const</span> std::string&amp; tensorName,</div><div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;                                        <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor.xhtml">armnn::Tensor</a>&amp; tensor);</div><div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#aa313ae79f70102e3451d45d3387c2e46">  350</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#aa313ae79f70102e3451d45d3387c2e46">DumpJsonProfilingIfRequired</a>(<span class="keywordtype">bool</span> gpuProfilingEnabled,</div><div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;                                 <span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;                                 <a class="code" href="namespacearmnn.xhtml#a0d8160388a127c1a23b37bc88dc6e2ec">armnn::NetworkId</a> networkId,</div><div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;                                 <span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_profiler.xhtml">armnn::IProfiler</a>* profiler)</div><div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;{</div><div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;    <span class="comment">// Check if profiling is required.</span></div><div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160;    <span class="keywordflow">if</span> (!gpuProfilingEnabled)</div><div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;    {</div><div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;    }</div><div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;</div><div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;    <span class="comment">// The dump directory must exist in advance.</span></div><div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160;    <span class="keywordflow">if</span> (dumpDir.empty())</div><div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;    {</div><div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;    }</div><div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;</div><div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;    <a class="code" href="_assert_8hpp.xhtml#a5698be69cbd5dfe6c28fcd9867e8cbed">ARMNN_ASSERT</a>(profiler);</div><div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160;</div><div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;    <span class="comment">// Set the name of the output profiling file.</span></div><div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;    fs::path dumpPath = dumpDir;</div><div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160;    <span class="keyword">const</span> fs::path fileName = dumpPath / (std::to_string(networkId) + <span class="stringliteral">&quot;_profiling.json&quot;</span>);</div><div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;</div><div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;    <span class="comment">// Open the ouput file for writing.</span></div><div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;    std::ofstream fileStream;</div><div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;    fileStream.open(fileName.c_str(), std::ofstream::out | std::ofstream::trunc);</div><div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;</div><div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;    <span class="keywordflow">if</span> (!fileStream.good())</div><div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;    {</div><div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;Could not open file %s for writing&quot;</span> &lt;&lt; fileName.c_str();</div><div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;        <span class="keywordflow">return</span>;</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;</div><div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;    <span class="comment">// Write the profiling info to a JSON file.</span></div><div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;    profiler-&gt;<a class="code" href="classarmnn_1_1_i_profiler.xhtml#a038bb767bbc6abc0ee0d9b509616b896">Print</a>(fileStream);</div><div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;}</div><div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;</div><div class="line"><a name="l00387"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a5304cf930377fc082e7494d20de2be12">  387</a></span>&#160;std::string <a class="code" href="namespacearmnn__driver.xhtml#a5304cf930377fc082e7494d20de2be12">ExportNetworkGraphToDotFile</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_optimized_network.xhtml">armnn::IOptimizedNetwork</a>&amp; optimizedNetwork,</div><div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;                                        <span class="keyword">const</span> std::string&amp; dumpDir)</div><div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;{</div><div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160;    std::string fileName;</div><div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;    <span class="comment">// The dump directory must exist in advance.</span></div><div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;    <span class="keywordflow">if</span> (dumpDir.empty())</div><div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160;    {</div><div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;        <span class="keywordflow">return</span> fileName;</div><div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;    }</div><div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;</div><div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;    std::string timestamp = <a class="code" href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">GetFileTimestamp</a>();</div><div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;    <span class="keywordflow">if</span> (timestamp.empty())</div><div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;    {</div><div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;        <span class="keywordflow">return</span> fileName;</div><div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;    }</div><div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;    <span class="comment">// Set the name of the output .dot file.</span></div><div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;    fs::path dumpPath = dumpDir;</div><div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;    fs::path tempFilePath = dumpPath / (timestamp + <span class="stringliteral">&quot;_networkgraph.dot&quot;</span>);</div><div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;    fileName = tempFilePath.string();</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;    VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;Exporting the optimized network graph to file: %s&quot;</span> &lt;&lt; fileName.c_str();</div><div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;    <span class="comment">// Write the network graph to a dot file.</span></div><div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;    std::ofstream fileStream;</div><div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;    fileStream.open(fileName, std::ofstream::out | std::ofstream::trunc);</div><div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;</div><div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;    <span class="keywordflow">if</span> (!fileStream.good())</div><div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;    {</div><div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;Could not open file %s for writing&quot;</span> &lt;&lt; fileName.c_str();</div><div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;        <span class="keywordflow">return</span> fileName;</div><div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;    }</div><div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;</div><div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;    <span class="keywordflow">if</span> (optimizedNetwork.<a class="code" href="classarmnn_1_1_i_optimized_network.xhtml#a26794f014974a6f963a8925de07bffeb">SerializeToDot</a>(fileStream) != <a class="code" href="namespacearmnn.xhtml#a67a0db04d321a74b7e7fcfd3f1a3f70ba505a83f220c02df2f85c3810cd9ceb38">armnn::Status::Success</a>)</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;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;An error occurred when writing to file %s&quot;</span> &lt;&lt; fileName.c_str();</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;    <span class="keywordflow">return</span> fileName;</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"><a class="line" href="namespacearmnn__driver.xhtml#a31f074135a3dba97d9baf1dffd0a07fd">  427</a></span>&#160;std::string <a class="code" href="namespacearmnn__driver.xhtml#a31f074135a3dba97d9baf1dffd0a07fd">SerializeNetwork</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_i_network.xhtml">armnn::INetwork</a>&amp; network,</div><div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;                             <span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;                             std::vector&lt;uint8_t&gt;&amp; dataCacheData,</div><div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;                             <span class="keywordtype">bool</span> dataCachingActive)</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;    std::string fileName;</div><div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    <span class="keywordtype">bool</span> bSerializeToFile = <span class="keyword">true</span>;</div><div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;    <span class="keywordflow">if</span> (dumpDir.empty())</div><div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;    {</div><div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;        bSerializeToFile = <span class="keyword">false</span>;</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">else</span></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;        std::string timestamp = <a class="code" href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">GetFileTimestamp</a>();</div><div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;        <span class="keywordflow">if</span> (timestamp.empty())</div><div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;        {</div><div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;            bSerializeToFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;        }</div><div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;    }</div><div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;    <span class="keywordflow">if</span> (!bSerializeToFile &amp;&amp; !dataCachingActive)</div><div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;    {</div><div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160;        <span class="keywordflow">return</span> fileName;</div><div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;    }</div><div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;    <span class="keyword">auto</span> <a class="code" href="namespacearmnn_serializer.xhtml">serializer</a>(<a class="code" href="classarmnn_serializer_1_1_i_serializer.xhtml#a3c51b5b078572dee02528bfae7202524">armnnSerializer::ISerializer::Create</a>());</div><div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;    <span class="comment">// Serialize the Network</span></div><div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;    <a class="code" href="namespacearmnn_serializer.xhtml">serializer</a>-&gt;Serialize(network);</div><div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;    <span class="keywordflow">if</span> (dataCachingActive)</div><div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;    {</div><div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;        std::stringstream stream;</div><div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;        <span class="keyword">auto</span> serialized = <a class="code" href="namespacearmnn_serializer.xhtml">serializer</a>-&gt;SaveSerializedToStream(stream);</div><div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;        <span class="keywordflow">if</span> (serialized)</div><div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;        {</div><div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;            std::string <span class="keyword">const</span> serializedString{stream.str()};</div><div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;            std::copy(serializedString.begin(),</div><div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;                      serializedString.end(),</div><div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;                      std::back_inserter(dataCacheData));</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;    }</div><div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;</div><div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;    <span class="keywordflow">if</span> (bSerializeToFile)</div><div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;    {</div><div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;        <span class="comment">// Set the name of the output .armnn file.</span></div><div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;        fs::path dumpPath = dumpDir;</div><div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;        std::string timestamp = <a class="code" href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">GetFileTimestamp</a>();</div><div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;        fs::path tempFilePath = dumpPath / (timestamp + <span class="stringliteral">&quot;_network.armnn&quot;</span>);</div><div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;        fileName = tempFilePath.string();</div><div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;</div><div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;        <span class="comment">// Save serialized network to a file</span></div><div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160;        std::ofstream serializedFile(fileName, std::ios::out | std::ios::binary);</div><div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;        <span class="keyword">auto</span> serialized = <a class="code" href="namespacearmnn_serializer.xhtml">serializer</a>-&gt;SaveSerializedToStream(serializedFile);</div><div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;        <span class="keywordflow">if</span> (!serialized)</div><div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;        {</div><div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;            VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;An error occurred when serializing to file %s&quot;</span> &lt;&lt; fileName.c_str();</div><div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;        }</div><div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160;    }</div><div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;    <span class="keywordflow">return</span> fileName;</div><div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;}</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"><a class="line" href="namespacearmnn__driver.xhtml#a208149d5c08f84debf8b265bb508fe02">  486</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespacearmnn__driver.xhtml#a208149d5c08f84debf8b265bb508fe02">IsDynamicTensor</a>(<span class="keyword">const</span> <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a>&amp; tensorInfo)</div><div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;{</div><div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;    <span class="keywordflow">if</span> (tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>().<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#a5a212540c00931bd2a4b4041beda33ae">GetDimensionality</a>() == <a class="code" href="namespacearmnn.xhtml#a8e1f31031ad31cd8cc22d7c9daa32681a4b7d504abac49ba24b4df86c129d3cbc">armnn::Dimensionality::NotSpecified</a>)</div><div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160;    {</div><div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="comment">// Account for the usage of the TensorShape empty constructor</span></div><div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    <span class="keywordflow">if</span> (tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>() == 0)</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">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160;    }</div><div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    <span class="keywordflow">return</span> !tensorInfo.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">GetShape</a>().<a class="code" href="classarmnn_1_1_tensor_shape.xhtml#acccb75bd1d68a81f6ddd61687f51c5a1">AreAllDimensionsSpecified</a>();</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;</div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a85d53debffd9611a3b5bc6031afd5073">  500</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespacearmnn__driver.xhtml#a85d53debffd9611a3b5bc6031afd5073">AreDynamicTensorsSupported</a>() <span class="comment">//TODO</span></div><div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;{</div><div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160;    <span class="keywordflow">return</span> <span class="keyword">true</span>;</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"><a class="line" href="namespacearmnn__driver.xhtml#ab3c135a0d4b1152f6b989ea6afddd6bc">  505</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="namespacearmnn__driver.xhtml#ab3c135a0d4b1152f6b989ea6afddd6bc">isQuantizedOperand</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn__driver.xhtml#a53bfb6eb38a90244ba166b641a6965d9">OperandType</a>&amp; operandType)</div><div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;{</div><div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    <span class="keywordflow">if</span> (operandType == OperandType::TENSOR_QUANT8_ASYMM ||</div><div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;        operandType == OperandType::TENSOR_QUANT8_SYMM_PER_CHANNEL ||</div><div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;        operandType == OperandType::TENSOR_QUANT8_SYMM ||</div><div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;        operandType == OperandType::TENSOR_QUANT16_SYMM ||</div><div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160;        operandType == OperandType::TENSOR_QUANT8_ASYMM_SIGNED)</div><div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    {</div><div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">true</span>;</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;    <span class="keywordflow">else</span></div><div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;    {</div><div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;        <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;    }</div><div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;}</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"><a class="line" href="namespacearmnn__driver.xhtml#a31b494d1b36f5ed7fc7556a0fbc2c17c">  521</a></span>&#160;std::string <a class="code" href="namespacearmnn__driver.xhtml#a31b494d1b36f5ed7fc7556a0fbc2c17c">GetModelSummary</a>(<span class="keyword">const</span> <a class="code" href="namespacearmnn__driver.xhtml#a923b39ec5f83672f50289cbaf5de6798">Model</a>&amp; model)</div><div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160;{</div><div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;    std::stringstream result;</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;    result &lt;&lt; model.main.inputIndexes.size() &lt;&lt; <span class="stringliteral">&quot; input(s), &quot;</span></div><div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;           &lt;&lt; model.main.operations.size() &lt;&lt; <span class="stringliteral">&quot; operation(s), &quot;</span></div><div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;           &lt;&lt; model.main.outputIndexes.size() &lt;&lt; <span class="stringliteral">&quot; output(s), &quot;</span></div><div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;           &lt;&lt; model.main.operands.size() &lt;&lt; <span class="stringliteral">&quot; operand(s) &quot;</span></div><div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;           &lt;&lt; std::endl;</div><div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;</div><div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;    result &lt;&lt; <span class="stringliteral">&quot;Inputs: &quot;</span>;</div><div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;    <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; model.main.inputIndexes.size(); i++)</div><div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    {</div><div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;        result &lt;&lt; <a class="code" href="namespacearmnn__driver.xhtml#ac0532f3c7d143a04aee7f5991ee5d381">GetOperandSummary</a>(model.main.operands[model.main.inputIndexes[i]]) &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160;    }</div><div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    result &lt;&lt; std::endl;</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;    result &lt;&lt; <span class="stringliteral">&quot;Operations: &quot;</span>;</div><div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;    <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; model.main.operations.size(); i++)</div><div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;    {</div><div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160;        result &lt;&lt; model.main.operations[i].type &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</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;    result &lt;&lt; std::endl;</div><div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;</div><div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;    result &lt;&lt; <span class="stringliteral">&quot;Outputs: &quot;</span>;</div><div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    <span class="keywordflow">for</span> (uint32_t i = 0; i &lt; model.main.outputIndexes.size(); i++)</div><div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    {</div><div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;        result &lt;&lt; <a class="code" href="namespacearmnn__driver.xhtml#ac0532f3c7d143a04aee7f5991ee5d381">GetOperandSummary</a>(model.main.operands[model.main.outputIndexes[i]]) &lt;&lt; <span class="stringliteral">&quot;, &quot;</span>;</div><div class="line"><a name="l00549"></a><span class="lineno">  549</span>&#160;    }</div><div class="line"><a name="l00550"></a><span class="lineno">  550</span>&#160;    result &lt;&lt; std::endl;</div><div class="line"><a name="l00551"></a><span class="lineno">  551</span>&#160;</div><div class="line"><a name="l00552"></a><span class="lineno">  552</span>&#160;    <span class="keywordflow">return</span> result.str();</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;</div><div class="line"><a name="l00555"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">  555</a></span>&#160;std::string <a class="code" href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">GetFileTimestamp</a>()</div><div class="line"><a name="l00556"></a><span class="lineno">  556</span>&#160;{</div><div class="line"><a name="l00557"></a><span class="lineno">  557</span>&#160;    <span class="comment">// used to get a timestamp to name diagnostic files (the ArmNN serialized graph</span></div><div class="line"><a name="l00558"></a><span class="lineno">  558</span>&#160;    <span class="comment">// and getSupportedOperations.txt files)</span></div><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;    timespec ts;</div><div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    <span class="keywordtype">int</span> iRet = clock_gettime(CLOCK_MONOTONIC_RAW, &amp;ts);</div><div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    std::stringstream ss;</div><div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;    <span class="keywordflow">if</span> (iRet == 0)</div><div class="line"><a name="l00563"></a><span class="lineno">  563</span>&#160;    {</div><div class="line"><a name="l00564"></a><span class="lineno">  564</span>&#160;        ss &lt;&lt; std::to_string(ts.tv_sec) &lt;&lt; <span class="stringliteral">&quot;_&quot;</span> &lt;&lt; std::to_string(ts.tv_nsec);</div><div class="line"><a name="l00565"></a><span class="lineno">  565</span>&#160;    }</div><div class="line"><a name="l00566"></a><span class="lineno">  566</span>&#160;    <span class="keywordflow">else</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;        VLOG(DRIVER) &lt;&lt; <span class="stringliteral">&quot;clock_gettime failed with errno &quot;</span> &lt;&lt;</div><div class="line"><a name="l00569"></a><span class="lineno">  569</span>&#160;            std::to_string(errno).c_str() &lt;&lt; <span class="stringliteral">&quot; : &quot;</span> &lt;&lt;</div><div class="line"><a name="l00570"></a><span class="lineno">  570</span>&#160;            std::strerror(errno);</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="keywordflow">return</span> ss.str();</div><div class="line"><a name="l00573"></a><span class="lineno">  573</span>&#160;}</div><div class="line"><a name="l00574"></a><span class="lineno">  574</span>&#160;</div><div class="line"><a name="l00575"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a3d30e31a46482fbc714fc34e0d5a1c90">  575</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#a3d30e31a46482fbc714fc34e0d5a1c90">RenameExportedFiles</a>(<span class="keyword">const</span> std::string&amp; existingSerializedFileName,</div><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;                         <span class="keyword">const</span> std::string&amp; existingDotFileName,</div><div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;                         <span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;                         <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a0d8160388a127c1a23b37bc88dc6e2ec">armnn::NetworkId</a> networkId)</div><div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160;{</div><div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    <span class="keywordflow">if</span> (dumpDir.empty())</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;        <span class="keywordflow">return</span>;</div><div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    }</div><div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <a class="code" href="namespacearmnn__driver.xhtml#a00b317cd97319ac7b6a248a768ceb201">RenameFile</a>(existingSerializedFileName, std::string(<span class="stringliteral">&quot;_network.armnn&quot;</span>), dumpDir, networkId);</div><div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;    <a class="code" href="namespacearmnn__driver.xhtml#a00b317cd97319ac7b6a248a768ceb201">RenameFile</a>(existingDotFileName, std::string(<span class="stringliteral">&quot;_networkgraph.dot&quot;</span>), dumpDir, networkId);</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="namespacearmnn__driver.xhtml#a00b317cd97319ac7b6a248a768ceb201">  588</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#a00b317cd97319ac7b6a248a768ceb201">RenameFile</a>(<span class="keyword">const</span> std::string&amp; existingName,</div><div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;                <span class="keyword">const</span> std::string&amp; extension,</div><div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;                <span class="keyword">const</span> std::string&amp; dumpDir,</div><div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;                <span class="keyword">const</span> <a class="code" href="namespacearmnn.xhtml#a0d8160388a127c1a23b37bc88dc6e2ec">armnn::NetworkId</a> networkId)</div><div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;{</div><div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160;    <span class="keywordflow">if</span> (existingName.empty() || dumpDir.empty())</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>;</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;    fs::path dumpPath = dumpDir;</div><div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;    <span class="keyword">const</span> fs::path newFileName = dumpPath / (std::to_string(networkId) + extension);</div><div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160;    <span class="keywordtype">int</span> iRet = rename(existingName.c_str(), newFileName.c_str());</div><div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="keywordflow">if</span> (iRet != 0)</div><div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;    {</div><div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;        std::stringstream ss;</div><div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;        ss &lt;&lt; <span class="stringliteral">&quot;rename of [&quot;</span> &lt;&lt; existingName &lt;&lt; <span class="stringliteral">&quot;] to [&quot;</span> &lt;&lt; newFileName &lt;&lt; <span class="stringliteral">&quot;] failed with errno &quot;</span></div><div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;           &lt;&lt; std::to_string(errno) &lt;&lt; <span class="stringliteral">&quot; : &quot;</span> &lt;&lt; std::strerror(errno);</div><div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;        VLOG(DRIVER) &lt;&lt; ss.str().c_str();</div><div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;    }</div><div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;}</div><div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;</div><div class="line"><a name="l00610"></a><span class="lineno"><a class="line" href="namespacearmnn__driver.xhtml#a7c1c80ee0f432b6b621c40571410195a">  610</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="namespacearmnn__driver.xhtml#a7c1c80ee0f432b6b621c40571410195a">CommitPools</a>(std::vector&lt;::android::nn::RunTimePoolInfo&gt;&amp; memPools)</div><div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160;{</div><div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;    <span class="comment">// Commit output buffers.</span></div><div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160;    <span class="comment">// Note that we update *all* pools, even if they aren&#39;t actually used as outputs -</span></div><div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    <span class="comment">// this is simpler and is what the CpuExecutor does.</span></div><div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    <span class="keywordflow">for</span> (<span class="keyword">auto</span>&amp; pool : memPools)</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="comment">// Type android::nn::RunTimePoolInfo has changed between Android P &amp; Q and Android R, where</span></div><div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;        <span class="comment">// update() has been removed and flush() added.</span></div><div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;        pool.flush();</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;}</div><div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160;} <span class="comment">// namespace armnn_driver</span></div><div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml_a8846406ac37fbd2204f0be16ee05d5b7"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml#a8846406ac37fbd2204f0be16ee05d5b7">armnn::TensorShape::GetNumElements</a></div><div class="ttdeci">unsigned int GetNumElements() const</div><div class="ttdoc">Function that calculates the tensor elements by multiplying all dimension size which are Specified...</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.xhtml#l00181">Tensor.cpp:181</a></div></div>
<div class="ttc" id="_canonical_utils_8hpp_xhtml"><div class="ttname"><a href="_canonical_utils_8hpp.xhtml">CanonicalUtils.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a27226c864bac7454a8504f8edb15d95b"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a27226c864bac7454a8504f8edb15d95b">armnn::DataType::Boolean</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_a8b5d0f8a24e9d9238f412260a552acf8"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a8b5d0f8a24e9d9238f412260a552acf8">armnn::TensorInfo::GetShape</a></div><div class="ttdeci">const TensorShape &amp; GetShape() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00191">Tensor.hpp:191</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a8e1f31031ad31cd8cc22d7c9daa32681a4b7d504abac49ba24b4df86c129d3cbc"><div class="ttname"><a href="namespacearmnn.xhtml#a8e1f31031ad31cd8cc22d7c9daa32681a4b7d504abac49ba24b4df86c129d3cbc">armnn::Dimensionality::NotSpecified</a></div></div>
<div class="ttc" id="_utils_8hpp_xhtml"><div class="ttname"><a href="_utils_8hpp.xhtml">Utils.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_serializer_xhtml"><div class="ttname"><a href="namespacearmnn_serializer.xhtml">armnnSerializer</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_serializer_8hpp_source.xhtml#l00011">ISerializer.hpp:11</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml_acccb75bd1d68a81f6ddd61687f51c5a1"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml#acccb75bd1d68a81f6ddd61687f51c5a1">armnn::TensorShape::AreAllDimensionsSpecified</a></div><div class="ttdeci">bool AreAllDimensionsSpecified() const</div><div class="ttdoc">Checks if there is at least one dimension not specified. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8cpp_source.xhtml#l00241">Tensor.cpp:241</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_tensor_shape_xhtml_a5a212540c00931bd2a4b4041beda33ae"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml#a5a212540c00931bd2a4b4041beda33ae">armnn::TensorShape::GetDimensionality</a></div><div class="ttdeci">Dimensionality GetDimensionality() const</div><div class="ttdoc">Function that returns the tensor type. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00092">Tensor.hpp:92</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a96666c2945d7fe8c34aee30a449287d5"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a96666c2945d7fe8c34aee30a449287d5">armnn_driver::GetMemoryFromPool</a></div><div class="ttdeci">void * GetMemoryFromPool(DataLocation location, const std::vector&lt; android::nn::RunTimePoolInfo &gt; &amp;memPools)</div><div class="ttdoc">Returns a pointer to a specific location in a pool`. </div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00066">CanonicalUtils.cpp:66</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml_a038bb767bbc6abc0ee0d9b509616b896"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml#a038bb767bbc6abc0ee0d9b509616b896">armnn::IProfiler::Print</a></div><div class="ttdeci">void Print(std::ostream &amp;outStream) const</div><div class="ttdoc">Print stats for events in JSON Format to the given output stream. </div><div class="ttdef"><b>Definition:</b> <a href="_profiling_8cpp_source.xhtml#l00630">Profiling.cpp:630</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_network_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_network.xhtml">armnn::INetwork</a></div><div class="ttdoc">Main network class which provides the interface for building up a neural network. ...</div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00261">INetwork.hpp:261</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a9d02ea768c081d4bdb2b7cab0b3f510d"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9d02ea768c081d4bdb2b7cab0b3f510d">armnn::DataType::QAsymmS8</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a053c769dcf82d66ef326c86980c02ba7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a053c769dcf82d66ef326c86980c02ba7">armnn::DataType::QSymmS16</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a31b494d1b36f5ed7fc7556a0fbc2c17c"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a31b494d1b36f5ed7fc7556a0fbc2c17c">armnn_driver::GetModelSummary</a></div><div class="ttdeci">std::string GetModelSummary(const Model &amp;model)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00521">CanonicalUtils.cpp:521</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__driver_xhtml_aa25bddb175983b2d3e0965440323d789"><div class="ttname"><a href="namespacearmnn__driver.xhtml#aa25bddb175983b2d3e0965440323d789">armnn_driver::DumpTensor</a></div><div class="ttdeci">void DumpTensor(const std::string &amp;dumpDir, const std::string &amp;requestName, const std::string &amp;tensorName, const TensorType &amp;tensor)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00217">CanonicalUtils.cpp:217</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_shape_xhtml"><div class="ttname"><a href="classarmnn_1_1_tensor_shape.xhtml">armnn::TensorShape</a></div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00020">Tensor.hpp:20</a></div></div>
<div class="ttc" id="classarmnn__driver_1_1_unsupported_operand_xhtml"><div class="ttname"><a href="classarmnn__driver_1_1_unsupported_operand.xhtml">armnn_driver::UnsupportedOperand</a></div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8hpp_source.xhtml#l00027">CanonicalUtils.hpp:27</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a53bfb6eb38a90244ba166b641a6965d9"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a53bfb6eb38a90244ba166b641a6965d9">armnn_driver::OperandType</a></div><div class="ttdeci">::android::nn::OperandType OperandType</div><div class="ttdef"><b>Definition:</b> <a href="_conversion_utils_8hpp_source.xhtml#l00046">ConversionUtils.hpp:46</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a34209101a89c1ae72081a0fb53725852"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a34209101a89c1ae72081a0fb53725852">armnn_driver::DumpElementFunction</a></div><div class="ttdeci">void(*)(const TensorType &amp;tensor, unsigned int elementIndex, std::ofstream &amp;fileStream) DumpElementFunction</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00204">CanonicalUtils.cpp:204</a></div></div>
<div class="ttc" id="namespaceandroid_xhtml"><div class="ttname"><a href="namespaceandroid.xhtml">android</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_ae059aea66ee0867a204aa2f2d9abb42c"><div class="ttname"><a href="namespacearmnn__driver.xhtml#ae059aea66ee0867a204aa2f2d9abb42c">armnn_driver::g_DontPermute</a></div><div class="ttdeci">const armnn::PermutationVector g_DontPermute</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00038">CanonicalUtils.cpp:38</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="namespacearmnn__driver_xhtml_a5665b88a0b22c6341dd8075048981689"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a5665b88a0b22c6341dd8075048981689">armnn_driver::SwizzleAndroidNn4dTensorToArmNn</a></div><div class="ttdeci">void SwizzleAndroidNn4dTensorToArmNn(armnn::TensorInfo &amp;tensorInfo, const void *input, void *output, const armnn::PermutationVector &amp;mappings)</div><div class="ttdoc">Swizzles tensor data in input according to the dimension mappings. </div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00040">CanonicalUtils.cpp:40</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a85d53debffd9611a3b5bc6031afd5073"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a85d53debffd9611a3b5bc6031afd5073">armnn_driver::AreDynamicTensorsSupported</a></div><div class="ttdeci">bool AreDynamicTensorsSupported()</div><div class="ttdoc">Checks for ArmNN support of dynamic tensors. </div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00500">CanonicalUtils.cpp:500</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a3d30e31a46482fbc714fc34e0d5a1c90"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a3d30e31a46482fbc714fc34e0d5a1c90">armnn_driver::RenameExportedFiles</a></div><div class="ttdeci">void RenameExportedFiles(const std::string &amp;existingSerializedFileName, const std::string &amp;existingDotFileName, const std::string &amp;dumpDir, const armnn::NetworkId networkId)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00575">CanonicalUtils.cpp:575</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="_permute_8hpp_xhtml"><div class="ttname"><a href="_permute_8hpp.xhtml">Permute.hpp</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a923b39ec5f83672f50289cbaf5de6798"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a923b39ec5f83672f50289cbaf5de6798">armnn_driver::Model</a></div><div class="ttdeci">::android::nn::Model Model</div><div class="ttdoc">Helper classes. </div><div class="ttdef"><b>Definition:</b> <a href="_conversion_utils_8hpp_source.xhtml#l00043">ConversionUtils.hpp:43</a></div></div>
<div class="ttc" id="_i_serializer_8hpp_xhtml"><div class="ttname"><a href="_i_serializer_8hpp.xhtml">ISerializer.hpp</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6">armnn::DataType</a></div><div class="ttdeci">DataType</div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00048">Types.hpp:48</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a31f074135a3dba97d9baf1dffd0a07fd"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a31f074135a3dba97d9baf1dffd0a07fd">armnn_driver::SerializeNetwork</a></div><div class="ttdeci">std::string SerializeNetwork(const armnn::INetwork &amp;network, const std::string &amp;dumpDir, std::vector&lt; uint8_t &gt; &amp;dataCacheData, bool dataCachingActive)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00427">CanonicalUtils.cpp:427</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a915f2652854e417e26afc297f12e107c"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a915f2652854e417e26afc297f12e107c">armnn_driver::GetMemoryFromPointer</a></div><div class="ttdeci">void * GetMemoryFromPointer(const Request::Argument &amp;requestArg)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00077">CanonicalUtils.cpp:77</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_aea909c7327109228ef618d459015def3"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#aea909c7327109228ef618d459015def3">armnn::TensorInfo::GetDataType</a></div><div class="ttdeci">DataType GetDataType() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00198">Tensor.hpp:198</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a0a3f57c876f5a230244c38e1453a8a6e">armnn::DataType::QAsymmU8</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_optimized_network_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_optimized_network.xhtml">armnn::IOptimizedNetwork</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_network_8hpp_source.xhtml#l00770">INetwork.hpp:770</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a0b49aa352b84d572942185ce72cef751"><div class="ttname"><a href="namespacearmnn.xhtml#a0b49aa352b84d572942185ce72cef751">armnn::Half</a></div><div class="ttdeci">half_float::half Half</div><div class="ttdef"><b>Definition:</b> <a href="_half_8hpp_source.xhtml#l00022">Half.hpp:22</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a93f4874062e34819806d36b74c73dc61"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a93f4874062e34819806d36b74c73dc61">armnn_driver::GetTensorInfoForOperand</a></div><div class="ttdeci">armnn::TensorInfo GetTensorInfoForOperand(const Operand &amp;operand)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00097">CanonicalUtils.cpp:97</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7"><div class="ttname"><a href="namespacearmnn.xhtml#a56943a0946e5f15e5e58054b8e7a04a4afa662c6eb71caef475b2b981ce8eccd7">armnn::LayerType::Permute</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#l00035">IRuntime.hpp:35</a></div></div>
<div class="ttc" id="classarmnn_1_1_const_tensor_xhtml"><div class="ttname"><a href="classarmnn_1_1_const_tensor.xhtml">armnn::ConstTensor</a></div><div class="ttdoc">A tensor defined by a TensorInfo (shape and data type) and an immutable backing store. </div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00327">Tensor.hpp:327</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a26e6ed77470c6f2f830ecf874e6c0d55"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a26e6ed77470c6f2f830ecf874e6c0d55">armnn::DataType::Float16</a></div></div>
<div class="ttc" id="_utils_8hpp_xhtml_abbf421eb1186af0d505648ed2ea54a00"><div class="ttname"><a href="_utils_8hpp.xhtml#abbf421eb1186af0d505648ed2ea54a00">ARMNN_FALLTHROUGH</a></div><div class="ttdeci">#define ARMNN_FALLTHROUGH</div><div class="ttdef"><b>Definition:</b> <a href="_utils_8hpp_source.xhtml#l00037">Utils.hpp:37</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="namespaceandroid_1_1nn_xhtml"><div class="ttname"><a href="namespaceandroid_1_1nn.xhtml">android::nn</a></div><div class="ttdef"><b>Definition:</b> <a href="support__library__service_8cpp_source.xhtml#l00010">support_library_service.cpp:10</a></div></div>
<div class="ttc" id="classarmnn_1_1_permutation_vector_xhtml"><div class="ttname"><a href="classarmnn_1_1_permutation_vector.xhtml">armnn::PermutationVector</a></div><div class="ttdef"><b>Definition:</b> <a href="_types_8hpp_source.xhtml#l00295">Types.hpp:295</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a208149d5c08f84debf8b265bb508fe02"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a208149d5c08f84debf8b265bb508fe02">armnn_driver::IsDynamicTensor</a></div><div class="ttdeci">bool IsDynamicTensor(const armnn::TensorInfo &amp;tensorInfo)</div><div class="ttdoc">Checks if a tensor info represents a dynamic tensor. </div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00486">CanonicalUtils.cpp:486</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_profiler_xhtml"><div class="ttname"><a href="classarmnn_1_1_i_profiler.xhtml">armnn::IProfiler</a></div><div class="ttdef"><b>Definition:</b> <a href="_i_profiler_8hpp_source.xhtml#l00021">IProfiler.hpp:21</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_a8e1f31031ad31cd8cc22d7c9daa32681af60357a8d17e45793298323f1b372a74"><div class="ttname"><a href="namespacearmnn.xhtml#a8e1f31031ad31cd8cc22d7c9daa32681af60357a8d17e45793298323f1b372a74">armnn::Dimensionality::Scalar</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_ac0532f3c7d143a04aee7f5991ee5d381"><div class="ttname"><a href="namespacearmnn__driver.xhtml#ac0532f3c7d143a04aee7f5991ee5d381">armnn_driver::GetOperandSummary</a></div><div class="ttdeci">std::string GetOperandSummary(const Operand &amp;operand)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00189">CanonicalUtils.cpp:189</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a5304cf930377fc082e7494d20de2be12"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a5304cf930377fc082e7494d20de2be12">armnn_driver::ExportNetworkGraphToDotFile</a></div><div class="ttdeci">std::string ExportNetworkGraphToDotFile(const armnn::IOptimizedNetwork &amp;optimizedNetwork, const std::string &amp;dumpDir)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00387">CanonicalUtils.cpp:387</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="namespacearmnn__driver_xhtml_aa9b4bc8d4cfb04be14771dbb1bc1a1ac"><div class="ttname"><a href="namespacearmnn__driver.xhtml#aa9b4bc8d4cfb04be14771dbb1bc1a1ac">armnn_driver::Operand</a></div><div class="ttdeci">::android::nn::Operand Operand</div><div class="ttdef"><b>Definition:</b> <a href="_conversion_utils_8hpp_source.xhtml#l00044">ConversionUtils.hpp:44</a></div></div>
<div class="ttc" id="classarmnn_1_1_i_optimized_network_xhtml_a26794f014974a6f963a8925de07bffeb"><div class="ttname"><a href="classarmnn_1_1_i_optimized_network.xhtml#a26794f014974a6f963a8925de07bffeb">armnn::IOptimizedNetwork::SerializeToDot</a></div><div class="ttdeci">Status SerializeToDot(std::ostream &amp;stream) const</div><div class="ttdef"><b>Definition:</b> <a href="_network_8cpp_source.xhtml#l00485">Network.cpp:485</a></div></div>
<div class="ttc" id="classarmnn_serializer_1_1_i_serializer_xhtml_a3c51b5b078572dee02528bfae7202524"><div class="ttname"><a href="classarmnn_serializer_1_1_i_serializer.xhtml#a3c51b5b078572dee02528bfae7202524">armnnSerializer::ISerializer::Create</a></div><div class="ttdeci">static ISerializerPtr Create()</div><div class="ttdef"><b>Definition:</b> <a href="_serializer_8cpp_source.xhtml#l00035">Serializer.cpp:35</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a166495adc0d0f53bee6baecc577f5204">armnn::DataType::Float32</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6a9945327825b115e93a3b89f4302e76db"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6a9945327825b115e93a3b89f4302e76db">armnn::DataType::QSymmS8</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_ab3c135a0d4b1152f6b989ea6afddd6bc"><div class="ttname"><a href="namespacearmnn__driver.xhtml#ab3c135a0d4b1152f6b989ea6afddd6bc">armnn_driver::isQuantizedOperand</a></div><div class="ttdeci">bool isQuantizedOperand(const OperandType &amp;operandType)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00505">CanonicalUtils.cpp:505</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a7c1c80ee0f432b6b621c40571410195a"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a7c1c80ee0f432b6b621c40571410195a">armnn_driver::CommitPools</a></div><div class="ttdeci">void CommitPools(std::vector&lt;::android::nn::RunTimePoolInfo &gt; &amp;memPools)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00610">CanonicalUtils.cpp:610</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a419cd7b9bad83f31f6db8ba9a3b9517a"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a419cd7b9bad83f31f6db8ba9a3b9517a">armnn_driver::GetFileTimestamp</a></div><div class="ttdeci">std::string GetFileTimestamp()</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00555">CanonicalUtils.cpp:555</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_a00b317cd97319ac7b6a248a768ceb201"><div class="ttname"><a href="namespacearmnn__driver.xhtml#a00b317cd97319ac7b6a248a768ceb201">armnn_driver::RenameFile</a></div><div class="ttdeci">void RenameFile(const std::string &amp;existingName, const std::string &amp;extension, const std::string &amp;dumpDir, const armnn::NetworkId networkId)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00588">CanonicalUtils.cpp:588</a></div></div>
<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_a157e27d41e9f6b21f0d3c025fa47dc24"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">armnn::TensorInfo::GetNumDimensions</a></div><div class="ttdeci">unsigned int GetNumDimensions() const</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00195">Tensor.hpp:195</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml"><div class="ttname"><a href="namespacearmnn__driver.xhtml">armnn_driver</a></div><div class="ttdoc">Helper classes. </div><div class="ttdef"><b>Definition:</b> <a href="_armnn_device_8cpp_source.xhtml#l00037">ArmnnDevice.cpp:37</a></div></div>
<div class="ttc" id="namespacearmnn_utils_xhtml_abeaf4f6785039866fd075f4569ba8e84"><div class="ttname"><a href="namespacearmnn_utils.xhtml#abeaf4f6785039866fd075f4569ba8e84">armnnUtils::Permuted</a></div><div class="ttdeci">armnn::TensorShape Permuted(const armnn::TensorShape &amp;srcShape, const armnn::PermutationVector &amp;mappings)</div><div class="ttdef"><b>Definition:</b> <a href="_permute_8cpp_source.xhtml#l00098">Permute.cpp:98</a></div></div>
<div class="ttc" id="namespacearmnn__driver_xhtml_aa313ae79f70102e3451d45d3387c2e46"><div class="ttname"><a href="namespacearmnn__driver.xhtml#aa313ae79f70102e3451d45d3387c2e46">armnn_driver::DumpJsonProfilingIfRequired</a></div><div class="ttdeci">void DumpJsonProfilingIfRequired(bool gpuProfilingEnabled, const std::string &amp;dumpDir, armnn::NetworkId networkId, const armnn::IProfiler *profiler)</div><div class="ttdef"><b>Definition:</b> <a href="_canonical_utils_8cpp_source.xhtml#l00350">CanonicalUtils.cpp:350</a></div></div>
<div class="ttc" id="namespacearmnn_xhtml_aa02b9e06fb20fa3c13da0427e6ee5ab2"><div class="ttname"><a href="namespacearmnn.xhtml#aa02b9e06fb20fa3c13da0427e6ee5ab2">armnn::GetDataTypeSize</a></div><div class="ttdeci">constexpr unsigned int GetDataTypeSize(DataType dataType)</div><div class="ttdef"><b>Definition:</b> <a href="_types_utils_8hpp_source.xhtml#l00151">TypesUtils.hpp:151</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_b4dbf96392bc72a402a7206cbda88a03.xhtml">shim</a></li><li class="navelem"><a class="el" href="dir_09eea26cf0279feb9fcfb9b796a3e57e.xhtml">sl</a></li><li class="navelem"><a class="el" href="dir_6de13b49022bb7cfc6557e28050d5cbe.xhtml">canonical</a></li><li class="navelem"><a class="el" href="_canonical_utils_8cpp.xhtml">CanonicalUtils.cpp</a></li>
    <li class="footer">Generated on Wed Nov 23 2022 10:57:36 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>