ArmNN
 21.11
WorkloadData.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
9 
10 #include <InternalTypes.hpp>
11 
12 #include <armnn/Deprecated.hpp>
13 #include <armnn/Descriptors.hpp>
14 #include <armnn/Exceptions.hpp>
15 #include <armnn/Types.hpp>
16 #include <armnn/Tensor.hpp>
17 
19 
20 namespace armnn
21 {
22 
23 //A helper function that returns the bias data type required for given input data type.
24 DataType GetBiasDataType(DataType inputDataType);
25 
26 struct WorkloadInfo;
27 
29 {
30  std::vector<ITensorHandle*> m_Inputs;
31  std::vector<ITensorHandle*> m_Outputs;
33 
34  void ValidateInputsOutputs(const std::string& descName,
35  unsigned int numExpectedIn,
36  unsigned int numExpectedOut) const;
37 
38  template<typename T>
39  const T* GetAdditionalInformation() const
40  {
41  return static_cast<T*>(m_AdditionalInfoObject);
42  }
43 
44 protected:
45  ~QueueDescriptor() = default;
47  : m_AdditionalInfoObject(nullptr)
48  {}
49  QueueDescriptor(QueueDescriptor const&) = default;
50  QueueDescriptor& operator=(QueueDescriptor const&) = default;
51 };
52 
53 // Base class for queue descriptors which contain parameters.
54 template <typename LayerDescriptor>
56 {
57  LayerDescriptor m_Parameters;
58 
59 protected:
60  ~QueueDescriptorWithParameters() = default;
64 };
65 
67 {
68  void Validate(const WorkloadInfo& workloadInfo) const;
69 };
70 
72 {
73  void Validate(const WorkloadInfo& workloadInfo) const;
74 };
75 
77 {
78  void Validate(const WorkloadInfo& workloadInfo) const;
79 };
80 
83 
85 {
86  void Validate(const WorkloadInfo& workloadInfo) const;
87 };
88 
90 {
91  void Validate(const WorkloadInfo& workloadInfo) const;
92 };
93 
94 // Softmax layer workload data.
96 {
97  void Validate(const WorkloadInfo& workloadInfo) const;
98 };
99 
100 // Splitter layer workload data.
102 {
103  struct ViewOrigin
104  {
106  ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
107 
108  //View origin (size of the vector is the same as number of dimensions of the view).
109  std::vector<unsigned int> m_Origin;
110  };
111 
112  //View defines a tensor that will be carved from the input tensor.
113  //View origins are stored here, the extents are defined by sizes of the output tensors.
114  std::vector<ViewOrigin> m_ViewOrigins;
115 
116  void Validate(const WorkloadInfo& workloadInfo) const;
117 };
118 
119 // Concat layer workload data.
121 {
122  struct ViewOrigin
123  {
125  ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
126 
127  //View origin (size of the vector is the same as number of dimensions of the view).
128  std::vector<unsigned int> m_Origin;
129  };
130 
131  //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
132  //View origins are stored here, the extents are defined by sizes of the input tensors.
133  std::vector<ViewOrigin> m_ViewOrigins;
134 
135  void Validate(const WorkloadInfo& workloadInfo) const;
136 };
137 
138 // Deprecated. Use ConcatQueueDescriptor instead
140 
141 // Stack layer workload data.
143 {
144  void Validate(const WorkloadInfo& workloadInfo) const;
145 };
146 
147 // Activation layer workload data.
149 {
150  void Validate(const WorkloadInfo& workloadInfo) const;
151 };
152 
154 {
155  void Validate(const WorkloadInfo& workloadInfo) const;
156 };
157 
159 {
160  void Validate(const WorkloadInfo& workloadInfo) const;
161 };
162 
163 // Fill layer workload data.
165 {
166  void Validate(const WorkloadInfo& workloadInfo) const;
167 };
168 
169 // Fully connected layer workload data.
171 {
173  : m_Weight(nullptr)
174  , m_Bias(nullptr)
175  {
176  }
177 
180 
181  void Validate(const WorkloadInfo& workloadInfo) const;
182 };
183 
184 // Permute layer workload data.
186 {
187  void Validate(const WorkloadInfo& workloadInfo) const;
188 };
189 
190 // Pooling 2D layer workload data.
192 {
193  void Validate(const WorkloadInfo& workloadInfo) const;
194 };
195 
196 // Convolution 2D layer workload data.
198 {
200  : m_Weight(nullptr)
201  , m_Bias(nullptr)
202  {
203  }
204 
207 
208  void Validate(const WorkloadInfo& workloadInfo) const;
209 };
210 
211 // Convolution 3D layer workload data.
213 {
214  void Validate(const WorkloadInfo& workloadInfo) const;
215 };
216 
217 /// Depthwise Convolution 2D layer workload data.
218 ///
219 /// @note
220 /// The weights are in the format [1, H, W, I*M]. Where I is the input channel size, M the depthwise mutliplier and
221 /// H, W is the height and width of the filter kernel. If per channel quantization is applied
222 /// the weights will be quantized along the last dimension/axis (I*M) which corresponds to the output channel size.
223 /// If per channel quantization is applied the weights tensor will have I*M scales, one for each dimension
224 /// of the quantization axis. You have to be aware of this when reshaping the weights tensor.
225 /// Splitting the I*M axis, e.g. [1, H, W, I*M] --> [H, W, I, M], won't work without taking care of the
226 /// corresponding quantization scales.
227 /// If there is no per channel quantization applied reshaping the weights tensor won't cause any issues. There are
228 /// preconfigured permutation functions available @link WorkloadUtils.hpp here.
229 ///
231 {
233  : m_Weight(nullptr)
234  , m_Bias(nullptr)
235  {
236  }
237 
240 
241  void Validate(const WorkloadInfo& workloadInfo) const;
242 };
243 
245 {
247  : m_Anchors(nullptr)
248  {
249  }
250 
252 
253  void Validate(const WorkloadInfo& workloadInfo) const;
254 };
255 
256 // Normalization layer workload data.
258 {
259  void Validate(const WorkloadInfo& workloadInfo) const;
260 };
261 
262 // Add layer workload data.
264 {
265  void Validate(const WorkloadInfo& workloadInfo) const;
266 };
267 
268 // Multiplication layer workload data.
270 {
271  void Validate(const WorkloadInfo& workloadInfo) const;
272 };
273 
274 // Division layer workload data.
276 {
277  void Validate(const WorkloadInfo& workloadInfo) const;
278 };
279 
280 // Subtraction layer workload data.
282 {
283  void Validate(const WorkloadInfo& workloadInfo) const;
284 };
285 
286 // Maximum layer workload data.
288 {
289  void Validate(const WorkloadInfo& workloadInfo) const;
290 };
291 
292 // Mean layer workload data.
294 {
295  void Validate(const WorkloadInfo& workloadInfo) const;
296 };
297 
298 // Pad layer workload data
300 {
301  void Validate(const WorkloadInfo& workloadInfo) const;
302 };
303 
305 {
306  void Validate(const WorkloadInfo& workloadInfo) const;
307 };
308 
309 // Deprecated use ComparisonQueueDescriptor instead
311 {
312  void Validate(const WorkloadInfo& workloadInfo) const;
313 };
314 
315 // Batch norm layer workload data.
317 {
319  : m_Mean(nullptr)
320  , m_Variance(nullptr)
321  , m_Beta(nullptr)
322  , m_Gamma(nullptr)
323  {
324  }
325 
330 
331  void Validate(const WorkloadInfo& workloadInfo) const;
332 };
333 
335 {
336  void Validate(const WorkloadInfo& workloadInfo) const;
337 };
338 
340 struct
341 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("ResizeBilinearQueueDescriptor is deprecated use ResizeQueueDescriptor instead",
342  "22.08")
343 ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
344 {
345  void Validate(const WorkloadInfo& workloadInfo) const;
346 };
348 
350 {
351  void Validate(const WorkloadInfo& workloadInfo) const;
352 };
353 
355 {
357  : m_Min(nullptr)
358  , m_Max(nullptr)
359  {
360  }
361 
364 
365  void Validate(const WorkloadInfo& workloadInfo) const;
366 };
367 
369 {
370  void Validate(const WorkloadInfo& workloadInfo) const;
371 };
372 
374 {
375  void Validate(const WorkloadInfo& workloadInfo) const;
376 };
377 
379 {
380  void Validate(const WorkloadInfo& workloadInfo) const;
381 };
382 
384 {
386  : m_LayerOutput(nullptr)
387  {
388  }
389 
391 
392  void Validate(const WorkloadInfo& workloadInfo) const;
393 };
394 
396 {
397  void Validate(const WorkloadInfo& workloadInfo) const;
398 };
399 
401 {
402  void Validate(const WorkloadInfo& workloadInfo) const;
403 };
404 
406 {
407  void Validate(const WorkloadInfo& workloadInfo) const;
408 };
409 
411 {
412  void Validate(const WorkloadInfo& workloadInfo) const;
413 };
414 
416 {
418  : m_InputToInputWeights(nullptr)
419  , m_InputToForgetWeights(nullptr)
420  , m_InputToCellWeights(nullptr)
421  , m_InputToOutputWeights(nullptr)
422  , m_RecurrentToInputWeights(nullptr)
423  , m_RecurrentToForgetWeights(nullptr)
424  , m_RecurrentToCellWeights(nullptr)
425  , m_RecurrentToOutputWeights(nullptr)
426  , m_CellToInputWeights(nullptr)
427  , m_CellToForgetWeights(nullptr)
428  , m_CellToOutputWeights(nullptr)
429  , m_InputGateBias(nullptr)
430  , m_ForgetGateBias(nullptr)
431  , m_CellBias(nullptr)
432  , m_OutputGateBias(nullptr)
433  , m_ProjectionWeights(nullptr)
434  , m_ProjectionBias(nullptr)
435  , m_InputLayerNormWeights(nullptr)
436  , m_ForgetLayerNormWeights(nullptr)
437  , m_CellLayerNormWeights(nullptr)
438  , m_OutputLayerNormWeights(nullptr)
439  {
440  }
441 
463 
464  void Validate(const WorkloadInfo& workloadInfo) const;
465 };
466 
468 {
469  void Validate(const WorkloadInfo& workloadInfo) const;
470 };
471 
473 {
474  void Validate(const WorkloadInfo& workloadInfo) const;
475 };
476 
478 {
479  void Validate(const WorkloadInfo& workloadInfo) const;
480 };
481 
483 {
484  void Validate(const WorkloadInfo& workloadInfo) const;
485 };
486 
488 {
489  void Validate(const WorkloadInfo& workloadInfo) const;
490 };
491 
493 {
494  void Validate(const WorkloadInfo& workloadInfo) const;
495 };
496 
497 // Minimum layer workload data.
499 {
500  void Validate(const WorkloadInfo& workloadInfo) const;
501 };
502 
503 // Deprecated use ComparisonQueueDescriptor instead
505 {
506  void Validate(const WorkloadInfo& workloadInfo) const;
507 };
508 
510 {
511  DebugQueueDescriptor() : m_Guid(0) {}
512 
513  void Validate(const WorkloadInfo& workloadInfo) const;
514 
516  std::string m_LayerName;
517  unsigned int m_SlotIndex;
518 };
519 
521 {
522  void Validate(const WorkloadInfo& workloadInfo) const;
523 };
524 
526 {
527  void Validate(const WorkloadInfo& workloadInfo) const;
528 };
529 
531 {
533  : m_PreCompiledObject(nullptr)
534  {
535  }
536 
538 
539  void Validate(const WorkloadInfo& workloadInfo) const;
540 };
541 
543 {
544  void Validate(const WorkloadInfo& workloadInfo) const;
545 };
546 
548 {
549  void Validate(const WorkloadInfo& workloadInfo) const;
550 };
551 
553 {
554  void Validate(const WorkloadInfo& workloadInfo) const;
555 };
556 
558 {
559  void Validate(const WorkloadInfo& workloadInfo) const;
560 };
561 
563 {
565  m_Weight(nullptr),
566  m_Bias(nullptr)
567  {}
568 
571 
572  void Validate(const WorkloadInfo& workloadInfo) const;
573 };
574 
576 {
577  void Validate(const WorkloadInfo& workloadInfo) const;
578 };
579 
581 {
583  : m_InputToInputWeights(nullptr)
584  , m_InputToForgetWeights(nullptr)
585  , m_InputToCellWeights(nullptr)
586  , m_InputToOutputWeights(nullptr)
587  , m_RecurrentToInputWeights(nullptr)
588  , m_RecurrentToForgetWeights(nullptr)
589  , m_RecurrentToCellWeights(nullptr)
590  , m_RecurrentToOutputWeights(nullptr)
591  , m_CellToInputWeights(nullptr)
592  , m_CellToForgetWeights(nullptr)
593  , m_CellToOutputWeights(nullptr)
594  , m_InputGateBias(nullptr)
595  , m_ForgetGateBias(nullptr)
596  , m_CellBias(nullptr)
597  , m_OutputGateBias(nullptr)
598  , m_ProjectionWeights(nullptr)
599  , m_ProjectionBias(nullptr)
600  , m_InputLayerNormWeights(nullptr)
601  , m_ForgetLayerNormWeights(nullptr)
602  , m_CellLayerNormWeights(nullptr)
603  , m_OutputLayerNormWeights(nullptr)
604  {
605  }
606 
628 
629  void Validate(const WorkloadInfo& workloadInfo) const;
630 };
631 
633 {
635  : m_InputToInputWeights(nullptr)
636  , m_InputToForgetWeights(nullptr)
637  , m_InputToCellWeights(nullptr)
638  , m_InputToOutputWeights(nullptr)
639 
640  , m_RecurrentToInputWeights(nullptr)
641  , m_RecurrentToForgetWeights(nullptr)
642  , m_RecurrentToCellWeights(nullptr)
643  , m_RecurrentToOutputWeights(nullptr)
644 
645  , m_InputGateBias(nullptr)
646  , m_ForgetGateBias(nullptr)
647  , m_CellBias(nullptr)
648  , m_OutputGateBias(nullptr)
649  {}
650 
655 
660 
665 
666  void Validate(const WorkloadInfo& workloadInfo) const;
667 };
668 
670 {
671  void Validate(const WorkloadInfo& workloadInfo) const;
672 };
673 
675 {
676  void Validate(const WorkloadInfo& workloadInfo) const;
677 };
678 
680 {
681  void Validate(const WorkloadInfo& workloadInfo) const;
682 };
683 
685 {
686  void Validate(const WorkloadInfo& workloadInfo) const;
687 };
688 
690 {
691  void Validate(const WorkloadInfo& workloadInfo) const;
692 };
693 
695 {
696  void Validate(const WorkloadInfo& workloadInfo) const;
697 };
698 
700 {
701  void Validate(const WorkloadInfo& workloadInfo) const;
702 };
703 
705 {
706  void Validate(const WorkloadInfo& workloadInfo) const;
707 };
708 
710 {
712  : m_InputToInputWeights(nullptr)
713  , m_InputToForgetWeights(nullptr)
714  , m_InputToCellWeights(nullptr)
715  , m_InputToOutputWeights(nullptr)
716  , m_RecurrentToInputWeights(nullptr)
717  , m_RecurrentToForgetWeights(nullptr)
718  , m_RecurrentToCellWeights(nullptr)
719  , m_RecurrentToOutputWeights(nullptr)
720  , m_CellToInputWeights(nullptr)
721  , m_CellToForgetWeights(nullptr)
722  , m_CellToOutputWeights(nullptr)
723  , m_InputGateBias(nullptr)
724  , m_ForgetGateBias(nullptr)
725  , m_CellBias(nullptr)
726  , m_OutputGateBias(nullptr)
727  , m_ProjectionWeights(nullptr)
728  , m_ProjectionBias(nullptr)
729  , m_InputLayerNormWeights(nullptr)
730  , m_ForgetLayerNormWeights(nullptr)
731  , m_CellLayerNormWeights(nullptr)
732  , m_OutputLayerNormWeights(nullptr)
733  {
734  }
735 
757 
758  void Validate(const WorkloadInfo& workloadInfo) const;
759 };
760 
762 {
763  void Validate(const WorkloadInfo& workloadInfo) const;
764 };
765 
766 } // namespace armnn
const ConstTensorHandle * m_CellLayerNormWeights
const ConstTensorHandle * m_ProjectionWeights
const ConstTensorHandle * m_ProjectionWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
const ConstTensorHandle * m_ForgetGateBias
QueueDescriptor & operator=(QueueDescriptor const &)=default
const ConstTensorHandle * m_InputToOutputWeights
std::vector< unsigned int > m_Origin
const ConstTensorHandle * m_LayerOutput
const ConstTensorHandle * m_InputGateBias
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
const ConstTensorHandle * m_RecurrentToCellWeights
ViewOrigin(const std::vector< unsigned int > &origin)
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_Variance
const ConstTensorHandle * m_CellToInputWeights
const ConstTensorHandle * m_Weight
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_Bias
const ConstTensorHandle * m_InputToOutputWeights
DetectionPostProcessQueueDescriptor()
void ValidateInputsOutputs(const std::string &descName, unsigned int numExpectedIn, unsigned int numExpectedOut) const
const ConstTensorHandle * m_OutputLayerNormWeights
ViewOrigin(std::vector< unsigned int > const &origin)
Copyright (c) 2021 ARM Limited and Contributors.
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_Bias
const ConstTensorHandle * m_ForgetLayerNormWeights
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_CellLayerNormWeights
DataType
Definition: Types.hpp:35
std::vector< ViewOrigin > m_ViewOrigins
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
const ConstTensorHandle * m_InputToForgetWeights
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_ForgetGateBias
const ConstTensorHandle * m_CellBias
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_InputToCellWeights
class ARMNN_DEPRECATED_MSG_REMOVAL_DATE("Use ABI stable IStrategy instead.", "22.05") ILayerVisitor
const ConstTensorHandle * m_Weight
const ConstTensorHandle * m_OutputGateBias
const ConstTensorHandle * m_InputToForgetWeights
std::vector< ViewOrigin > m_ViewOrigins
const ConstTensorHandle * m_RecurrentToForgetWeights
DataType GetBiasDataType(DataType inputDataType)
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_ForgetGateBias
const T * GetAdditionalInformation() const
const ConstTensorHandle * m_CellToForgetWeights
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_CellToForgetWeights
std::vector< ITensorHandle * > m_Outputs
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_CellBias
profiling::ProfilingGuid LayerGuid
Define LayerGuid type.
Definition: Types.hpp:349
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_ForgetLayerNormWeights
Contains information about TensorInfos of a layer.
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_Anchors
const ConstTensorHandle * m_OutputGateBias
std::vector< ITensorHandle * > m_Inputs
const ConstTensorHandle * m_OutputLayerNormWeights
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_CellToInputWeights
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_RecurrentToInputWeights
const ConstTensorHandle * m_RecurrentToForgetWeights
Depthwise Convolution 2D layer workload data.
const ConstTensorHandle * m_RecurrentToForgetWeights
std::vector< unsigned int > m_Origin
const ConstTensorHandle * m_RecurrentToOutputWeights