From 8efb48a6847c5cd166c561127ae6611150963ce3 Mon Sep 17 00:00:00 2001 From: Nikhil Raj Date: Fri, 19 May 2023 11:14:28 +0100 Subject: Update Doxygen docu for 23.05 Signed-off-by: Nikhil Raj Change-Id: I0a992286f14fa68fcc6e5eba31ac39fed003cbbe --- 23.05/_neon_q_lstm_workload_8cpp_source.xhtml | 622 ++++++++++++++++++++++++++ 1 file changed, 622 insertions(+) create mode 100644 23.05/_neon_q_lstm_workload_8cpp_source.xhtml (limited to '23.05/_neon_q_lstm_workload_8cpp_source.xhtml') diff --git a/23.05/_neon_q_lstm_workload_8cpp_source.xhtml b/23.05/_neon_q_lstm_workload_8cpp_source.xhtml new file mode 100644 index 0000000000..49039eb520 --- /dev/null +++ b/23.05/_neon_q_lstm_workload_8cpp_source.xhtml @@ -0,0 +1,622 @@ + + + + + + + + + + + + + +ArmNN: src/backends/neon/workloads/NeonQLstmWorkload.cpp Source File + + + + + + + + + + + + + + + + +
+
+ + + + ArmNN + + + +
+
+  23.05 +
+
+
+ + + + + + + +
+
+ +
+
+
+ +
+ +
+
+ + +
+ +
+ +
+
+
NeonQLstmWorkload.cpp
+
+
+Go to the documentation of this file.
1 //
+
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
+
3 // SPDX-License-Identifier: MIT
+
4 //
+
5 
+
6 #include "NeonQLstmWorkload.hpp"
+
7 #include "NeonWorkloadUtils.hpp"
+
8 
+ +
10 
+ +
12 
+
13 namespace armnn
+
14 {
+
15 using namespace armcomputetensorutils;
+
16 
+ + +
19 {
+
20  // Report Profiling Details
+
21  ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonQLstmWorkload_Construct",
+
22  descriptor.m_Parameters,
+
23  info,
+
24  this->GetGuid());
+
25 
+
26  arm_compute::LSTMParams<arm_compute::ITensor> qLstmParams;
+
27 
+
28  // Mandatory params
+
29  m_InputToForgetWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
30  BuildArmComputeTensor(*m_InputToForgetWeightsTensor, m_Data.m_InputToForgetWeights->GetTensorInfo());
+
31 
+
32  m_InputToCellWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
33  BuildArmComputeTensor(*m_InputToCellWeightsTensor, m_Data.m_InputToCellWeights->GetTensorInfo());
+
34 
+
35  m_InputToOutputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
36  BuildArmComputeTensor(*m_InputToOutputWeightsTensor, m_Data.m_InputToOutputWeights->GetTensorInfo());
+
37 
+
38  m_RecurrentToForgetWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
39  BuildArmComputeTensor(*m_RecurrentToForgetWeightsTensor, m_Data.m_RecurrentToForgetWeights->GetTensorInfo());
+
40 
+
41  m_RecurrentToCellWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
42  BuildArmComputeTensor(*m_RecurrentToCellWeightsTensor, m_Data.m_RecurrentToCellWeights->GetTensorInfo());
+
43 
+
44  m_RecurrentToOutputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
45  BuildArmComputeTensor(*m_RecurrentToOutputWeightsTensor, m_Data.m_RecurrentToOutputWeights->GetTensorInfo());
+
46 
+
47  m_ForgetGateBiasTensor = std::make_unique<arm_compute::Tensor>();
+
48  BuildArmComputeTensor(*m_ForgetGateBiasTensor, m_Data.m_ForgetGateBias->GetTensorInfo());
+
49 
+
50  m_CellBiasTensor = std::make_unique<arm_compute::Tensor>();
+
51  BuildArmComputeTensor(*m_CellBiasTensor, m_Data.m_CellBias->GetTensorInfo());
+
52 
+
53  m_OutputGateBiasTensor = std::make_unique<arm_compute::Tensor>();
+
54  BuildArmComputeTensor(*m_OutputGateBiasTensor, m_Data.m_OutputGateBias->GetTensorInfo());
+
55 
+
56  // Create tensors for optional params if they are enabled
+ +
58  {
+
59  m_CellToInputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
60 
+ +
62  {
+
63  // In ACL this is categorised as a CIFG param and not a Peephole param
+
64  BuildArmComputeTensor(*m_CellToInputWeightsTensor, m_Data.m_CellToInputWeights->GetTensorInfo());
+
65  }
+
66 
+
67  m_CellToForgetWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
68  BuildArmComputeTensor(*m_CellToForgetWeightsTensor, m_Data.m_CellToForgetWeights->GetTensorInfo());
+
69 
+
70  m_CellToOutputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
71  BuildArmComputeTensor(*m_CellToOutputWeightsTensor, m_Data.m_CellToOutputWeights->GetTensorInfo());
+
72 
+
73  // Set Peephole params
+
74  qLstmParams.set_peephole_params(m_CellToForgetWeightsTensor.get(),
+
75  m_CellToOutputWeightsTensor.get());
+
76  }
+
77 
+ +
79  {
+
80  m_ProjectionWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
81  BuildArmComputeTensor(*m_ProjectionWeightsTensor, m_Data.m_ProjectionWeights->GetTensorInfo());
+
82 
+
83  m_ProjectionBiasTensor = std::make_unique<arm_compute::Tensor>();
+
84  if (m_Data.m_ProjectionBias != nullptr)
+
85  {
+
86  BuildArmComputeTensor(*m_ProjectionBiasTensor, m_Data.m_ProjectionBias->GetTensorInfo());
+
87  }
+
88 
+
89  // Set projection params
+
90  qLstmParams.set_projection_params(
+
91  m_ProjectionWeightsTensor.get(),
+
92  m_Data.m_ProjectionBias != nullptr ? m_ProjectionBiasTensor.get() : nullptr);
+
93  }
+
94 
+ +
96  {
+
97  m_InputLayerNormWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
98 
+ +
100  {
+
101  BuildArmComputeTensor(*m_InputLayerNormWeightsTensor, m_Data.m_InputLayerNormWeights->GetTensorInfo());
+
102  }
+
103 
+
104  m_ForgetLayerNormWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
105  BuildArmComputeTensor(*m_ForgetLayerNormWeightsTensor, m_Data.m_ForgetLayerNormWeights->GetTensorInfo());
+
106 
+
107  m_CellLayerNormWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
108  BuildArmComputeTensor(*m_CellLayerNormWeightsTensor, m_Data.m_CellLayerNormWeights->GetTensorInfo());
+
109 
+
110  m_OutputLayerNormWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
111  BuildArmComputeTensor(*m_OutputLayerNormWeightsTensor, m_Data.m_OutputLayerNormWeights->GetTensorInfo());
+
112 
+
113  // Set layer norm params
+
114  qLstmParams.set_layer_normalization_params(
+
115  m_Data.m_InputLayerNormWeights != nullptr ? m_InputLayerNormWeightsTensor.get() : nullptr,
+
116  m_ForgetLayerNormWeightsTensor.get(),
+
117  m_CellLayerNormWeightsTensor.get(),
+
118  m_OutputLayerNormWeightsTensor.get());
+
119  }
+
120 
+ +
122  {
+
123  m_InputToInputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
124  BuildArmComputeTensor(*m_InputToInputWeightsTensor, m_Data.m_InputToInputWeights->GetTensorInfo());
+
125 
+
126  m_RecurrentToInputWeightsTensor = std::make_unique<arm_compute::Tensor>();
+
127  BuildArmComputeTensor(*m_RecurrentToInputWeightsTensor, m_Data.m_RecurrentToInputWeights->GetTensorInfo());
+
128 
+
129  m_InputGateBiasTensor = std::make_unique<arm_compute::Tensor>();
+
130  BuildArmComputeTensor(*m_InputGateBiasTensor, m_Data.m_InputGateBias->GetTensorInfo());
+
131 
+
132  // Set CIFG params
+
133  qLstmParams.set_cifg_params(
+
134  m_InputToInputWeightsTensor.get(),
+
135  m_RecurrentToInputWeightsTensor.get(),
+
136  m_Data.m_CellToInputWeights != nullptr ? m_CellToInputWeightsTensor.get() : nullptr,
+
137  m_InputGateBiasTensor.get());
+
138  }
+
139 
+
140  // Input/Output tensors
+
141  const arm_compute::ITensor& input = static_cast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
+
142  arm_compute::ITensor& outputStateIn = static_cast<IAclTensorHandle*>(m_Data.m_Inputs[1])->GetTensor();
+
143  const arm_compute::ITensor& cellStateIn = static_cast<IAclTensorHandle*>(m_Data.m_Inputs[2])->GetTensor();
+
144 
+
145  arm_compute::ITensor& outputStateOut = static_cast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
+
146  arm_compute::ITensor& cellStateOut = static_cast<IAclTensorHandle*>(m_Data.m_Outputs[1])->GetTensor();
+
147  arm_compute::ITensor& output = static_cast<IAclTensorHandle*>(m_Data.m_Outputs[2])->GetTensor();
+
148 
+
149  // Set scalar descriptor params
+
150  qLstmParams.set_cell_clip_params(m_Data.m_Parameters.m_CellClip);
+
151  qLstmParams.set_projection_clip_params(m_Data.m_Parameters.m_ProjectionClip);
+
152  qLstmParams.set_hidden_state_params(m_Data.m_Parameters.m_HiddenStateZeroPoint,
+ +
154  qLstmParams.set_matmul_scale_params(m_Data.m_Parameters.m_InputIntermediateScale,
+ + + +
158 
+
159  // QLSTM NEON configure
+
160  m_QLstmLayer.configure(&input,
+
161  m_InputToForgetWeightsTensor.get(),
+
162  m_InputToCellWeightsTensor.get(),
+
163  m_InputToOutputWeightsTensor.get(),
+
164  m_RecurrentToForgetWeightsTensor.get(),
+
165  m_RecurrentToCellWeightsTensor.get(),
+
166  m_RecurrentToOutputWeightsTensor.get(),
+
167  m_ForgetGateBiasTensor.get(),
+
168  m_CellBiasTensor.get(),
+
169  m_OutputGateBiasTensor.get(),
+
170  &cellStateIn,
+
171  &outputStateIn,
+
172  &cellStateOut,
+
173  &outputStateOut,
+
174  &output,
+
175  qLstmParams);
+
176 
+
177  // Initialise ACL tensor data for mandatory params
+
178  InitializeArmComputeTensorData(*m_InputToForgetWeightsTensor, m_Data.m_InputToForgetWeights);
+
179  InitializeArmComputeTensorData(*m_InputToCellWeightsTensor, m_Data.m_InputToCellWeights);
+
180  InitializeArmComputeTensorData(*m_InputToOutputWeightsTensor, m_Data.m_InputToOutputWeights);
+
181 
+
182  InitializeArmComputeTensorData(*m_RecurrentToForgetWeightsTensor, m_Data.m_RecurrentToForgetWeights);
+
183  InitializeArmComputeTensorData(*m_RecurrentToCellWeightsTensor, m_Data.m_RecurrentToCellWeights);
+
184  InitializeArmComputeTensorData(*m_RecurrentToOutputWeightsTensor, m_Data.m_RecurrentToOutputWeights);
+
185 
+
186  InitializeArmComputeTensorData(*m_ForgetGateBiasTensor, m_Data.m_ForgetGateBias);
+ +
188  InitializeArmComputeTensorData(*m_OutputGateBiasTensor, m_Data.m_OutputGateBias);
+
189 
+
190  // Initialise ACL tensor data for optional params
+ +
192  {
+
193  InitializeArmComputeTensorData(*m_InputToInputWeightsTensor, m_Data.m_InputToInputWeights);
+
194  InitializeArmComputeTensorData(*m_RecurrentToInputWeightsTensor, m_Data.m_RecurrentToInputWeights);
+
195  InitializeArmComputeTensorData(*m_InputGateBiasTensor, m_Data.m_InputGateBias);
+
196  }
+
197 
+ +
199  {
+
200  InitializeArmComputeTensorData(*m_ProjectionWeightsTensor, m_Data.m_ProjectionWeights);
+
201 
+
202  if (m_Data.m_ProjectionBias != nullptr)
+
203  {
+
204  InitializeArmComputeTensorData(*m_ProjectionBiasTensor, m_Data.m_ProjectionBias);
+
205  }
+
206  }
+
207 
+ +
209  {
+ +
211  {
+
212  InitializeArmComputeTensorData(*m_CellToInputWeightsTensor, m_Data.m_CellToInputWeights);
+
213  }
+
214 
+
215  InitializeArmComputeTensorData(*m_CellToForgetWeightsTensor, m_Data.m_CellToForgetWeights);
+
216  InitializeArmComputeTensorData(*m_CellToOutputWeightsTensor, m_Data.m_CellToOutputWeights);
+
217  }
+
218 
+ +
220  {
+ +
222  {
+
223  InitializeArmComputeTensorData(*m_InputLayerNormWeightsTensor, m_Data.m_InputLayerNormWeights);
+
224  }
+
225 
+
226  InitializeArmComputeTensorData(*m_ForgetLayerNormWeightsTensor, m_Data.m_ForgetLayerNormWeights);
+
227  InitializeArmComputeTensorData(*m_CellLayerNormWeightsTensor, m_Data.m_CellLayerNormWeights);
+
228  InitializeArmComputeTensorData(*m_OutputLayerNormWeightsTensor, m_Data.m_OutputLayerNormWeights);
+
229  }
+
230 
+
231  // QLSTM NEON prepare
+
232  m_QLstmLayer.prepare();
+
233 
+
234  FreeUnusedTensors();
+
235 }
+
236 
+ +
238 {
+
239  ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonQuantizedLstmWorkload_Execute", this->GetGuid());
+
240  m_QLstmLayer.run();
+
241 }
+
242 
+ +
244  const TensorInfo& cellStateIn,
+
245  const TensorInfo& outputStateIn,
+
246  const TensorInfo& cellStateOut,
+
247  const TensorInfo& outputStateOut,
+
248  const TensorInfo& output,
+
249  const QLstmDescriptor& descriptor,
+
250  const LstmInputParamsInfo& paramsInfo)
+
251 {
+
252  arm_compute::LSTMParams<arm_compute::ITensorInfo> aclParamsInfo;
+
253 
+
254  // Input/Output tensor info
+
255  const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input);
+
256  const arm_compute::TensorInfo aclOutputStateInInfo = BuildArmComputeTensorInfo(outputStateIn);
+
257  const arm_compute::TensorInfo aclCellStateInInfo = BuildArmComputeTensorInfo(cellStateIn);
+
258 
+
259  const arm_compute::TensorInfo aclOutputStateOutInfo = BuildArmComputeTensorInfo(outputStateOut);
+
260  const arm_compute::TensorInfo aclCellStateOutInfo = BuildArmComputeTensorInfo(cellStateOut);
+
261  const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
+
262 
+
263  // Mandatory tensor info
+
264  const arm_compute::TensorInfo aclInputToForgetWeightsInfo
+
265  = BuildArmComputeTensorInfo(paramsInfo.GetInputToForgetWeights());
+
266  const arm_compute::TensorInfo aclInputToCellWeightsInfo
+
267  = BuildArmComputeTensorInfo(paramsInfo.GetInputToCellWeights());
+
268  const arm_compute::TensorInfo aclInputToOutputWeightsInfo
+
269  = BuildArmComputeTensorInfo(paramsInfo.GetInputToOutputWeights());
+
270  const arm_compute::TensorInfo aclRecurrentToForgetWeightsInfo
+
271  = BuildArmComputeTensorInfo(paramsInfo.GetRecurrentToForgetWeights());
+
272  const arm_compute::TensorInfo aclRecurrentToCellWeightsInfo
+
273  = BuildArmComputeTensorInfo(paramsInfo.GetRecurrentToCellWeights());
+
274  const arm_compute::TensorInfo aclRecurrentToOutputWeightsInfo
+
275  = BuildArmComputeTensorInfo(paramsInfo.GetRecurrentToOutputWeights());
+
276  const arm_compute::TensorInfo aclForgetGateBiasInfo
+
277  = BuildArmComputeTensorInfo(paramsInfo.GetForgetGateBias());
+
278  const arm_compute::TensorInfo aclCellBiasInfo
+
279  = BuildArmComputeTensorInfo(paramsInfo.GetCellBias());
+
280  const arm_compute::TensorInfo aclOutputGateBiasInfo
+
281  = BuildArmComputeTensorInfo(paramsInfo.GetOutputGateBias());
+
282 
+
283  // Optional tensor info
+
284  arm_compute::TensorInfo aclInputToInputWeightsInfo;
+
285  arm_compute::TensorInfo aclRecurrentToInputWeightsInfo;
+
286 
+
287  arm_compute::TensorInfo aclCellToInputWeightsInfo;
+
288  arm_compute::TensorInfo aclCellToForgetWeightsInfo;
+
289  arm_compute::TensorInfo aclCellToOutputWeightsInfo;
+
290 
+
291  arm_compute::TensorInfo aclInputGateBiasInfo;
+
292 
+
293  arm_compute::TensorInfo aclProjectionWeightsInfo;
+
294  arm_compute::TensorInfo aclProjectionBiasInfo;
+
295 
+
296  arm_compute::TensorInfo aclInputLayerNormWeightsInfo;
+
297  arm_compute::TensorInfo aclForgetLayerNormWeightsInfo;
+
298  arm_compute::TensorInfo aclCellLayerNormWeightsInfo;
+
299  arm_compute::TensorInfo aclOutputLayerNormWeightsInfo;
+
300 
+
301  // Create tensor info for optional params if they are enabled
+
302  if (descriptor.m_PeepholeEnabled)
+
303  {
+
304  if (!descriptor.m_CifgEnabled)
+
305  {
+
306  aclCellToInputWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetCellToInputWeights());
+
307  }
+
308 
+
309  aclCellToForgetWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetCellToForgetWeights());
+
310  aclCellToOutputWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetCellToOutputWeights());
+
311 
+
312  // Set peephole params info
+
313  aclParamsInfo.set_peephole_params(&aclCellToForgetWeightsInfo,
+
314  &aclCellToOutputWeightsInfo);
+
315  }
+
316 
+
317  if (descriptor.m_ProjectionEnabled)
+
318  {
+
319  aclProjectionWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetProjectionWeights());
+
320 
+
321  if (paramsInfo.m_ProjectionBias != nullptr)
+
322  {
+
323  aclProjectionBiasInfo = BuildArmComputeTensorInfo(paramsInfo.GetProjectionBias());
+
324  }
+
325 
+
326  // Set projection params info
+
327  aclParamsInfo.set_projection_params(
+
328  &aclProjectionWeightsInfo,
+
329  paramsInfo.m_ProjectionBias != nullptr ? &aclProjectionBiasInfo : nullptr);
+
330  }
+
331 
+
332  if (descriptor.m_LayerNormEnabled)
+
333  {
+
334  if (!descriptor.m_CifgEnabled)
+
335  {
+
336  aclInputLayerNormWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetInputLayerNormWeights());
+
337  }
+
338 
+
339  aclForgetLayerNormWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetForgetLayerNormWeights());
+
340  aclCellLayerNormWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetCellLayerNormWeights());
+
341  aclOutputLayerNormWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetOutputLayerNormWeights());
+
342 
+
343  // Set layer norm params info
+
344  aclParamsInfo.set_layer_normalization_params(
+
345  paramsInfo.m_InputLayerNormWeights != nullptr ? &aclInputLayerNormWeightsInfo : nullptr,
+
346  &aclForgetLayerNormWeightsInfo,
+
347  &aclCellLayerNormWeightsInfo,
+
348  &aclOutputLayerNormWeightsInfo);
+
349  }
+
350 
+
351  if (!descriptor.m_CifgEnabled)
+
352  {
+
353  aclInputToInputWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetInputToInputWeights());
+
354  aclRecurrentToInputWeightsInfo = BuildArmComputeTensorInfo(paramsInfo.GetRecurrentToInputWeights());
+
355  aclInputGateBiasInfo = BuildArmComputeTensorInfo(paramsInfo.GetInputGateBias());
+
356 
+
357  // Set CIFG params info
+
358  aclParamsInfo.set_cifg_params(
+
359  &aclInputToInputWeightsInfo,
+
360  &aclRecurrentToInputWeightsInfo,
+
361  paramsInfo.m_CellToInputWeights != nullptr ? &aclCellToInputWeightsInfo : nullptr,
+
362  &aclInputGateBiasInfo);
+
363  }
+
364 
+
365  // Set scalar descriptor params
+
366  aclParamsInfo.set_cell_clip_params(descriptor.m_CellClip);
+
367  aclParamsInfo.set_projection_clip_params(descriptor.m_ProjectionClip);
+
368  aclParamsInfo.set_hidden_state_params(descriptor.m_HiddenStateZeroPoint, descriptor.m_HiddenStateScale);
+
369  aclParamsInfo.set_matmul_scale_params(descriptor.m_InputIntermediateScale,
+
370  descriptor.m_ForgetIntermediateScale,
+
371  descriptor.m_CellIntermediateScale,
+
372  descriptor.m_OutputIntermediateScale);
+
373 
+
374  // QLSTM NEON validate
+
375  return arm_compute::NEQLSTMLayer::validate(&aclInputInfo,
+
376  &aclInputToForgetWeightsInfo,
+
377  &aclInputToCellWeightsInfo,
+
378  &aclInputToOutputWeightsInfo,
+
379  &aclRecurrentToForgetWeightsInfo,
+
380  &aclRecurrentToCellWeightsInfo,
+
381  &aclRecurrentToOutputWeightsInfo,
+
382  &aclForgetGateBiasInfo,
+
383  &aclCellBiasInfo,
+
384  &aclOutputGateBiasInfo,
+
385  &aclCellStateInInfo,
+
386  &aclOutputStateInInfo,
+
387  &aclCellStateOutInfo,
+
388  &aclOutputStateOutInfo,
+
389  &aclOutputInfo,
+
390  aclParamsInfo);
+
391 }
+
392 
+
393 void NeonQLstmWorkload::FreeUnusedTensors()
+
394 {
+
395  FreeTensorIfUnused(m_InputToInputWeightsTensor);
+
396  FreeTensorIfUnused(m_InputToForgetWeightsTensor);
+
397  FreeTensorIfUnused(m_InputToCellWeightsTensor);
+
398  FreeTensorIfUnused(m_InputToOutputWeightsTensor);
+
399 
+
400  FreeTensorIfUnused(m_RecurrentToInputWeightsTensor);
+
401  FreeTensorIfUnused(m_RecurrentToForgetWeightsTensor);
+
402  FreeTensorIfUnused(m_RecurrentToCellWeightsTensor);
+
403  FreeTensorIfUnused(m_RecurrentToOutputWeightsTensor);
+
404 
+
405  FreeTensorIfUnused(m_CellToInputWeightsTensor);
+
406  FreeTensorIfUnused(m_CellToForgetWeightsTensor);
+
407  FreeTensorIfUnused(m_CellToOutputWeightsTensor);
+
408 
+
409  FreeTensorIfUnused(m_InputGateBiasTensor);
+
410  FreeTensorIfUnused(m_ForgetGateBiasTensor);
+
411  FreeTensorIfUnused(m_CellBiasTensor);
+
412  FreeTensorIfUnused(m_OutputGateBiasTensor);
+
413 
+
414  FreeTensorIfUnused(m_ProjectionWeightsTensor);
+
415  FreeTensorIfUnused(m_ProjectionBiasTensor);
+
416 
+
417  FreeTensorIfUnused(m_InputLayerNormWeightsTensor);
+
418  FreeTensorIfUnused(m_ForgetLayerNormWeightsTensor);
+
419  FreeTensorIfUnused(m_CellLayerNormWeightsTensor);
+
420  FreeTensorIfUnused(m_OutputLayerNormWeightsTensor);
+
421 }
+
422 
+
423 } //namespace armnn
+
+
+
float m_CellClip
Clipping threshold value for the cell state.
+
bool m_LayerNormEnabled
Enable/disable layer normalization.
+
const TensorInfo & GetInputToCellWeights() const
Definition: LstmParams.hpp:129
+
const TensorInfo & GetCellToOutputWeights() const
Definition: LstmParams.hpp:161
+
float m_ProjectionClip
Clipping threshold value for the projection.
+ +
const ConstTensorHandle * m_RecurrentToForgetWeights
+
arm::pipe::ProfilingGuid GetGuid() const final
Definition: Workload.hpp:61
+ +
float m_ForgetIntermediateScale
Forget intermediate quantization scale.
+
const TensorInfo & GetOutputLayerNormWeights() const
Definition: LstmParams.hpp:201
+
const TensorInfo * m_CellToInputWeights
Definition: LstmParams.hpp:97
+
const TensorInfo & GetInputToInputWeights() const
Definition: LstmParams.hpp:121
+
const ConstTensorHandle * m_OutputGateBias
+
const TensorInfo * m_ProjectionBias
Definition: LstmParams.hpp:105
+
const TensorInfo & GetForgetGateBias() const
Definition: LstmParams.hpp:169
+
const TensorInfo & GetRecurrentToForgetWeights() const
Definition: LstmParams.hpp:141
+
const ConstTensorHandle * m_InputToOutputWeights
+ +
const TensorInfo & GetProjectionWeights() const
Definition: LstmParams.hpp:181
+
const TensorInfo & GetInputGateBias() const
Definition: LstmParams.hpp:165
+
virtual void Execute() const override
+
const TensorInfo & GetInputToForgetWeights() const
Definition: LstmParams.hpp:125
+ +
const TensorInfo & GetProjectionBias() const
Definition: LstmParams.hpp:185
+
float m_CellIntermediateScale
Cell intermediate quantization scale.
+
Copyright (c) 2021 ARM Limited and Contributors.
+
float m_OutputIntermediateScale
Output intermediate quantization scale.
+
const ConstTensorHandle * m_ProjectionBias
+
void InitializeArmComputeTensorData(arm_compute::Tensor &tensor, TensorInfo tensorInfo, const ITensorHandle *handle)
+
const TensorInfo & GetInputLayerNormWeights() const
Definition: LstmParams.hpp:189
+
const ConstTensorHandle * m_CellBias
+
const ConstTensorHandle * m_ForgetGateBias
+
const TensorInfo & GetRecurrentToInputWeights() const
Definition: LstmParams.hpp:137
+
#define ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID(name, guid)
+
const TensorInfo & GetRecurrentToCellWeights() const
Definition: LstmParams.hpp:145
+
const ConstTensorHandle * m_InputToForgetWeights
+
const TensorInfo & GetOutputGateBias() const
Definition: LstmParams.hpp:177
+ +
const ConstTensorHandle * m_ForgetLayerNormWeights
+
const TensorInfo & GetCellBias() const
Definition: LstmParams.hpp:173
+ + +
const ConstTensorHandle * m_CellToInputWeights
+
const ConstTensorHandle * m_ProjectionWeights
+ +
A QLstmDescriptor for the QLstmLayer.
+
Status
Definition: Types.hpp:42
+
const ConstTensorHandle * m_RecurrentToInputWeights
+
const TensorInfo & GetTensorInfo() const
+
float m_HiddenStateScale
Hidden State quantization scale.
+
int32_t m_HiddenStateZeroPoint
Hidden State zero point.
+
const ConstTensorHandle * m_CellToOutputWeights
+
const TensorInfo * m_InputLayerNormWeights
Definition: LstmParams.hpp:106
+
const TensorInfo & GetCellLayerNormWeights() const
Definition: LstmParams.hpp:197
+
Contains information about TensorInfos of a layer.
+
const ConstTensorHandle * m_OutputLayerNormWeights
+
const TensorInfo & GetCellToInputWeights() const
Definition: LstmParams.hpp:153
+
const TensorInfo & GetCellToForgetWeights() const
Definition: LstmParams.hpp:157
+ +
const ConstTensorHandle * m_CellLayerNormWeights
+
#define ARMNN_REPORT_PROFILING_WORKLOAD_DESC(name, desc, infos, guid)
Definition: Profiling.hpp:227
+
const ConstTensorHandle * m_InputToCellWeights
+ +
float m_InputIntermediateScale
Input intermediate quantization scale.
+
arm_compute::Status NeonQLstmWorkloadValidate(const TensorInfo &input, const TensorInfo &cellStateIn, const TensorInfo &outputStateIn, const TensorInfo &cellStateOut, const TensorInfo &outputStateOut, const TensorInfo &output, const QLstmDescriptor &descriptor, const LstmInputParamsInfo &paramsInfo)
+
const TensorInfo & GetRecurrentToOutputWeights() const
Definition: LstmParams.hpp:149
+
const ConstTensorHandle * m_RecurrentToOutputWeights
+
bool m_CifgEnabled
Enable/disable CIFG (coupled input & forget gate).
+
const ConstTensorHandle * m_CellToForgetWeights
+
std::vector< ITensorHandle * > m_Outputs
+
bool m_PeepholeEnabled
Enable/disable peephole.
+
const ConstTensorHandle * m_InputToInputWeights
+
const TensorInfo & GetForgetLayerNormWeights() const
Definition: LstmParams.hpp:193
+ +
const ConstTensorHandle * m_RecurrentToCellWeights
+
const TensorInfo & GetInputToOutputWeights() const
Definition: LstmParams.hpp:133
+
NeonQLstmWorkload(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info)
+
const ConstTensorHandle * m_InputGateBias
+
bool m_ProjectionEnabled
Enable/disable the projection layer.
+
const ConstTensorHandle * m_InputLayerNormWeights
+
std::vector< ITensorHandle * > m_Inputs
+ + + + + -- cgit v1.2.1