ArmNN
 22.11
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 {
358  void Validate(const WorkloadInfo& workloadInfo) const;
359 };
360 
362 {
364  : m_Min(nullptr)
365  , m_Max(nullptr)
366  {
367  }
368 
371 
372  void Validate(const WorkloadInfo& workloadInfo) const;
373 };
374 
376 {
377  void Validate(const WorkloadInfo& workloadInfo) const;
378 };
379 
381 {
382  void Validate(const WorkloadInfo& workloadInfo) const;
383 };
384 
386 {
387  void Validate(const WorkloadInfo& workloadInfo) const;
388 };
389 
391 {
393  : m_LayerOutput(nullptr)
394  {
395  }
396 
398 
399  void Validate(const WorkloadInfo& workloadInfo) const;
400 };
401 
403 {
404  void Validate(const WorkloadInfo& workloadInfo) const;
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 {
425  : m_InputToInputWeights(nullptr)
426  , m_InputToForgetWeights(nullptr)
427  , m_InputToCellWeights(nullptr)
428  , m_InputToOutputWeights(nullptr)
429  , m_RecurrentToInputWeights(nullptr)
430  , m_RecurrentToForgetWeights(nullptr)
431  , m_RecurrentToCellWeights(nullptr)
432  , m_RecurrentToOutputWeights(nullptr)
433  , m_CellToInputWeights(nullptr)
434  , m_CellToForgetWeights(nullptr)
435  , m_CellToOutputWeights(nullptr)
436  , m_InputGateBias(nullptr)
437  , m_ForgetGateBias(nullptr)
438  , m_CellBias(nullptr)
439  , m_OutputGateBias(nullptr)
440  , m_ProjectionWeights(nullptr)
441  , m_ProjectionBias(nullptr)
442  , m_InputLayerNormWeights(nullptr)
443  , m_ForgetLayerNormWeights(nullptr)
444  , m_CellLayerNormWeights(nullptr)
445  , m_OutputLayerNormWeights(nullptr)
446  {
447  }
448 
470 
471  void Validate(const WorkloadInfo& workloadInfo) const;
472 };
473 
475 {
476  void Validate(const WorkloadInfo& workloadInfo) const;
477 };
478 
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 
504 // Minimum layer workload data.
506 {
507  void Validate(const WorkloadInfo& workloadInfo) const;
508 };
509 
510 // Deprecated use ComparisonQueueDescriptor instead
512 {
513  void Validate(const WorkloadInfo& workloadInfo) const;
514 };
515 
517 {
518  DebugQueueDescriptor() : m_Guid(0) {}
519 
520  void Validate(const WorkloadInfo& workloadInfo) const;
521 
523  std::string m_LayerName;
524  unsigned int m_SlotIndex;
525 
526  bool m_LayerOutputToFile = false;
527 };
528 
530 {
531  void Validate(const WorkloadInfo& workloadInfo) const;
532 };
533 
535 {
536  void Validate(const WorkloadInfo& workloadInfo) const;
537 };
538 
540 {
541  void Validate(const WorkloadInfo& workloadInfo) const;
542 };
543 
545 {
547  : m_PreCompiledObject(nullptr)
548  {
549  }
550 
552 
553  void Validate(const WorkloadInfo& workloadInfo) const;
554 };
555 
557 {
558  void Validate(const WorkloadInfo& workloadInfo) const;
559 };
560 
562 {
563  void Validate(const WorkloadInfo& workloadInfo) const;
564 };
565 
567 {
568  void Validate(const WorkloadInfo& workloadInfo) const;
569 };
570 
572 {
573  void Validate(const WorkloadInfo& workloadInfo) const;
574 };
575 
577 {
579  m_Weight(nullptr),
580  m_Bias(nullptr)
581  {}
582 
585 
586  void Validate(const WorkloadInfo& workloadInfo) const;
587 };
588 
590 {
591  void Validate(const WorkloadInfo& workloadInfo) const;
592 };
593 
595 {
597  : m_InputToInputWeights(nullptr)
598  , m_InputToForgetWeights(nullptr)
599  , m_InputToCellWeights(nullptr)
600  , m_InputToOutputWeights(nullptr)
601  , m_RecurrentToInputWeights(nullptr)
602  , m_RecurrentToForgetWeights(nullptr)
603  , m_RecurrentToCellWeights(nullptr)
604  , m_RecurrentToOutputWeights(nullptr)
605  , m_CellToInputWeights(nullptr)
606  , m_CellToForgetWeights(nullptr)
607  , m_CellToOutputWeights(nullptr)
608  , m_InputGateBias(nullptr)
609  , m_ForgetGateBias(nullptr)
610  , m_CellBias(nullptr)
611  , m_OutputGateBias(nullptr)
612  , m_ProjectionWeights(nullptr)
613  , m_ProjectionBias(nullptr)
614  , m_InputLayerNormWeights(nullptr)
615  , m_ForgetLayerNormWeights(nullptr)
616  , m_CellLayerNormWeights(nullptr)
617  , m_OutputLayerNormWeights(nullptr)
618  {
619  }
620 
642 
643  void Validate(const WorkloadInfo& workloadInfo) const;
644 };
645 
647 {
649  : m_InputToInputWeights(nullptr)
650  , m_InputToForgetWeights(nullptr)
651  , m_InputToCellWeights(nullptr)
652  , m_InputToOutputWeights(nullptr)
653 
654  , m_RecurrentToInputWeights(nullptr)
655  , m_RecurrentToForgetWeights(nullptr)
656  , m_RecurrentToCellWeights(nullptr)
657  , m_RecurrentToOutputWeights(nullptr)
658 
659  , m_InputGateBias(nullptr)
660  , m_ForgetGateBias(nullptr)
661  , m_CellBias(nullptr)
662  , m_OutputGateBias(nullptr)
663  {}
664 
669 
674 
679 
680  void Validate(const WorkloadInfo& workloadInfo) const;
681 };
682 
684 {
685  void Validate(const WorkloadInfo& workloadInfo) const;
686 };
687 
689 {
690  void Validate(const WorkloadInfo& workloadInfo) const;
691 };
692 
694 {
695  void Validate(const WorkloadInfo& workloadInfo) const;
696 };
697 
699 {
700  void Validate(const WorkloadInfo& workloadInfo) const;
701 };
702 
704 {
705  void Validate(const WorkloadInfo& workloadInfo) const;
706 };
707 
709 {
710  void Validate(const WorkloadInfo& workloadInfo) const;
711 };
712 
714 {
715  void Validate(const WorkloadInfo& workloadInfo) const;
716 };
717 
719 {
720  void Validate(const WorkloadInfo& workloadInfo) const;
721 };
722 
724 {
726  : m_InputToInputWeights(nullptr)
727  , m_InputToForgetWeights(nullptr)
728  , m_InputToCellWeights(nullptr)
729  , m_InputToOutputWeights(nullptr)
730  , m_RecurrentToInputWeights(nullptr)
731  , m_RecurrentToForgetWeights(nullptr)
732  , m_RecurrentToCellWeights(nullptr)
733  , m_RecurrentToOutputWeights(nullptr)
734  , m_CellToInputWeights(nullptr)
735  , m_CellToForgetWeights(nullptr)
736  , m_CellToOutputWeights(nullptr)
737  , m_InputGateBias(nullptr)
738  , m_ForgetGateBias(nullptr)
739  , m_CellBias(nullptr)
740  , m_OutputGateBias(nullptr)
741  , m_ProjectionWeights(nullptr)
742  , m_ProjectionBias(nullptr)
743  , m_InputLayerNormWeights(nullptr)
744  , m_ForgetLayerNormWeights(nullptr)
745  , m_CellLayerNormWeights(nullptr)
746  , m_OutputLayerNormWeights(nullptr)
747  {
748  }
749 
771 
772  void Validate(const WorkloadInfo& workloadInfo) const;
773 };
774 
776 {
777  void Validate(const WorkloadInfo& workloadInfo) const;
778 };
779 
781 {
782  void Validate(const WorkloadInfo& workloadInfo) const;
783 };
784 
785 } // 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
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
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
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