IVGCVSW-3722 Add front end support for ArgMinMax
[platform/upstream/armnn.git] / src / backends / backendsCommon / WorkloadData.hpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #pragma once
6
7 #include "CpuTensorHandleFwd.hpp"
8 #include "WorkloadDataFwd.hpp"
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
18 #include <backendsCommon/OutputHandler.hpp>
19 #include <backendsCommon/WorkloadInfo.hpp>
20
21 namespace armnn
22 {
23
24 //A helper function that returns the bias data type required for given input data type.
25 DataType GetBiasDataType(DataType inputDataType);
26
27 struct WorkloadInfo;
28
29 struct QueueDescriptor
30 {
31     std::vector<ITensorHandle*> m_Inputs;
32     std::vector<ITensorHandle*> m_Outputs;
33
34     void ValidateInputsOutputs(const std::string& descName,
35         unsigned int numExpectedIn, unsigned int numExpectedOut) const;
36
37
38 protected:
39     ~QueueDescriptor() = default;
40     QueueDescriptor() = default;
41     QueueDescriptor(QueueDescriptor const&) = default;
42     QueueDescriptor& operator=(QueueDescriptor const&) = default;
43 };
44
45 // Base class for queue descriptors which contain parameters.
46 template <typename LayerDescriptor>
47 struct QueueDescriptorWithParameters : public QueueDescriptor
48 {
49     LayerDescriptor m_Parameters;
50
51 protected:
52     ~QueueDescriptorWithParameters() = default;
53     QueueDescriptorWithParameters() = default;
54     QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
55     QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
56 };
57
58 struct MemCopyQueueDescriptor : QueueDescriptor
59 {
60     void Validate(const WorkloadInfo& workloadInfo) const;
61 };
62
63 using InputQueueDescriptor = MemCopyQueueDescriptor;
64 using OutputQueueDescriptor = MemCopyQueueDescriptor;
65
66 struct MemImportQueueDescriptor : QueueDescriptor
67 {
68     void Validate(const WorkloadInfo& workloadInfo) const;
69 };
70
71 struct MemSyncQueueDescriptor : QueueDescriptor
72 {
73     void Validate(const WorkloadInfo& workloadInfo) const;
74 };
75
76 // Softmax layer workload data.
77 struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
78 {
79     void Validate(const WorkloadInfo& workloadInfo) const;
80 };
81
82 // Splitter layer workload data.
83 struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
84 {
85     struct ViewOrigin
86     {
87         ViewOrigin() {}
88         ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
89
90         //View origin (size of the vector is the same as number of dimensions of the view).
91         std::vector<unsigned int> m_Origin;
92     };
93
94     //View defines a tensor that will be carved from the input tensor.
95     //View origins are stored here, the extents are defined by sizes of the output tensors.
96     std::vector<ViewOrigin> m_ViewOrigins;
97
98     void Validate(const WorkloadInfo& workloadInfo) const;
99 };
100
101 // Concat layer workload data.
102 struct ConcatQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
103 {
104     struct ViewOrigin
105     {
106         ViewOrigin() {}
107         ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
108
109         //View origin (size of the vector is the same as number of dimensions of the view).
110         std::vector<unsigned int> m_Origin;
111     };
112
113     //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
114     //View origins are stored here, the extents are defined by sizes of the input tensors.
115     std::vector<ViewOrigin> m_ViewOrigins;
116
117     void Validate(const WorkloadInfo& workloadInfo) const;
118 };
119
120 // Deprecated. Use ConcatQueueDescriptor instead
121 using MergerQueueDescriptor = ConcatQueueDescriptor;
122
123 // Stack layer workload data.
124 struct StackQueueDescriptor : QueueDescriptorWithParameters<StackDescriptor>
125 {
126     void Validate(const WorkloadInfo& workloadInfo) const;
127 };
128
129 // Activation layer workload data.
130 struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
131 {
132     void Validate(const WorkloadInfo& workloadInfo) const;
133 };
134
135 struct ArgMinMaxQueueDescriptor : QueueDescriptorWithParameters<ArgMinMaxDescriptor>
136 {
137     void Validate(const WorkloadInfo& workloadInfo) const;
138 };
139
140 // Fully connected layer workload data.
141 struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
142 {
143     FullyConnectedQueueDescriptor()
144         : m_Weight(nullptr)
145         , m_Bias(nullptr)
146     {
147     }
148
149     const ConstCpuTensorHandle* m_Weight;
150     const ConstCpuTensorHandle* m_Bias;
151
152     void Validate(const WorkloadInfo& workloadInfo) const;
153 };
154
155 // Permute layer workload data.
156 struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
157 {
158     void Validate(const WorkloadInfo& workloadInfo) const;
159 };
160
161 // Pooling 2D layer workload data.
162 struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
163 {
164     void Validate(const WorkloadInfo& workloadInfo) const;
165 };
166
167 // Convolution 2D layer workload data.
168 struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
169 {
170     Convolution2dQueueDescriptor()
171         : m_Weight(nullptr)
172         , m_Bias(nullptr)
173     {
174     }
175
176     const ConstCpuTensorHandle* m_Weight;
177     const ConstCpuTensorHandle* m_Bias;
178
179     void Validate(const WorkloadInfo& workloadInfo) const;
180 };
181
182 // Depthwise Convolution 2D layer workload data.
183 struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
184 {
185     DepthwiseConvolution2dQueueDescriptor()
186         : m_Weight(nullptr)
187         , m_Bias(nullptr)
188     {
189     }
190
191     const ConstCpuTensorHandle* m_Weight;
192     const ConstCpuTensorHandle* m_Bias;
193
194     void Validate(const WorkloadInfo& workloadInfo) const;
195 };
196
197 struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters<DetectionPostProcessDescriptor>
198 {
199     DetectionPostProcessQueueDescriptor()
200         : m_Anchors(nullptr)
201     {
202     }
203
204     const ConstCpuTensorHandle* m_Anchors;
205
206     void Validate(const WorkloadInfo& workloadInfo) const;
207 };
208
209 // Normalization layer workload data.
210 struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
211 {
212     void Validate(const WorkloadInfo& workloadInfo) const;
213 };
214
215 // Add layer workload data.
216 struct AdditionQueueDescriptor : QueueDescriptor
217 {
218     void Validate(const WorkloadInfo& workloadInfo) const;
219 };
220
221 // Multiplication layer workload data.
222 struct MultiplicationQueueDescriptor : QueueDescriptor
223 {
224     void Validate(const WorkloadInfo& workloadInfo) const;
225 };
226
227 // Division layer workload data.
228 struct DivisionQueueDescriptor : QueueDescriptor
229 {
230     void Validate(const WorkloadInfo& workloadInfo) const;
231 };
232
233 // Subtraction layer workload data.
234 struct SubtractionQueueDescriptor : QueueDescriptor
235 {
236     void Validate(const WorkloadInfo& workloadInfo) const;
237 };
238
239 // Maximum layer workload data.
240 struct MaximumQueueDescriptor : QueueDescriptor
241 {
242     void Validate(const WorkloadInfo& workloadInfo) const;
243 };
244
245 // Mean layer workload data.
246 struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
247 {
248     void Validate(const WorkloadInfo& workloadInfo) const;
249 };
250
251 // Pad layer workload data
252 struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
253 {
254     void Validate(const WorkloadInfo& workloadInfo) const;
255 };
256
257 struct QuantizeQueueDescriptor : QueueDescriptor
258 {
259     void Validate(const WorkloadInfo& workloadInfo) const;
260 };
261
262 // Equal layer workload data
263 struct EqualQueueDescriptor : QueueDescriptor
264 {
265     void Validate(const WorkloadInfo& workloadInfo) const;
266 };
267
268 // Batch norm layer workload data.
269 struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
270 {
271     BatchNormalizationQueueDescriptor()
272         : m_Mean(nullptr)
273         , m_Variance(nullptr)
274         , m_Beta(nullptr)
275         , m_Gamma(nullptr)
276     {
277     }
278
279     const ConstCpuTensorHandle* m_Mean;
280     const ConstCpuTensorHandle* m_Variance;
281     const ConstCpuTensorHandle* m_Beta;
282     const ConstCpuTensorHandle* m_Gamma;
283
284     void Validate(const WorkloadInfo& workloadInfo) const;
285 };
286
287 struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
288 {
289     void Validate(const WorkloadInfo& workloadInfo) const;
290 };
291
292 struct ResizeQueueDescriptor : QueueDescriptorWithParameters<ResizeDescriptor>
293 {
294     void Validate(const WorkloadInfo& workloadInfo) const;
295 };
296
297 struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
298 {
299     FakeQuantizationQueueDescriptor()
300     : m_Min(nullptr)
301     , m_Max(nullptr)
302     {
303     }
304
305     const ConstCpuTensorHandle* m_Min;
306     const ConstCpuTensorHandle* m_Max;
307
308     void Validate(const WorkloadInfo& workloadInfo) const;
309 };
310
311 struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
312 {
313     void Validate(const WorkloadInfo& workloadInfo) const;
314 };
315
316 struct ConstantQueueDescriptor : QueueDescriptor
317 {
318     ConstantQueueDescriptor()
319         : m_LayerOutput(nullptr)
320     {
321     }
322
323     const ConstCpuTensorHandle* m_LayerOutput;
324
325     void Validate(const WorkloadInfo& workloadInfo) const;
326 };
327
328 struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
329 {
330     void Validate(const WorkloadInfo& workloadInfo) const;
331 };
332
333 struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
334 {
335     void Validate(const WorkloadInfo& workloadInfo) const;
336 };
337
338 struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters<SpaceToDepthDescriptor>
339 {
340     void Validate(const WorkloadInfo& workloadInfo) const;
341 };
342
343 struct FloorQueueDescriptor : QueueDescriptor
344 {
345     void Validate(const WorkloadInfo& workloadInfo) const;
346 };
347
348 struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
349 {
350     LstmQueueDescriptor()
351         : m_InputToInputWeights(nullptr)
352         , m_InputToForgetWeights(nullptr)
353         , m_InputToCellWeights(nullptr)
354         , m_InputToOutputWeights(nullptr)
355         , m_RecurrentToInputWeights(nullptr)
356         , m_RecurrentToForgetWeights(nullptr)
357         , m_RecurrentToCellWeights(nullptr)
358         , m_RecurrentToOutputWeights(nullptr)
359         , m_CellToInputWeights(nullptr)
360         , m_CellToForgetWeights(nullptr)
361         , m_CellToOutputWeights(nullptr)
362         , m_InputGateBias(nullptr)
363         , m_ForgetGateBias(nullptr)
364         , m_CellBias(nullptr)
365         , m_OutputGateBias(nullptr)
366         , m_ProjectionWeights(nullptr)
367         , m_ProjectionBias(nullptr)
368         , m_InputLayerNormWeights(nullptr)
369         , m_ForgetLayerNormWeights(nullptr)
370         , m_CellLayerNormWeights(nullptr)
371         , m_OutputLayerNormWeights(nullptr)
372     {
373     }
374
375     const ConstCpuTensorHandle* m_InputToInputWeights;
376     const ConstCpuTensorHandle* m_InputToForgetWeights;
377     const ConstCpuTensorHandle* m_InputToCellWeights;
378     const ConstCpuTensorHandle* m_InputToOutputWeights;
379     const ConstCpuTensorHandle* m_RecurrentToInputWeights;
380     const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
381     const ConstCpuTensorHandle* m_RecurrentToCellWeights;
382     const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
383     const ConstCpuTensorHandle* m_CellToInputWeights;
384     const ConstCpuTensorHandle* m_CellToForgetWeights;
385     const ConstCpuTensorHandle* m_CellToOutputWeights;
386     const ConstCpuTensorHandle* m_InputGateBias;
387     const ConstCpuTensorHandle* m_ForgetGateBias;
388     const ConstCpuTensorHandle* m_CellBias;
389     const ConstCpuTensorHandle* m_OutputGateBias;
390     const ConstCpuTensorHandle* m_ProjectionWeights;
391     const ConstCpuTensorHandle* m_ProjectionBias;
392     const ConstCpuTensorHandle* m_InputLayerNormWeights;
393     const ConstCpuTensorHandle* m_ForgetLayerNormWeights;
394     const ConstCpuTensorHandle* m_CellLayerNormWeights;
395     const ConstCpuTensorHandle* m_OutputLayerNormWeights;
396
397     void Validate(const WorkloadInfo& workloadInfo) const;
398 };
399
400 struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
401 {
402     void Validate(const WorkloadInfo& workloadInfo) const;
403 };
404
405 struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
406 {
407     void Validate(const WorkloadInfo& workloadInfo) const;
408 };
409
410 struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters<BatchToSpaceNdDescriptor>
411 {
412     void Validate(const WorkloadInfo& workloadInfo) const;
413 };
414
415 struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters<StridedSliceDescriptor>
416 {
417     void Validate(const WorkloadInfo& workloadInfo) const;
418 };
419
420 // Minimum layer workload data.
421 struct MinimumQueueDescriptor : QueueDescriptor
422 {
423     void Validate(const WorkloadInfo& workloadInfo) const;
424 };
425
426 struct GreaterQueueDescriptor : QueueDescriptor
427 {
428     void Validate(const WorkloadInfo& workloadInfo) const;
429 };
430
431 struct DebugQueueDescriptor : QueueDescriptor
432 {
433     void Validate(const WorkloadInfo& workloadInfo) const;
434
435     LayerGuid m_Guid;
436     std::string m_LayerName;
437     unsigned int m_SlotIndex;
438 };
439
440 struct RsqrtQueueDescriptor : QueueDescriptor
441 {
442     void Validate(const WorkloadInfo& workloadInfo) const;
443 };
444
445 struct GatherQueueDescriptor : QueueDescriptor
446 {
447     void Validate(const WorkloadInfo& workloadInfo) const;
448 };
449
450 struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters<PreCompiledDescriptor>
451 {
452     PreCompiledQueueDescriptor()
453         : m_PreCompiledObject(nullptr)
454     {
455     }
456
457     void* m_PreCompiledObject;
458
459     void Validate(const WorkloadInfo& workloadInfo) const;
460 };
461
462 struct DequantizeQueueDescriptor : QueueDescriptor
463 {
464     void Validate(const WorkloadInfo& workloadInfo) const;
465 };
466
467 struct MergeQueueDescriptor : QueueDescriptor
468 {
469     void Validate(const WorkloadInfo& workloadInfo) const;
470 };
471
472 struct SwitchQueueDescriptor : QueueDescriptor
473 {
474     void Validate(const WorkloadInfo& workloadInfo) const;
475 };
476
477 struct PreluQueueDescriptor : QueueDescriptor
478 {
479     void Validate(const WorkloadInfo& workloadInfo) const;
480 };
481
482 struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters<TransposeConvolution2dDescriptor>
483 {
484     TransposeConvolution2dQueueDescriptor() :
485         m_Weight(nullptr),
486         m_Bias(nullptr)
487     {}
488
489     const ConstCpuTensorHandle* m_Weight;
490     const ConstCpuTensorHandle* m_Bias;
491
492     void Validate(const WorkloadInfo& workloadInfo) const;
493 };
494
495 struct QuantizedLstmQueueDescriptor : QueueDescriptor
496 {
497     QuantizedLstmQueueDescriptor()
498         : m_InputToInputWeights(nullptr)
499         , m_InputToForgetWeights(nullptr)
500         , m_InputToCellWeights(nullptr)
501         , m_InputToOutputWeights(nullptr)
502
503         , m_RecurrentToInputWeights(nullptr)
504         , m_RecurrentToForgetWeights(nullptr)
505         , m_RecurrentToCellWeights(nullptr)
506         , m_RecurrentToOutputWeights(nullptr)
507
508         , m_InputGateBias(nullptr)
509         , m_ForgetGateBias(nullptr)
510         , m_CellBias(nullptr)
511         , m_OutputGateBias(nullptr)
512     {}
513
514     const ConstCpuTensorHandle* m_InputToInputWeights;
515     const ConstCpuTensorHandle* m_InputToForgetWeights;
516     const ConstCpuTensorHandle* m_InputToCellWeights;
517     const ConstCpuTensorHandle* m_InputToOutputWeights;
518
519     const ConstCpuTensorHandle* m_RecurrentToInputWeights;
520     const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
521     const ConstCpuTensorHandle* m_RecurrentToCellWeights;
522     const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
523
524     const ConstCpuTensorHandle* m_InputGateBias;
525     const ConstCpuTensorHandle* m_ForgetGateBias;
526     const ConstCpuTensorHandle* m_CellBias;
527     const ConstCpuTensorHandle* m_OutputGateBias;
528
529     void Validate(const WorkloadInfo& workloadInfo) const;
530 };
531
532 struct AbsQueueDescriptor : QueueDescriptor
533 {
534     void Validate(const WorkloadInfo& workloadInfo) const;
535 };
536
537 } //namespace armnn