diff options
author | David Monahan <david.monahan@arm.com> | 2023-03-22 16:48:58 +0000 |
---|---|---|
committer | David Monahan <david.monahan@arm.com> | 2023-03-22 16:48:58 +0000 |
commit | ae050524109f1ce827962665436ef7430f2ac479 (patch) | |
tree | a087fe0c77570971dd7979f2757426c24e91afc7 /23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml | |
parent | 8d2ca734165a068478df7cffa46185680b05cd20 (diff) | |
download | armnn-ae050524109f1ce827962665436ef7430f2ac479.tar.gz |
IVGCVSW-7255 Update Doxygen Documentation and publish on GitHub.
* Updating Doxygen documentation for 23.02 release.
Signed-off-by: David Monahan <david.monahan@arm.com>
Change-Id: I545574ff7664b4595d2fe6a91a3c35d2ad55df82
Diffstat (limited to '23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml')
-rw-r--r-- | 23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml | 171 |
1 files changed, 138 insertions, 33 deletions
diff --git a/23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml b/23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml index 22becb5c04..b83b858170 100644 --- a/23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml +++ b/23.02/classarmnn_1_1_neon_gather_nd_workload.xhtml @@ -8,7 +8,7 @@ <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="generator" content="Doxygen 1.8.17"/> <meta name="robots" content="NOINDEX, NOFOLLOW" /> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>ArmNN: NeonGatherNdWorkload Class Reference</title> @@ -19,9 +19,6 @@ <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> @@ -30,7 +27,8 @@ extensions: ["tex2jax.js"], jax: ["input/TeX","output/HTML-CSS"], }); -</script><script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js"></script> +</script> +<script type="text/javascript" async="async" 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> @@ -51,18 +49,21 @@ </table> </div> <!-- end header part --> -<!-- Generated by Doxygen 1.8.13 --> +<!-- Generated by Doxygen 1.8.17 --> <script type="text/javascript"> +/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ var searchBox = new SearchBox("searchBox", "search",false,'Search'); +/* @license-end */ </script> <script type="text/javascript" src="menudata.js"></script> <script type="text/javascript" src="menu.js"></script> <script type="text/javascript"> +/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ $(function() { initMenu('',true,false,'search.php','Search'); $(document).ready(function() { init_search(); }); }); -</script> +/* @license-end */</script> <div id="main-nav"></div> </div><!-- top --> <div id="side-nav" class="ui-resizable side-nav-resizable"> @@ -76,7 +77,9 @@ $(function() { </div> </div> <script type="text/javascript"> -$(document).ready(function(){initNavTree('classarmnn_1_1_neon_gather_nd_workload.xhtml','');}); +/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */ +$(document).ready(function(){initNavTree('classarmnn_1_1_neon_gather_nd_workload.xhtml',''); initResizable(); }); +/* @license-end */ </script> <div id="doc-content"> <!-- window showing the filter options --> @@ -111,13 +114,13 @@ Inheritance diagram for NeonGatherNdWorkload:</div> <map id="NeonGatherNdWorkload_map" name="NeonGatherNdWorkload_map"> <area href="classarmnn_1_1_neon_base_workload.xhtml" alt="NeonBaseWorkload< GatherNdQueueDescriptor >" shape="rect" coords="0,112,298,136"/> <area href="classarmnn_1_1_base_workload.xhtml" alt="BaseWorkload< GatherNdQueueDescriptor >" shape="rect" coords="0,56,298,80"/> -<area href="classarmnn_1_1_i_workload.xhtml" title="Workload interface to enqueue a layer computation. " alt="IWorkload" shape="rect" coords="0,0,298,24"/> -</map> - </div></div> +<area href="classarmnn_1_1_i_workload.xhtml" title="Workload interface to enqueue a layer computation." alt="IWorkload" shape="rect" coords="0,0,298,24"/> + </map> +</div></div> <table class="memberdecls"> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a> Public Member Functions</h2></td></tr> -<tr class="memitem:aed7f95d9f00861351b0bd4d7b17e27b2"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_neon_gather_nd_workload.xhtml#aed7f95d9f00861351b0bd4d7b17e27b2">NeonGatherNdWorkload</a> (const <a class="el" href="structarmnn_1_1_gather_nd_queue_descriptor.xhtml">GatherNdQueueDescriptor</a> &descriptor, const <a class="el" href="structarmnn_1_1_workload_info.xhtml">WorkloadInfo</a> &<a class="el" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>)</td></tr> +<tr class="memitem:aed7f95d9f00861351b0bd4d7b17e27b2"><td class="memItemLeft" align="right" valign="top"> </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_neon_gather_nd_workload.xhtml#aed7f95d9f00861351b0bd4d7b17e27b2">NeonGatherNdWorkload</a> (const <a class="el" href="structarmnn_1_1_gather_nd_queue_descriptor.xhtml">GatherNdQueueDescriptor</a> &descriptor, const <a class="el" href="structarmnn_1_1_workload_info.xhtml">WorkloadInfo</a> &info)</td></tr> <tr class="separator:aed7f95d9f00861351b0bd4d7b17e27b2"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ae071e8822437c78baea75c3aef3a263a"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_neon_gather_nd_workload.xhtml#ae071e8822437c78baea75c3aef3a263a">Execute</a> () const override</td></tr> <tr class="separator:ae071e8822437c78baea75c3aef3a263a"><td class="memSeparator" colspan="2"> </td></tr> @@ -144,6 +147,10 @@ Public Member Functions</h2></td></tr> <tr class="inherit_header pub_methods_classarmnn_1_1_i_workload"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classarmnn_1_1_i_workload')"><img src="closed.png" alt="-"/> Public Member Functions inherited from <a class="el" href="classarmnn_1_1_i_workload.xhtml">IWorkload</a></td></tr> <tr class="memitem:a69c83c02ae8de866bc7a46c49e69c1ba inherit pub_methods_classarmnn_1_1_i_workload"><td class="memItemLeft" align="right" valign="top">virtual </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_workload.xhtml#a69c83c02ae8de866bc7a46c49e69c1ba">~IWorkload</a> ()</td></tr> <tr class="separator:a69c83c02ae8de866bc7a46c49e69c1ba inherit pub_methods_classarmnn_1_1_i_workload"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a00f887eb14b9ed163d795b31c4964965 inherit pub_methods_classarmnn_1_1_i_workload"><td class="memItemLeft" align="right" valign="top">virtual arm::pipe::ProfilingGuid </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_workload.xhtml#a00f887eb14b9ed163d795b31c4964965">GetGuid</a> () const =0</td></tr> +<tr class="separator:a00f887eb14b9ed163d795b31c4964965 inherit pub_methods_classarmnn_1_1_i_workload"><td class="memSeparator" colspan="2"> </td></tr> +<tr class="memitem:a9cc47a21a60b5e47247cde5e660e29ce inherit pub_methods_classarmnn_1_1_i_workload"><td class="memItemLeft" align="right" valign="top">virtual bool </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_workload.xhtml#a9cc47a21a60b5e47247cde5e660e29ce">SupportsTensorHandleReplacement</a> () const =0</td></tr> +<tr class="separator:a9cc47a21a60b5e47247cde5e660e29ce inherit pub_methods_classarmnn_1_1_i_workload"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ab81312bd5e64cbae2803de9f243bdb32 inherit pub_methods_classarmnn_1_1_i_workload"><td class="memItemLeft" align="right" valign="top">virtual void </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_workload.xhtml#ab81312bd5e64cbae2803de9f243bdb32">RegisterDebugCallback</a> (const <a class="el" href="namespacearmnn.xhtml#a15f3ad9b5e4e3d46b0a6dda246a7bc28">DebugCallbackFunction</a> &)</td></tr> <tr class="separator:ab81312bd5e64cbae2803de9f243bdb32 inherit pub_methods_classarmnn_1_1_i_workload"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:a2d2834d1029217934f504e3e59579081 inherit pub_methods_classarmnn_1_1_i_workload"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classarmnn_1_1_optional.xhtml">armnn::Optional</a>< <a class="el" href="structarmnn_1_1_memory_requirements.xhtml">armnn::MemoryRequirements</a> > </td><td class="memItemRight" valign="bottom"><a class="el" href="classarmnn_1_1_i_workload.xhtml#a2d2834d1029217934f504e3e59579081">GetMemoryRequirements</a> ()</td></tr> @@ -190,24 +197,102 @@ Additional Inherited Members</h2></td></tr> </table> </div><div class="memdoc"> <p>Calculate flattened indices: m_FlattenedIndices = indices * m_FlattenedCoeff. This could be done using MatMul instead of multiplication followed by reduce sum operation, but GeMM does not support s32 at the moment.</p> -<p>Call Gather with adequate shapes </p> +<p>Call Gather with adequate shapes</p> <p class="definition">Definition at line <a class="el" href="_neon_gather_nd_workload_8cpp_source.xhtml#l00097">97</a> of file <a class="el" href="_neon_gather_nd_workload_8cpp_source.xhtml">NeonGatherNdWorkload.cpp</a>.</p> - -<p class="reference">References <a class="el" href="_workload_utils_8cpp_source.xhtml#l00300">armnn::CalculateGatherNdKeyIndices()</a>, <a class="el" href="_workload_8hpp_source.xhtml#l00083">BaseWorkload< GatherNdQueueDescriptor >::m_Data</a>, <a class="el" href="_workload_data_8hpp_source.xhtml#l00026">QueueDescriptor::m_Inputs</a>, <a class="el" href="include_2armnn_2backends_2_workload_info_8hpp_source.xhtml#l00018">WorkloadInfo::m_InputTensorInfos</a>, <a class="el" href="_workload_data_8hpp_source.xhtml#l00027">QueueDescriptor::m_Outputs</a>, <a class="el" href="include_2armnn_2backends_2_workload_info_8hpp_source.xhtml#l00019">WorkloadInfo::m_OutputTensorInfos</a>, <a class="el" href="_tensor_8hpp_source.xhtml#l00193">TensorInfo::SetShape()</a>, and <a class="el" href="_workload_data_8cpp_source.xhtml#l00475">QueueDescriptor::ValidateInputsOutputs()</a>.</p> -<div class="fragment"><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  : NeonBaseWorkload<GatherNdQueueDescriptor>(descriptor, <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>)</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a765d2cee4ccce5b9467e0c2b6d25b84a">ValidateInputsOutputs</a>(<span class="stringliteral">"NeonGatherNdWorkload"</span>, 2, 1);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  TensorInfo paramsInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_InputTensorInfos[0];</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  TensorInfo indicesInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_InputTensorInfos[1];</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  TensorInfo outputInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_OutputTensorInfos[0];</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>[0])->GetTensor();</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  arm_compute::ITensor& indices = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>[1])->GetTensor();</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>[0])->GetTensor();</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Calculate ND, K, W, C.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  std::map<std::string, unsigned int> keyIndices = <a class="code" href="namespacearmnn.xhtml#ac40d3e4035af5fbe68d9e126a8d6367c">CalculateGatherNdKeyIndices</a>(paramsInfo, indicesInfo);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment"></span></div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> /// Calculate flattened indices: m_FlattenedIndices = indices * m_FlattenedCoeff.</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment"> /// This could be done using MatMul instead of multiplication followed by reduce sum operation,</span></div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment"> /// but GeMM does not support s32 at the moment.</span></div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"></span></div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// Prepare the tensor to store the output of the reduce_sum operation</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> flattenedIndices_Info = indicesInfo;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  flattenedIndices_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>] });</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  BuildArmComputeTensor(m_FlattenedIndices, flattenedIndices_Info);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_FlattenedIndices);</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> </div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Reshape indices into { W, ND }</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  indices.info()->set_tensor_shape(BuildArmComputeTensorShape({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"ND"</span>] }));</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="comment">// Calculate the m_FlattenedCoeff</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  TensorShape paramsShape = paramsInfo.GetShape();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  std::vector<int32_t> flattenedCoeff(keyIndices[<span class="stringliteral">"ND"</span>], 1);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1; i < keyIndices[<span class="stringliteral">"ND"</span>]; ++i)</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  flattenedCoeff[i - 1] = <span class="keyword">static_cast<</span>int32_t<span class="keyword">></span>(paramsShape[i]);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = keyIndices[<span class="stringliteral">"ND"</span>] - 1; i > 0; --i)</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  {</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  flattenedCoeff[i - 1] *= flattenedCoeff[i];</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> flattenedCoeff_Info = indicesInfo;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  flattenedCoeff_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"ND"</span>] });</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  BuildArmComputeTensor(m_FlattenedCoeff, flattenedCoeff_Info);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_FlattenedCoeff);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(indicesInfo.GetDataType() == <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="stringliteral">"flattenedCoeff must be same data type as m_FlattenedCoeff"</span>);</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  CopyArmComputeITensorData<int32_t>(flattenedCoeff.data(), m_FlattenedCoeff);</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="comment">// Prepare the tensor to store the output of the multiplication</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> outputMul_Info = indicesInfo;</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  outputMul_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"ND"</span>] });</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  BuildArmComputeTensor(m_OutputMul, outputMul_Info);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputMul);</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="comment">// Multiply</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  m_MulLayer.configure(&indices,</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  &m_FlattenedCoeff,</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  &m_OutputMul,</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  1.0f,</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  arm_compute::ConvertPolicy::WRAP,</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  arm_compute::RoundingPolicy::TO_ZERO,</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  arm_compute::ActivationLayerInfo());</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span> </div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="comment">// Reduce Sum</span></div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keyword">const</span> std::vector<unsigned int> armnnReduceAxes(1, 1);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <a class="code" href="namespacearmnn.xhtml#ac6e86c1def7f674d3c4cb7f577874aa6">arm_compute::Coordinates</a> coords = BuildArmComputeReductionCoordinates(m_OutputMul.info()->num_dimensions(),</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  outputMul_Info.GetNumDimensions(),</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  armnnReduceAxes);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  m_ReduceSumLayer.configure(&m_OutputMul,</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  &m_FlattenedIndices,</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  static_cast<unsigned int>(coords[0]),</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  arm_compute::ReductionOperation::SUM,</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keyword">false</span>);</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="comment"></span></div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="comment"> /// Call Gather with adequate shapes</span></div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="comment"></span> <span class="comment">// Reshape params into { K, C }</span></div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  paramsInfo.SetShape({ keyIndices[<span class="stringliteral">"K"</span>], keyIndices[<span class="stringliteral">"C"</span>] });</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  input.info()->set_tensor_shape(BuildArmComputeTensorShape(paramsInfo.GetShape()));</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> </div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="comment">// Reshape output to have the shape given by gather { W, C }</span></div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="comment">// (the original outputInfo has the shape given by gatherNd)</span></div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> outputGather_Info = outputInfo;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  outputGather_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"C"</span>] });</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  BuildArmComputeTensor(m_OutputGather, outputGather_Info);</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputGather);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  m_GatherLayer.configure(&input, &m_FlattenedIndices, &m_OutputGather, <a class="code" href="namespacearmnn.xhtml#a44a3b98b37a25c995aa9e4dae7d7b456">ComputeAclAxis</a>(0, paramsInfo));</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> </div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="comment">// Reshape output to the original output shape</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  m_ReshapeLayer.configure(&m_OutputGather, &output);</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> }</div><div class="ttc" id="namespacearmnn_xhtml_a44a3b98b37a25c995aa9e4dae7d7b456"><div class="ttname"><a href="namespacearmnn.xhtml#a44a3b98b37a25c995aa9e4dae7d7b456">armnn::ComputeAclAxis</a></div><div class="ttdeci">int ComputeAclAxis(const int &armnnAxis, const armnn::TensorInfo &tensor)</div><div class="ttdoc">Function to convert ArmNN axis (left to right) to ACL axis (right to left) ranging from [-rank...</div><div class="ttdef"><b>Definition:</b> <a href="_arm_compute_utils_8hpp_source.xhtml#l00264">ArmComputeUtils.hpp:264</a></div></div> -<div class="ttc" id="namespacearmnn_xhtml_ac40d3e4035af5fbe68d9e126a8d6367c"><div class="ttname"><a href="namespacearmnn.xhtml#ac40d3e4035af5fbe68d9e126a8d6367c">armnn::CalculateGatherNdKeyIndices</a></div><div class="ttdeci">std::map< std::string, unsigned int > CalculateGatherNdKeyIndices(TensorInfo inputInfo0, TensorInfo inputInfo1)</div><div class="ttdoc">Calculates the key index values needed for GatherNd: N, ND, K, W, C (N is always 1) ...</div><div class="ttdef"><b>Definition:</b> <a href="_workload_utils_8cpp_source.xhtml#l00300">WorkloadUtils.cpp:300</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="namespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a></div></div> -<div class="ttc" id="namespacearmnn_xhtml_ac6e86c1def7f674d3c4cb7f577874aa6"><div class="ttname"><a href="namespacearmnn.xhtml#ac6e86c1def7f674d3c4cb7f577874aa6">armnn::Coordinates</a></div><div class="ttdeci">std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates</div><div class="ttdef"><b>Definition:</b> <a href="_internal_types_8hpp_source.xhtml#l00015">InternalTypes.hpp:15</a></div></div> -<div class="ttc" id="structarmnn_1_1_queue_descriptor_xhtml_a765d2cee4ccce5b9467e0c2b6d25b84a"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a765d2cee4ccce5b9467e0c2b6d25b84a">armnn::QueueDescriptor::ValidateInputsOutputs</a></div><div class="ttdeci">void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8cpp_source.xhtml#l00475">WorkloadData.cpp:475</a></div></div> -<div class="ttc" id="classarmnn_1_1_tensor_info_xhtml_abe8889e8150beef5fd204b2d87b49298"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">armnn::TensorInfo::SetShape</a></div><div class="ttdeci">void SetShape(const TensorShape &newShape)</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00193">Tensor.hpp:193</a></div></div> -<div class="ttc" id="_assert_8hpp_xhtml_a91c4dfde57907d7698c7531785690a7f"><div class="ttname"><a href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a></div><div class="ttdeci">#define ARMNN_ASSERT_MSG(COND, MSG)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00015">Assert.hpp:15</a></div></div> -<div class="ttc" id="classarmnn_1_1_base_workload_xhtml_afb8d2c8817c75de9d01a4c0e0d5c160b"><div class="ttname"><a href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">armnn::BaseWorkload< GatherNdQueueDescriptor >::m_Data</a></div><div class="ttdeci">GatherNdQueueDescriptor m_Data</div><div class="ttdef"><b>Definition:</b> <a href="_workload_8hpp_source.xhtml#l00083">Workload.hpp:83</a></div></div> -<div class="ttc" id="structarmnn_1_1_queue_descriptor_xhtml_a6abd491bb99ffe88bd472c1ae5a1ed1a"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">armnn::QueueDescriptor::m_Outputs</a></div><div class="ttdeci">std::vector< ITensorHandle * > m_Outputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00027">WorkloadData.hpp:27</a></div></div> -<div class="ttc" id="namespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div></div> -<div class="ttc" id="structarmnn_1_1_queue_descriptor_xhtml_a4b50e46a6810018f3edecfb68b2a76b3"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">armnn::QueueDescriptor::m_Inputs</a></div><div class="ttdeci">std::vector< ITensorHandle * > m_Inputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00026">WorkloadData.hpp:26</a></div></div> +<div class="fragment"><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  : NeonBaseWorkload<GatherNdQueueDescriptor>(descriptor, info)</div> +<div class="line"><a name="l00100"></a><span class="lineno"> 100</span> {</div> +<div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a765d2cee4ccce5b9467e0c2b6d25b84a">ValidateInputsOutputs</a>(<span class="stringliteral">"NeonGatherNdWorkload"</span>, 2, 1);</div> +<div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  </div> +<div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  TensorInfo paramsInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_InputTensorInfos[0];</div> +<div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  TensorInfo indicesInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_InputTensorInfos[1];</div> +<div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  TensorInfo outputInfo = <a class="code" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">info</a>.m_OutputTensorInfos[0];</div> +<div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  </div> +<div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>[0])->GetTensor();</div> +<div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  arm_compute::ITensor& indices = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">m_Inputs</a>[1])->GetTensor();</div> +<div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(<a class="code" href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">m_Data</a>.<a class="code" href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">m_Outputs</a>[0])->GetTensor();</div> +<div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  </div> +<div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Calculate ND, K, W, C.</span></div> +<div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  std::map<std::string, unsigned int> keyIndices = <a class="code" href="namespacearmnn.xhtml#ac40d3e4035af5fbe68d9e126a8d6367c">CalculateGatherNdKeyIndices</a>(paramsInfo, indicesInfo);</div> +<div class="line"><a name="l00113"></a><span class="lineno"> 113</span> <span class="comment"></span> </div> +<div class="line"><a name="l00114"></a><span class="lineno"> 114</span> <span class="comment"> /// Calculate flattened indices: m_FlattenedIndices = indices * m_FlattenedCoeff.</span></div> +<div class="line"><a name="l00115"></a><span class="lineno"> 115</span> <span class="comment"> /// This could be done using MatMul instead of multiplication followed by reduce sum operation,</span></div> +<div class="line"><a name="l00116"></a><span class="lineno"> 116</span> <span class="comment"> /// but GeMM does not support s32 at the moment.</span></div> +<div class="line"><a name="l00117"></a><span class="lineno"> 117</span> <span class="comment"></span> </div> +<div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// Prepare the tensor to store the output of the reduce_sum operation</span></div> +<div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> flattenedIndices_Info = indicesInfo;</div> +<div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  flattenedIndices_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>] });</div> +<div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  BuildArmComputeTensor(m_FlattenedIndices, flattenedIndices_Info);</div> +<div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_FlattenedIndices);</div> +<div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  </div> +<div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Reshape indices into { W, ND }</span></div> +<div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  indices.info()->set_tensor_shape(BuildArmComputeTensorShape({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"ND"</span>] }));</div> +<div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  </div> +<div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="comment">// Calculate the m_FlattenedCoeff</span></div> +<div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  TensorShape paramsShape = paramsInfo.GetShape();</div> +<div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  std::vector<int32_t> flattenedCoeff(keyIndices[<span class="stringliteral">"ND"</span>], 1);</div> +<div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 1; i < keyIndices[<span class="stringliteral">"ND"</span>]; ++i)</div> +<div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div> +<div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  flattenedCoeff[i - 1] = <span class="keyword">static_cast<</span>int32_t<span class="keyword">></span>(paramsShape[i]);</div> +<div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  }</div> +<div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = keyIndices[<span class="stringliteral">"ND"</span>] - 1; i > 0; --i)</div> +<div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  {</div> +<div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  flattenedCoeff[i - 1] *= flattenedCoeff[i];</div> +<div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  }</div> +<div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> flattenedCoeff_Info = indicesInfo;</div> +<div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  flattenedCoeff_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"ND"</span>] });</div> +<div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  BuildArmComputeTensor(m_FlattenedCoeff, flattenedCoeff_Info);</div> +<div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_FlattenedCoeff);</div> +<div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <a class="code" href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a>(indicesInfo.GetDataType() == <a class="code" href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">DataType::Signed32</a>,</div> +<div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="stringliteral">"flattenedCoeff must be same data type as m_FlattenedCoeff"</span>);</div> +<div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  CopyArmComputeITensorData<int32_t>(flattenedCoeff.data(), m_FlattenedCoeff);</div> +<div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  </div> +<div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="comment">// Prepare the tensor to store the output of the multiplication</span></div> +<div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> outputMul_Info = indicesInfo;</div> +<div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  outputMul_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"ND"</span>] });</div> +<div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  BuildArmComputeTensor(m_OutputMul, outputMul_Info);</div> +<div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputMul);</div> +<div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  </div> +<div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="comment">// Multiply</span></div> +<div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  m_MulLayer.configure(&indices,</div> +<div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  &m_FlattenedCoeff,</div> +<div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  &m_OutputMul,</div> +<div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  1.0f,</div> +<div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  arm_compute::ConvertPolicy::WRAP,</div> +<div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  arm_compute::RoundingPolicy::TO_ZERO,</div> +<div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  arm_compute::ActivationLayerInfo());</div> +<div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  </div> +<div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="comment">// Reduce Sum</span></div> +<div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keyword">const</span> std::vector<unsigned int> armnnReduceAxes(1, 1);</div> +<div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <a class="code" href="namespacearmnn.xhtml#ac6e86c1def7f674d3c4cb7f577874aa6">arm_compute::Coordinates</a> coords = BuildArmComputeReductionCoordinates(m_OutputMul.info()->num_dimensions(),</div> +<div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  outputMul_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#a157e27d41e9f6b21f0d3c025fa47dc24">GetNumDimensions</a>(),</div> +<div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  armnnReduceAxes);</div> +<div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  m_ReduceSumLayer.configure(&m_OutputMul,</div> +<div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  &m_FlattenedIndices,</div> +<div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keyword">static_cast<</span><span class="keywordtype">unsigned</span> <span class="keywordtype">int</span><span class="keyword">></span>(coords[0]),</div> +<div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  arm_compute::ReductionOperation::SUM,</div> +<div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keyword">false</span>);</div> +<div class="line"><a name="l00171"></a><span class="lineno"> 171</span> <span class="comment"></span> </div> +<div class="line"><a name="l00172"></a><span class="lineno"> 172</span> <span class="comment"> /// Call Gather with adequate shapes</span></div> +<div class="line"><a name="l00173"></a><span class="lineno"> 173</span> <span class="comment"></span> <span class="comment">// Reshape params into { K, C }</span></div> +<div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  paramsInfo.SetShape({ keyIndices[<span class="stringliteral">"K"</span>], keyIndices[<span class="stringliteral">"C"</span>] });</div> +<div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  input.info()->set_tensor_shape(BuildArmComputeTensorShape(paramsInfo.GetShape()));</div> +<div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  </div> +<div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="comment">// Reshape output to have the shape given by gather { W, C }</span></div> +<div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="comment">// (the original outputInfo has the shape given by gatherNd)</span></div> +<div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <a class="code" href="classarmnn_1_1_tensor_info.xhtml">armnn::TensorInfo</a> outputGather_Info = outputInfo;</div> +<div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  outputGather_Info.<a class="code" href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">SetShape</a>({ keyIndices[<span class="stringliteral">"W"</span>], keyIndices[<span class="stringliteral">"C"</span>] });</div> +<div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  BuildArmComputeTensor(m_OutputGather, outputGather_Info);</div> +<div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  armcomputetensorutils::InitialiseArmComputeTensorEmpty(m_OutputGather);</div> +<div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  </div> +<div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  m_GatherLayer.configure(&input, &m_FlattenedIndices, &m_OutputGather, <a class="code" href="namespacearmnn.xhtml#a44a3b98b37a25c995aa9e4dae7d7b456">ComputeAclAxis</a>(0, paramsInfo));</div> +<div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  </div> +<div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="comment">// Reshape output to the original output shape</span></div> +<div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  m_ReshapeLayer.configure(&m_OutputGather, &output);</div> +<div class="line"><a name="l00188"></a><span class="lineno"> 188</span> }</div> </div><!-- fragment --> +<p class="reference">References <a class="el" href="_workload_utils_8cpp_source.xhtml#l00300">armnn::CalculateGatherNdKeyIndices()</a>, <a class="el" href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::info</a>, <a class="el" href="_workload_8hpp_source.xhtml#l00083">BaseWorkload< GatherNdQueueDescriptor >::m_Data</a>, <a class="el" href="_workload_data_8hpp_source.xhtml#l00026">QueueDescriptor::m_Inputs</a>, <a class="el" href="_workload_data_8hpp_source.xhtml#l00027">QueueDescriptor::m_Outputs</a>, <a class="el" href="_tensor_8hpp_source.xhtml#l00193">TensorInfo::SetShape()</a>, and <a class="el" href="_workload_data_8cpp_source.xhtml#l00475">QueueDescriptor::ValidateInputsOutputs()</a>.</p> + </div> </div> <h2 class="groupheader">Member Function Documentation</h2> @@ -237,11 +322,16 @@ Additional Inherited Members</h2></td></tr> <p>Implements <a class="el" href="classarmnn_1_1_i_workload.xhtml#a72ae00e6604850c8798c5e0d825ee7e4">IWorkload</a>.</p> <p class="definition">Definition at line <a class="el" href="_neon_gather_nd_workload_8cpp_source.xhtml#l00190">190</a> of file <a class="el" href="_neon_gather_nd_workload_8cpp_source.xhtml">NeonGatherNdWorkload.cpp</a>.</p> - -<p class="reference">References <a class="el" href="_neon_workload_utils_8hpp_source.xhtml#l00024">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a>, and <a class="el" href="_workload_8hpp_source.xhtml#l00061">BaseWorkload< GatherNdQueueDescriptor >::GetGuid()</a>.</p> -<div class="fragment"><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <a class="code" href="_neon_workload_utils_8hpp.xhtml#a9165e41bcaf1b90f9ff91ef681e88c4f">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a>(<span class="stringliteral">"NeonGatherNdWorkload_Execute"</span>, this-><a class="code" href="classarmnn_1_1_base_workload.xhtml#aaff95a48875d8fb4a616352906660ca9">GetGuid</a>());</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  m_MulLayer.run();</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  m_ReduceSumLayer.run();</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  m_GatherLayer.run();</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  m_ReshapeLayer.run();</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> }</div><div class="ttc" id="classarmnn_1_1_base_workload_xhtml_aaff95a48875d8fb4a616352906660ca9"><div class="ttname"><a href="classarmnn_1_1_base_workload.xhtml#aaff95a48875d8fb4a616352906660ca9">armnn::BaseWorkload< GatherNdQueueDescriptor >::GetGuid</a></div><div class="ttdeci">arm::pipe::ProfilingGuid GetGuid() const final</div><div class="ttdef"><b>Definition:</b> <a href="_workload_8hpp_source.xhtml#l00061">Workload.hpp:61</a></div></div> -<div class="ttc" id="_neon_workload_utils_8hpp_xhtml_a9165e41bcaf1b90f9ff91ef681e88c4f"><div class="ttname"><a href="_neon_workload_utils_8hpp.xhtml#a9165e41bcaf1b90f9ff91ef681e88c4f">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a></div><div class="ttdeci">#define ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID(name, guid)</div><div class="ttdef"><b>Definition:</b> <a href="_neon_workload_utils_8hpp_source.xhtml#l00024">NeonWorkloadUtils.hpp:24</a></div></div> +<div class="fragment"><div class="line"><a name="l00191"></a><span class="lineno"> 191</span> {</div> +<div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <a class="code" href="_neon_workload_utils_8hpp.xhtml#a9165e41bcaf1b90f9ff91ef681e88c4f">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a>(<span class="stringliteral">"NeonGatherNdWorkload_Execute"</span>, this-><a class="code" href="classarmnn_1_1_base_workload.xhtml#aaff95a48875d8fb4a616352906660ca9">GetGuid</a>());</div> +<div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  m_MulLayer.run();</div> +<div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  m_ReduceSumLayer.run();</div> +<div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  m_GatherLayer.run();</div> +<div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  m_ReshapeLayer.run();</div> +<div class="line"><a name="l00197"></a><span class="lineno"> 197</span> }</div> </div><!-- fragment --> +<p class="reference">References <a class="el" href="_neon_workload_utils_8hpp_source.xhtml#l00024">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a>, and <a class="el" href="_workload_8hpp_source.xhtml#l00061">BaseWorkload< GatherNdQueueDescriptor >::GetGuid()</a>.</p> + </div> </div> <hr/>The documentation for this class was generated from the following files:<ul> @@ -250,13 +340,28 @@ Additional Inherited Members</h2></td></tr> </ul> </div><!-- contents --> </div><!-- doc-content --> +<div class="ttc" id="anamespacearmnn_xhtml_ac40d3e4035af5fbe68d9e126a8d6367c"><div class="ttname"><a href="namespacearmnn.xhtml#ac40d3e4035af5fbe68d9e126a8d6367c">armnn::CalculateGatherNdKeyIndices</a></div><div class="ttdeci">std::map< std::string, unsigned int > CalculateGatherNdKeyIndices(TensorInfo inputInfo0, TensorInfo inputInfo1)</div><div class="ttdoc">Calculates the key index values needed for GatherNd: N, ND, K, W, C (N is always 1)</div><div class="ttdef"><b>Definition:</b> <a href="_workload_utils_8cpp_source.xhtml#l00300">WorkloadUtils.cpp:300</a></div></div> +<div class="ttc" id="aclassarmnn_1_1_base_workload_xhtml_aaff95a48875d8fb4a616352906660ca9"><div class="ttname"><a href="classarmnn_1_1_base_workload.xhtml#aaff95a48875d8fb4a616352906660ca9">armnn::BaseWorkload< GatherNdQueueDescriptor >::GetGuid</a></div><div class="ttdeci">arm::pipe::ProfilingGuid GetGuid() const final</div><div class="ttdef"><b>Definition:</b> <a href="_workload_8hpp_source.xhtml#l00061">Workload.hpp:61</a></div></div> +<div class="ttc" id="astructarmnn_1_1_queue_descriptor_xhtml_a765d2cee4ccce5b9467e0c2b6d25b84a"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a765d2cee4ccce5b9467e0c2b6d25b84a">armnn::QueueDescriptor::ValidateInputsOutputs</a></div><div class="ttdeci">void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8cpp_source.xhtml#l00475">WorkloadData.cpp:475</a></div></div> +<div class="ttc" id="anamespacearmnn_xhtml_a44a3b98b37a25c995aa9e4dae7d7b456"><div class="ttname"><a href="namespacearmnn.xhtml#a44a3b98b37a25c995aa9e4dae7d7b456">armnn::ComputeAclAxis</a></div><div class="ttdeci">int ComputeAclAxis(const int &armnnAxis, const armnn::TensorInfo &tensor)</div><div class="ttdoc">Function to convert ArmNN axis (left to right) to ACL axis (right to left) ranging from [-rank,...</div><div class="ttdef"><b>Definition:</b> <a href="_arm_compute_utils_8hpp_source.xhtml#l00264">ArmComputeUtils.hpp:264</a></div></div> +<div class="ttc" id="anamespacearmnn_xhtml_ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7"><div class="ttname"><a href="namespacearmnn.xhtml#ad8ed01ff3ff33333d8e19db4d2818bb6accedffbc6e5308e33d3843e8bdc0dad7">armnn::DataType::Signed32</a></div><div class="ttdeci">@ Signed32</div></div> +<div class="ttc" id="aclassarmnn_1_1_base_workload_xhtml_afb8d2c8817c75de9d01a4c0e0d5c160b"><div class="ttname"><a href="classarmnn_1_1_base_workload.xhtml#afb8d2c8817c75de9d01a4c0e0d5c160b">armnn::BaseWorkload< GatherNdQueueDescriptor >::m_Data</a></div><div class="ttdeci">GatherNdQueueDescriptor m_Data</div><div class="ttdef"><b>Definition:</b> <a href="_workload_8hpp_source.xhtml#l00083">Workload.hpp:83</a></div></div> +<div class="ttc" id="a_neon_workload_utils_8hpp_xhtml_a9165e41bcaf1b90f9ff91ef681e88c4f"><div class="ttname"><a href="_neon_workload_utils_8hpp.xhtml#a9165e41bcaf1b90f9ff91ef681e88c4f">ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID</a></div><div class="ttdeci">#define ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID(name, guid)</div><div class="ttdef"><b>Definition:</b> <a href="_neon_workload_utils_8hpp_source.xhtml#l00024">NeonWorkloadUtils.hpp:24</a></div></div> +<div class="ttc" id="aclassarmnn_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="aclassarmnn_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="a_assert_8hpp_xhtml_a91c4dfde57907d7698c7531785690a7f"><div class="ttname"><a href="_assert_8hpp.xhtml#a91c4dfde57907d7698c7531785690a7f">ARMNN_ASSERT_MSG</a></div><div class="ttdeci">#define ARMNN_ASSERT_MSG(COND, MSG)</div><div class="ttdef"><b>Definition:</b> <a href="_assert_8hpp_source.xhtml#l00015">Assert.hpp:15</a></div></div> +<div class="ttc" id="astructarmnn_1_1_queue_descriptor_xhtml_a6abd491bb99ffe88bd472c1ae5a1ed1a"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a6abd491bb99ffe88bd472c1ae5a1ed1a">armnn::QueueDescriptor::m_Outputs</a></div><div class="ttdeci">std::vector< ITensorHandle * > m_Outputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00027">WorkloadData.hpp:27</a></div></div> +<div class="ttc" id="aclassarmnn_1_1_tensor_info_xhtml_abe8889e8150beef5fd204b2d87b49298"><div class="ttname"><a href="classarmnn_1_1_tensor_info.xhtml#abe8889e8150beef5fd204b2d87b49298">armnn::TensorInfo::SetShape</a></div><div class="ttdeci">void SetShape(const TensorShape &newShape)</div><div class="ttdef"><b>Definition:</b> <a href="_tensor_8hpp_source.xhtml#l00193">Tensor.hpp:193</a></div></div> +<div class="ttc" id="anamespacearmnn_xhtml_ac6e86c1def7f674d3c4cb7f577874aa6"><div class="ttname"><a href="namespacearmnn.xhtml#ac6e86c1def7f674d3c4cb7f577874aa6">armnn::Coordinates</a></div><div class="ttdeci">std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates</div><div class="ttdef"><b>Definition:</b> <a href="_internal_types_8hpp_source.xhtml#l00015">InternalTypes.hpp:15</a></div></div> +<div class="ttc" id="astructarmnn_1_1_queue_descriptor_xhtml_a4b50e46a6810018f3edecfb68b2a76b3"><div class="ttname"><a href="structarmnn_1_1_queue_descriptor.xhtml#a4b50e46a6810018f3edecfb68b2a76b3">armnn::QueueDescriptor::m_Inputs</a></div><div class="ttdeci">std::vector< ITensorHandle * > m_Inputs</div><div class="ttdef"><b>Definition:</b> <a href="_workload_data_8hpp_source.xhtml#l00026">WorkloadData.hpp:26</a></div></div> +<div class="ttc" id="anamespacearmnn_xhtml_a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c"><div class="ttname"><a href="namespacearmnn.xhtml#a4dc0adc6737b5944e7671bee71788407acaf9b6b99962bf5c2264824231d7a40c">armnn::BoostLogSeverityMapping::info</a></div><div class="ttdeci">@ info</div></div> <!-- start footer part --> <div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> <ul> <li class="navelem"><a class="el" href="namespacearmnn.xhtml">armnn</a></li><li class="navelem"><a class="el" href="classarmnn_1_1_neon_gather_nd_workload.xhtml">NeonGatherNdWorkload</a></li> - <li class="footer">Generated on Fri Feb 24 2023 10:24:31 for ArmNN by + <li class="footer">Generated on Wed Mar 22 2023 15:53:07 for ArmNN by <a href="http://www.doxygen.org/index.html"> - <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.13 </li> + <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li> </ul> </div> </body> |