ArmNN
 21.08
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 /// Depthwise Convolution 2D layer workload data.
212 ///
213 /// @note
214 /// The weights are in the format [1, H, W, I*M]. Where I is the input channel size, M the depthwise mutliplier and
215 /// H, W is the height and width of the filter kernel. If per channel quantization is applied
216 /// the weights will be quantized along the last dimension/axis (I*M) which corresponds to the output channel size.
217 /// If per channel quantization is applied the weights tensor will have I*M scales, one for each dimension
218 /// of the quantization axis. You have to be aware of this when reshaping the weights tensor.
219 /// Splitting the I*M axis, e.g. [1, H, W, I*M] --> [H, W, I, M], won't work without taking care of the
220 /// corresponding quantization scales.
221 /// If there is no per channel quantization applied reshaping the weights tensor won't cause any issues. There are
222 /// preconfigured permutation functions available @link WorkloadUtils.hpp here.
223 ///
225 {
227  : m_Weight(nullptr)
228  , m_Bias(nullptr)
229  {
230  }
231 
234 
235  void Validate(const WorkloadInfo& workloadInfo) const;
236 };
237 
239 {
241  : m_Anchors(nullptr)
242  {
243  }
244 
246 
247  void Validate(const WorkloadInfo& workloadInfo) const;
248 };
249 
250 // Normalization layer workload data.
252 {
253  void Validate(const WorkloadInfo& workloadInfo) const;
254 };
255 
256 // Add layer workload data.
258 {
259  void Validate(const WorkloadInfo& workloadInfo) const;
260 };
261 
262 // Multiplication layer workload data.
264 {
265  void Validate(const WorkloadInfo& workloadInfo) const;
266 };
267 
268 // Division layer workload data.
270 {
271  void Validate(const WorkloadInfo& workloadInfo) const;
272 };
273 
274 // Subtraction layer workload data.
276 {
277  void Validate(const WorkloadInfo& workloadInfo) const;
278 };
279 
280 // Maximum layer workload data.
282 {
283  void Validate(const WorkloadInfo& workloadInfo) const;
284 };
285 
286 // Mean layer workload data.
288 {
289  void Validate(const WorkloadInfo& workloadInfo) const;
290 };
291 
292 // Pad layer workload data
294 {
295  void Validate(const WorkloadInfo& workloadInfo) const;
296 };
297 
299 {
300  void Validate(const WorkloadInfo& workloadInfo) const;
301 };
302 
303 // Deprecated use ComparisonQueueDescriptor instead
305 {
306  void Validate(const WorkloadInfo& workloadInfo) const;
307 };
308 
309 // Batch norm layer workload data.
311 {
313  : m_Mean(nullptr)
314  , m_Variance(nullptr)
315  , m_Beta(nullptr)
316  , m_Gamma(nullptr)
317  {
318  }
319 
324 
325  void Validate(const WorkloadInfo& workloadInfo) const;
326 };
327 
329 {
330  void Validate(const WorkloadInfo& workloadInfo) const;
331 };
332 
334 {
335  void Validate(const WorkloadInfo& workloadInfo) const;
336 };
337 
339 {
340  void Validate(const WorkloadInfo& workloadInfo) const;
341 };
342 
344 {
346  : m_Min(nullptr)
347  , m_Max(nullptr)
348  {
349  }
350 
353 
354  void Validate(const WorkloadInfo& workloadInfo) const;
355 };
356 
358 {
359  void Validate(const WorkloadInfo& workloadInfo) const;
360 };
361 
363 {
364  void Validate(const WorkloadInfo& workloadInfo) const;
365 };
366 
368 {
369  void Validate(const WorkloadInfo& workloadInfo) const;
370 };
371 
373 {
375  : m_LayerOutput(nullptr)
376  {
377  }
378 
380 
381  void Validate(const WorkloadInfo& workloadInfo) const;
382 };
383 
385 {
386  void Validate(const WorkloadInfo& workloadInfo) const;
387 };
388 
390 {
391  void Validate(const WorkloadInfo& workloadInfo) const;
392 };
393 
395 {
396  void Validate(const WorkloadInfo& workloadInfo) const;
397 };
398 
400 {
401  void Validate(const WorkloadInfo& workloadInfo) const;
402 };
403 
405 {
407  : m_InputToInputWeights(nullptr)
408  , m_InputToForgetWeights(nullptr)
409  , m_InputToCellWeights(nullptr)
410  , m_InputToOutputWeights(nullptr)
411  , m_RecurrentToInputWeights(nullptr)
412  , m_RecurrentToForgetWeights(nullptr)
413  , m_RecurrentToCellWeights(nullptr)
414  , m_RecurrentToOutputWeights(nullptr)
415  , m_CellToInputWeights(nullptr)
416  , m_CellToForgetWeights(nullptr)
417  , m_CellToOutputWeights(nullptr)
418  , m_InputGateBias(nullptr)
419  , m_ForgetGateBias(nullptr)
420  , m_CellBias(nullptr)
421  , m_OutputGateBias(nullptr)
422  , m_ProjectionWeights(nullptr)
423  , m_ProjectionBias(nullptr)
424  , m_InputLayerNormWeights(nullptr)
425  , m_ForgetLayerNormWeights(nullptr)
426  , m_CellLayerNormWeights(nullptr)
427  , m_OutputLayerNormWeights(nullptr)
428  {
429  }
430 
452 
453  void Validate(const WorkloadInfo& workloadInfo) const;
454 };
455 
457 {
458  void Validate(const WorkloadInfo& workloadInfo) const;
459 };
460 
462 {
463  void Validate(const WorkloadInfo& workloadInfo) const;
464 };
465 
467 {
468  void Validate(const WorkloadInfo& workloadInfo) const;
469 };
470 
472 {
473  void Validate(const WorkloadInfo& workloadInfo) const;
474 };
475 
477 {
478  void Validate(const WorkloadInfo& workloadInfo) const;
479 };
480 
482 {
483  void Validate(const WorkloadInfo& workloadInfo) const;
484 };
485 
486 // Minimum layer workload data.
488 {
489  void Validate(const WorkloadInfo& workloadInfo) const;
490 };
491 
492 // Deprecated use ComparisonQueueDescriptor instead
494 {
495  void Validate(const WorkloadInfo& workloadInfo) const;
496 };
497 
499 {
500  DebugQueueDescriptor() : m_Guid(0) {}
501 
502  void Validate(const WorkloadInfo& workloadInfo) const;
503 
505  std::string m_LayerName;
506  unsigned int m_SlotIndex;
507 };
508 
510 {
511  void Validate(const WorkloadInfo& workloadInfo) const;
512 };
513 
515 {
516  void Validate(const WorkloadInfo& workloadInfo) const;
517 };
518 
520 {
522  : m_PreCompiledObject(nullptr)
523  {
524  }
525 
527 
528  void Validate(const WorkloadInfo& workloadInfo) const;
529 };
530 
532 {
533  void Validate(const WorkloadInfo& workloadInfo) const;
534 };
535 
537 {
538  void Validate(const WorkloadInfo& workloadInfo) const;
539 };
540 
542 {
543  void Validate(const WorkloadInfo& workloadInfo) const;
544 };
545 
547 {
548  void Validate(const WorkloadInfo& workloadInfo) const;
549 };
550 
552 {
554  m_Weight(nullptr),
555  m_Bias(nullptr)
556  {}
557 
560 
561  void Validate(const WorkloadInfo& workloadInfo) const;
562 };
563 
565 {
566  void Validate(const WorkloadInfo& workloadInfo) const;
567 };
568 
570 {
572  : m_InputToInputWeights(nullptr)
573  , m_InputToForgetWeights(nullptr)
574  , m_InputToCellWeights(nullptr)
575  , m_InputToOutputWeights(nullptr)
576  , m_RecurrentToInputWeights(nullptr)
577  , m_RecurrentToForgetWeights(nullptr)
578  , m_RecurrentToCellWeights(nullptr)
579  , m_RecurrentToOutputWeights(nullptr)
580  , m_CellToInputWeights(nullptr)
581  , m_CellToForgetWeights(nullptr)
582  , m_CellToOutputWeights(nullptr)
583  , m_InputGateBias(nullptr)
584  , m_ForgetGateBias(nullptr)
585  , m_CellBias(nullptr)
586  , m_OutputGateBias(nullptr)
587  , m_ProjectionWeights(nullptr)
588  , m_ProjectionBias(nullptr)
589  , m_InputLayerNormWeights(nullptr)
590  , m_ForgetLayerNormWeights(nullptr)
591  , m_CellLayerNormWeights(nullptr)
592  , m_OutputLayerNormWeights(nullptr)
593  {
594  }
595 
617 
618  void Validate(const WorkloadInfo& workloadInfo) const;
619 };
620 
622 {
624  : m_InputToInputWeights(nullptr)
625  , m_InputToForgetWeights(nullptr)
626  , m_InputToCellWeights(nullptr)
627  , m_InputToOutputWeights(nullptr)
628 
629  , m_RecurrentToInputWeights(nullptr)
630  , m_RecurrentToForgetWeights(nullptr)
631  , m_RecurrentToCellWeights(nullptr)
632  , m_RecurrentToOutputWeights(nullptr)
633 
634  , m_InputGateBias(nullptr)
635  , m_ForgetGateBias(nullptr)
636  , m_CellBias(nullptr)
637  , m_OutputGateBias(nullptr)
638  {}
639 
644 
649 
654 
655  void Validate(const WorkloadInfo& workloadInfo) const;
656 };
657 
659 {
660  void Validate(const WorkloadInfo& workloadInfo) const;
661 };
662 
664 {
665  void Validate(const WorkloadInfo& workloadInfo) const;
666 };
667 
669 {
670  void Validate(const WorkloadInfo& workloadInfo) const;
671 };
672 
674 {
675  void Validate(const WorkloadInfo& workloadInfo) const;
676 };
677 
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 {
701  : m_InputToInputWeights(nullptr)
702  , m_InputToForgetWeights(nullptr)
703  , m_InputToCellWeights(nullptr)
704  , m_InputToOutputWeights(nullptr)
705  , m_RecurrentToInputWeights(nullptr)
706  , m_RecurrentToForgetWeights(nullptr)
707  , m_RecurrentToCellWeights(nullptr)
708  , m_RecurrentToOutputWeights(nullptr)
709  , m_CellToInputWeights(nullptr)
710  , m_CellToForgetWeights(nullptr)
711  , m_CellToOutputWeights(nullptr)
712  , m_InputGateBias(nullptr)
713  , m_ForgetGateBias(nullptr)
714  , m_CellBias(nullptr)
715  , m_OutputGateBias(nullptr)
716  , m_ProjectionWeights(nullptr)
717  , m_ProjectionBias(nullptr)
718  , m_InputLayerNormWeights(nullptr)
719  , m_ForgetLayerNormWeights(nullptr)
720  , m_CellLayerNormWeights(nullptr)
721  , m_OutputLayerNormWeights(nullptr)
722  {
723  }
724 
746 
747  void Validate(const WorkloadInfo& workloadInfo) const;
748 };
749 
750 } // 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
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
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
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:313
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