ArmNN
 22.05
WorkloadData.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6 
7 #include "TensorHandle.hpp"
8 
9 #include <armnn/Deprecated.hpp>
10 #include <armnn/Descriptors.hpp>
11 #include <armnn/Exceptions.hpp>
12 #include <armnn/Types.hpp>
13 #include <armnn/Tensor.hpp>
14 #include <common/include/ProfilingGuid.hpp>
15 
16 namespace armnn
17 {
18 
19 //A helper function that returns the bias data type required for given input data type.
20 DataType GetBiasDataType(DataType inputDataType);
21 
22 struct WorkloadInfo;
23 
25 {
26  std::vector<ITensorHandle*> m_Inputs;
27  std::vector<ITensorHandle*> m_Outputs;
29 
30  virtual ~QueueDescriptor() = default;
31 
32  void ValidateTensorNumDimensions(const TensorInfo& tensor,
33  std::string const& descName,
34  unsigned int numDimensions,
35  std::string const& tensorName) const;
36 
37  void ValidateTensorNumDimNumElem(const TensorInfo& tensorInfo,
38  unsigned int numDimension,
39  unsigned int numElements,
40  std::string const& tensorName) const;
41 
42  void ValidateInputsOutputs(const std::string& descName,
43  unsigned int numExpectedIn,
44  unsigned int numExpectedOut) const;
45 
46  template<typename T>
47  const T* GetAdditionalInformation() const
48  {
49  return static_cast<T*>(m_AdditionalInfoObject);
50  }
51 
52  bool m_AllowExpandedDims = false;
53 
54 protected:
56  : m_AdditionalInfoObject(nullptr)
57  {}
58  QueueDescriptor(QueueDescriptor const&) = default;
59  QueueDescriptor& operator=(QueueDescriptor const&) = default;
60 };
61 
62 // Base class for queue descriptors which contain parameters.
63 template <typename LayerDescriptor>
65 {
66  LayerDescriptor m_Parameters;
67 
68  virtual ~QueueDescriptorWithParameters() = default;
69 
70 protected:
74 };
75 
77 {
78  void Validate(const WorkloadInfo& workloadInfo) const;
79 };
80 
82 {
83  void Validate(const WorkloadInfo& workloadInfo) const;
84 };
85 
87 {
88  void Validate(const WorkloadInfo& workloadInfo) const;
89 };
90 
93 
95 {
96  void Validate(const WorkloadInfo& workloadInfo) const;
97 };
98 
100 {
101  void Validate(const WorkloadInfo& workloadInfo) const;
102 };
103 
104 // Softmax layer workload data.
106 {
107  void Validate(const WorkloadInfo& workloadInfo) const;
108 };
109 
110 // Splitter layer workload data.
112 {
113  struct ViewOrigin
114  {
116  ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
117 
118  //View origin (size of the vector is the same as number of dimensions of the view).
119  std::vector<unsigned int> m_Origin;
120  };
121 
122  //View defines a tensor that will be carved from the input tensor.
123  //View origins are stored here, the extents are defined by sizes of the output tensors.
124  std::vector<ViewOrigin> m_ViewOrigins;
125 
126  void Validate(const WorkloadInfo& workloadInfo) const;
127 };
128 
129 // Concat layer workload data.
131 {
132  struct ViewOrigin
133  {
135  ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
136 
137  //View origin (size of the vector is the same as number of dimensions of the view).
138  std::vector<unsigned int> m_Origin;
139  };
140 
141  //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
142  //View origins are stored here, the extents are defined by sizes of the input tensors.
143  std::vector<ViewOrigin> m_ViewOrigins;
144 
145  void Validate(const WorkloadInfo& workloadInfo) const;
146 };
147 
148 // Deprecated. Use ConcatQueueDescriptor instead
150 
151 // Stack layer workload data.
153 {
154  void Validate(const WorkloadInfo& workloadInfo) const;
155 };
156 
157 // Activation layer workload data.
159 {
160  void Validate(const WorkloadInfo& workloadInfo) const;
161 };
162 
164 {
165  void Validate(const WorkloadInfo& workloadInfo) const;
166 };
167 
169 {
170  void Validate(const WorkloadInfo& workloadInfo) const;
171 };
172 
173 // Fill layer workload data.
175 {
176  void Validate(const WorkloadInfo& workloadInfo) const;
177 };
178 
179 // Fully connected layer workload data.
181 {
183  : m_Weight(nullptr)
184  , m_Bias(nullptr)
185  {
186  }
187 
190 
191  void Validate(const WorkloadInfo& workloadInfo) const;
192 };
193 
194 // Permute layer workload data.
196 {
197  void Validate(const WorkloadInfo& workloadInfo) const;
198 };
199 
200 // Pooling 2D layer workload data.
202 {
203  void Validate(const WorkloadInfo& workloadInfo) const;
204 };
205 
206 // Pooling 3D layer workload data.
208 {
209  void Validate(const WorkloadInfo& workloadInfo) const;
210 };
211 
212 
213 // Convolution 2D layer workload data.
215 {
217  : m_Weight(nullptr)
218  , m_Bias(nullptr)
219  {
220  }
221 
224 
225  void Validate(const WorkloadInfo& workloadInfo) const;
226 };
227 
228 // Convolution 3D layer workload data.
230 {
231  void Validate(const WorkloadInfo& workloadInfo) const;
232 };
233 
234 /// Depthwise Convolution 2D layer workload data.
235 ///
236 /// @note
237 /// The weights are in the format [1, H, W, I*M]. Where I is the input channel size, M the depthwise mutliplier and
238 /// H, W is the height and width of the filter kernel. If per channel quantization is applied
239 /// the weights will be quantized along the last dimension/axis (I*M) which corresponds to the output channel size.
240 /// If per channel quantization is applied the weights tensor will have I*M scales, one for each dimension
241 /// of the quantization axis. You have to be aware of this when reshaping the weights tensor.
242 /// Splitting the I*M axis, e.g. [1, H, W, I*M] --> [H, W, I, M], won't work without taking care of the
243 /// corresponding quantization scales.
244 /// If there is no per channel quantization applied reshaping the weights tensor won't cause any issues. There are
245 /// preconfigured permutation functions available @link WorkloadUtils.hpp here.
246 ///
248 {
250  : m_Weight(nullptr)
251  , m_Bias(nullptr)
252  {
253  }
254 
257 
258  void Validate(const WorkloadInfo& workloadInfo) const;
259 };
260 
262 {
264  : m_Anchors(nullptr)
265  {
266  }
267 
269 
270  void Validate(const WorkloadInfo& workloadInfo) const;
271 };
272 
273 // Normalization layer workload data.
275 {
276  void Validate(const WorkloadInfo& workloadInfo) const;
277 };
278 
279 // Add layer workload data.
281 {
282  void Validate(const WorkloadInfo& workloadInfo) const;
283 };
284 
285 // Multiplication layer workload data.
287 {
288  void Validate(const WorkloadInfo& workloadInfo) const;
289 };
290 
291 // Division layer workload data.
293 {
294  void Validate(const WorkloadInfo& workloadInfo) const;
295 };
296 
297 // Subtraction layer workload data.
299 {
300  void Validate(const WorkloadInfo& workloadInfo) const;
301 };
302 
303 // Maximum layer workload data.
305 {
306  void Validate(const WorkloadInfo& workloadInfo) const;
307 };
308 
309 // Mean layer workload data.
311 {
312  void Validate(const WorkloadInfo& workloadInfo) const;
313 };
314 
315 // Pad layer workload data
317 {
318  void Validate(const WorkloadInfo& workloadInfo) const;
319 };
320 
322 {
323  void Validate(const WorkloadInfo& workloadInfo) const;
324 };
325 
326 // Deprecated use ComparisonQueueDescriptor instead
328 {
329  void Validate(const WorkloadInfo& workloadInfo) const;
330 };
331 
332 // Batch norm layer workload data.
334 {
336  : m_Mean(nullptr)
337  , m_Variance(nullptr)
338  , m_Beta(nullptr)
339  , m_Gamma(nullptr)
340  {
341  }
342 
347 
348  void Validate(const WorkloadInfo& workloadInfo) const;
349 };
350 
352 {
353  void Validate(const WorkloadInfo& workloadInfo) const;
354 };
355 
357 struct
358 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("ResizeBilinearQueueDescriptor is deprecated use ResizeQueueDescriptor instead",
359  "22.08")
360 ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
361 {
362  void Validate(const WorkloadInfo& workloadInfo) const;
363 };
365 
367 {
368  void Validate(const WorkloadInfo& workloadInfo) const;
369 };
370 
372 {
374  : m_Min(nullptr)
375  , m_Max(nullptr)
376  {
377  }
378 
381 
382  void Validate(const WorkloadInfo& workloadInfo) const;
383 };
384 
386 {
387  void Validate(const WorkloadInfo& workloadInfo) const;
388 };
389 
391 {
392  void Validate(const WorkloadInfo& workloadInfo) const;
393 };
394 
396 {
397  void Validate(const WorkloadInfo& workloadInfo) const;
398 };
399 
401 {
403  : m_LayerOutput(nullptr)
404  {
405  }
406 
408 
409  void Validate(const WorkloadInfo& workloadInfo) const;
410 };
411 
413 {
414  void Validate(const WorkloadInfo& workloadInfo) const;
415 };
416 
418 {
419  void Validate(const WorkloadInfo& workloadInfo) const;
420 };
421 
423 {
424  void Validate(const WorkloadInfo& workloadInfo) const;
425 };
426 
428 {
429  void Validate(const WorkloadInfo& workloadInfo) const;
430 };
431 
433 {
435  : m_InputToInputWeights(nullptr)
436  , m_InputToForgetWeights(nullptr)
437  , m_InputToCellWeights(nullptr)
438  , m_InputToOutputWeights(nullptr)
439  , m_RecurrentToInputWeights(nullptr)
440  , m_RecurrentToForgetWeights(nullptr)
441  , m_RecurrentToCellWeights(nullptr)
442  , m_RecurrentToOutputWeights(nullptr)
443  , m_CellToInputWeights(nullptr)
444  , m_CellToForgetWeights(nullptr)
445  , m_CellToOutputWeights(nullptr)
446  , m_InputGateBias(nullptr)
447  , m_ForgetGateBias(nullptr)
448  , m_CellBias(nullptr)
449  , m_OutputGateBias(nullptr)
450  , m_ProjectionWeights(nullptr)
451  , m_ProjectionBias(nullptr)
452  , m_InputLayerNormWeights(nullptr)
453  , m_ForgetLayerNormWeights(nullptr)
454  , m_CellLayerNormWeights(nullptr)
455  , m_OutputLayerNormWeights(nullptr)
456  {
457  }
458 
480 
481  void Validate(const WorkloadInfo& workloadInfo) const;
482 };
483 
485 {
486  void Validate(const WorkloadInfo& workloadInfo) const;
487 };
488 
490 {
491  void Validate(const WorkloadInfo& workloadInfo) const;
492 };
493 
495 {
496  void Validate(const WorkloadInfo& workloadInfo) const;
497 };
498 
500 {
501  void Validate(const WorkloadInfo& workloadInfo) const;
502 };
503 
505 {
506  void Validate(const WorkloadInfo& workloadInfo) const;
507 };
508 
510 {
511  void Validate(const WorkloadInfo& workloadInfo) const;
512 };
513 
514 // Minimum layer workload data.
516 {
517  void Validate(const WorkloadInfo& workloadInfo) const;
518 };
519 
520 // Deprecated use ComparisonQueueDescriptor instead
522 {
523  void Validate(const WorkloadInfo& workloadInfo) const;
524 };
525 
527 {
528  DebugQueueDescriptor() : m_Guid(0) {}
529 
530  void Validate(const WorkloadInfo& workloadInfo) const;
531 
533  std::string m_LayerName;
534  unsigned int m_SlotIndex;
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 {
555  : m_PreCompiledObject(nullptr)
556  {
557  }
558 
560 
561  void Validate(const WorkloadInfo& workloadInfo) const;
562 };
563 
565 {
566  void Validate(const WorkloadInfo& workloadInfo) const;
567 };
568 
570 {
571  void Validate(const WorkloadInfo& workloadInfo) const;
572 };
573 
575 {
576  void Validate(const WorkloadInfo& workloadInfo) const;
577 };
578 
580 {
581  void Validate(const WorkloadInfo& workloadInfo) const;
582 };
583 
585 {
587  m_Weight(nullptr),
588  m_Bias(nullptr)
589  {}
590 
593 
594  void Validate(const WorkloadInfo& workloadInfo) const;
595 };
596 
598 {
599  void Validate(const WorkloadInfo& workloadInfo) const;
600 };
601 
603 {
605  : m_InputToInputWeights(nullptr)
606  , m_InputToForgetWeights(nullptr)
607  , m_InputToCellWeights(nullptr)
608  , m_InputToOutputWeights(nullptr)
609  , m_RecurrentToInputWeights(nullptr)
610  , m_RecurrentToForgetWeights(nullptr)
611  , m_RecurrentToCellWeights(nullptr)
612  , m_RecurrentToOutputWeights(nullptr)
613  , m_CellToInputWeights(nullptr)
614  , m_CellToForgetWeights(nullptr)
615  , m_CellToOutputWeights(nullptr)
616  , m_InputGateBias(nullptr)
617  , m_ForgetGateBias(nullptr)
618  , m_CellBias(nullptr)
619  , m_OutputGateBias(nullptr)
620  , m_ProjectionWeights(nullptr)
621  , m_ProjectionBias(nullptr)
622  , m_InputLayerNormWeights(nullptr)
623  , m_ForgetLayerNormWeights(nullptr)
624  , m_CellLayerNormWeights(nullptr)
625  , m_OutputLayerNormWeights(nullptr)
626  {
627  }
628 
650 
651  void Validate(const WorkloadInfo& workloadInfo) const;
652 };
653 
655 {
657  : m_InputToInputWeights(nullptr)
658  , m_InputToForgetWeights(nullptr)
659  , m_InputToCellWeights(nullptr)
660  , m_InputToOutputWeights(nullptr)
661 
662  , m_RecurrentToInputWeights(nullptr)
663  , m_RecurrentToForgetWeights(nullptr)
664  , m_RecurrentToCellWeights(nullptr)
665  , m_RecurrentToOutputWeights(nullptr)
666 
667  , m_InputGateBias(nullptr)
668  , m_ForgetGateBias(nullptr)
669  , m_CellBias(nullptr)
670  , m_OutputGateBias(nullptr)
671  {}
672 
677 
682 
687 
688  void Validate(const WorkloadInfo& workloadInfo) const;
689 };
690 
692 {
693  void Validate(const WorkloadInfo& workloadInfo) const;
694 };
695 
697 {
698  void Validate(const WorkloadInfo& workloadInfo) const;
699 };
700 
702 {
703  void Validate(const WorkloadInfo& workloadInfo) const;
704 };
705 
707 {
708  void Validate(const WorkloadInfo& workloadInfo) const;
709 };
710 
712 {
713  void Validate(const WorkloadInfo& workloadInfo) const;
714 };
715 
717 {
718  void Validate(const WorkloadInfo& workloadInfo) const;
719 };
720 
722 {
723  void Validate(const WorkloadInfo& workloadInfo) const;
724 };
725 
727 {
728  void Validate(const WorkloadInfo& workloadInfo) const;
729 };
730 
732 {
734  : m_InputToInputWeights(nullptr)
735  , m_InputToForgetWeights(nullptr)
736  , m_InputToCellWeights(nullptr)
737  , m_InputToOutputWeights(nullptr)
738  , m_RecurrentToInputWeights(nullptr)
739  , m_RecurrentToForgetWeights(nullptr)
740  , m_RecurrentToCellWeights(nullptr)
741  , m_RecurrentToOutputWeights(nullptr)
742  , m_CellToInputWeights(nullptr)
743  , m_CellToForgetWeights(nullptr)
744  , m_CellToOutputWeights(nullptr)
745  , m_InputGateBias(nullptr)
746  , m_ForgetGateBias(nullptr)
747  , m_CellBias(nullptr)
748  , m_OutputGateBias(nullptr)
749  , m_ProjectionWeights(nullptr)
750  , m_ProjectionBias(nullptr)
751  , m_InputLayerNormWeights(nullptr)
752  , m_ForgetLayerNormWeights(nullptr)
753  , m_CellLayerNormWeights(nullptr)
754  , m_OutputLayerNormWeights(nullptr)
755  {
756  }
757 
779 
780  void Validate(const WorkloadInfo& workloadInfo) const;
781 };
782 
784 {
785  void Validate(const WorkloadInfo& workloadInfo) const;
786 };
787 
788 } // 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
void ValidateTensorNumDimNumElem(const TensorInfo &tensorInfo, unsigned int numDimension, unsigned int numElements, std::string const &tensorName) const
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:48
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
ARMNN_NO_DEPRECATE_WARN_BEGIN struct ARMNN_DEPRECATED_MSG_REMOVAL_DATE("ResizeBilinearQueueDescriptor is deprecated use ResizeQueueDescriptor instead", "22.08") ResizeBilinearQueueDescriptor
const ConstTensorHandle * m_CellToOutputWeights
const ConstTensorHandle * m_RecurrentToOutputWeights
const ConstTensorHandle * m_InputLayerNormWeights
const ConstTensorHandle * m_InputToCellWeights
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
void ValidateTensorNumDimensions(const TensorInfo &tensor, std::string const &descName, unsigned int numDimensions, std::string const &tensorName) const
const ConstTensorHandle * m_InputToCellWeights
const ConstTensorHandle * m_ForgetGateBias
const T * GetAdditionalInformation() const
arm::pipe::ProfilingGuid LayerGuid
Define LayerGuid type.
Definition: Types.hpp:26
const ConstTensorHandle * m_CellToForgetWeights
const ConstTensorHandle * m_InputToOutputWeights
const ConstTensorHandle * m_ProjectionBias
const ConstTensorHandle * m_CellToForgetWeights
std::vector< ITensorHandle * > m_Outputs
virtual ~QueueDescriptor()=default
const ConstTensorHandle * m_RecurrentToCellWeights
const ConstTensorHandle * m_InputGateBias
const ConstTensorHandle * m_InputToInputWeights
const ConstTensorHandle * m_CellBias
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