a43c7cccdbd8533525203e1f8a52c513963777c9
[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 // Fully connected layer workload data.
136 struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
137 {
138     FullyConnectedQueueDescriptor()
139         : m_Weight(nullptr)
140         , m_Bias(nullptr)
141     {
142     }
143
144     const ConstCpuTensorHandle* m_Weight;
145     const ConstCpuTensorHandle* m_Bias;
146
147     void Validate(const WorkloadInfo& workloadInfo) const;
148 };
149
150 // Permute layer workload data.
151 struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
152 {
153     void Validate(const WorkloadInfo& workloadInfo) const;
154 };
155
156 // Pooling 2D layer workload data.
157 struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
158 {
159     void Validate(const WorkloadInfo& workloadInfo) const;
160 };
161
162 // Convolution 2D layer workload data.
163 struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
164 {
165     Convolution2dQueueDescriptor()
166         : m_Weight(nullptr)
167         , m_Bias(nullptr)
168     {
169     }
170
171     const ConstCpuTensorHandle* m_Weight;
172     const ConstCpuTensorHandle* m_Bias;
173
174     void Validate(const WorkloadInfo& workloadInfo) const;
175 };
176
177 // Depthwise Convolution 2D layer workload data.
178 struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
179 {
180     DepthwiseConvolution2dQueueDescriptor()
181         : m_Weight(nullptr)
182         , m_Bias(nullptr)
183     {
184     }
185
186     const ConstCpuTensorHandle* m_Weight;
187     const ConstCpuTensorHandle* m_Bias;
188
189     void Validate(const WorkloadInfo& workloadInfo) const;
190 };
191
192 struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters<DetectionPostProcessDescriptor>
193 {
194     DetectionPostProcessQueueDescriptor()
195         : m_Anchors(nullptr)
196     {
197     }
198
199     const ConstCpuTensorHandle* m_Anchors;
200
201     void Validate(const WorkloadInfo& workloadInfo) const;
202 };
203
204 // Normalization layer workload data.
205 struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
206 {
207     void Validate(const WorkloadInfo& workloadInfo) const;
208 };
209
210 // Add layer workload data.
211 struct AdditionQueueDescriptor : QueueDescriptor
212 {
213     void Validate(const WorkloadInfo& workloadInfo) const;
214 };
215
216 // Multiplication layer workload data.
217 struct MultiplicationQueueDescriptor : QueueDescriptor
218 {
219     void Validate(const WorkloadInfo& workloadInfo) const;
220 };
221
222 // Division layer workload data.
223 struct DivisionQueueDescriptor : QueueDescriptor
224 {
225     void Validate(const WorkloadInfo& workloadInfo) const;
226 };
227
228 // Subtraction layer workload data.
229 struct SubtractionQueueDescriptor : QueueDescriptor
230 {
231     void Validate(const WorkloadInfo& workloadInfo) const;
232 };
233
234 // Maximum layer workload data.
235 struct MaximumQueueDescriptor : QueueDescriptor
236 {
237     void Validate(const WorkloadInfo& workloadInfo) const;
238 };
239
240 // Mean layer workload data.
241 struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
242 {
243     void Validate(const WorkloadInfo& workloadInfo) const;
244 };
245
246 // Pad layer workload data
247 struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
248 {
249     void Validate(const WorkloadInfo& workloadInfo) const;
250 };
251
252 struct QuantizeQueueDescriptor : QueueDescriptor
253 {
254     void Validate(const WorkloadInfo& workloadInfo) const;
255 };
256
257 // Equal layer workload data
258 struct EqualQueueDescriptor : QueueDescriptor
259 {
260     void Validate(const WorkloadInfo& workloadInfo) const;
261 };
262
263 // Batch norm layer workload data.
264 struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
265 {
266     BatchNormalizationQueueDescriptor()
267         : m_Mean(nullptr)
268         , m_Variance(nullptr)
269         , m_Beta(nullptr)
270         , m_Gamma(nullptr)
271     {
272     }
273
274     const ConstCpuTensorHandle* m_Mean;
275     const ConstCpuTensorHandle* m_Variance;
276     const ConstCpuTensorHandle* m_Beta;
277     const ConstCpuTensorHandle* m_Gamma;
278
279     void Validate(const WorkloadInfo& workloadInfo) const;
280 };
281
282 struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
283 {
284     void Validate(const WorkloadInfo& workloadInfo) const;
285 };
286
287 struct ResizeQueueDescriptor : QueueDescriptorWithParameters<ResizeDescriptor>
288 {
289     void Validate(const WorkloadInfo& workloadInfo) const;
290 };
291
292 struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
293 {
294     FakeQuantizationQueueDescriptor()
295     : m_Min(nullptr)
296     , m_Max(nullptr)
297     {
298     }
299
300     const ConstCpuTensorHandle* m_Min;
301     const ConstCpuTensorHandle* m_Max;
302
303     void Validate(const WorkloadInfo& workloadInfo) const;
304 };
305
306 struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
307 {
308     void Validate(const WorkloadInfo& workloadInfo) const;
309 };
310
311 struct ConstantQueueDescriptor : QueueDescriptor
312 {
313     ConstantQueueDescriptor()
314         : m_LayerOutput(nullptr)
315     {
316     }
317
318     const ConstCpuTensorHandle* m_LayerOutput;
319
320     void Validate(const WorkloadInfo& workloadInfo) const;
321 };
322
323 struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
324 {
325     void Validate(const WorkloadInfo& workloadInfo) const;
326 };
327
328 struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
329 {
330     void Validate(const WorkloadInfo& workloadInfo) const;
331 };
332
333 struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters<SpaceToDepthDescriptor>
334 {
335     void Validate(const WorkloadInfo& workloadInfo) const;
336 };
337
338 struct FloorQueueDescriptor : QueueDescriptor
339 {
340     void Validate(const WorkloadInfo& workloadInfo) const;
341 };
342
343 struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
344 {
345     LstmQueueDescriptor()
346         : m_InputToInputWeights(nullptr)
347         , m_InputToForgetWeights(nullptr)
348         , m_InputToCellWeights(nullptr)
349         , m_InputToOutputWeights(nullptr)
350         , m_RecurrentToInputWeights(nullptr)
351         , m_RecurrentToForgetWeights(nullptr)
352         , m_RecurrentToCellWeights(nullptr)
353         , m_RecurrentToOutputWeights(nullptr)
354         , m_CellToInputWeights(nullptr)
355         , m_CellToForgetWeights(nullptr)
356         , m_CellToOutputWeights(nullptr)
357         , m_InputGateBias(nullptr)
358         , m_ForgetGateBias(nullptr)
359         , m_CellBias(nullptr)
360         , m_OutputGateBias(nullptr)
361         , m_ProjectionWeights(nullptr)
362         , m_ProjectionBias(nullptr)
363         , m_InputLayerNormWeights(nullptr)
364         , m_ForgetLayerNormWeights(nullptr)
365         , m_CellLayerNormWeights(nullptr)
366         , m_OutputLayerNormWeights(nullptr)
367     {
368     }
369
370     const ConstCpuTensorHandle* m_InputToInputWeights;
371     const ConstCpuTensorHandle* m_InputToForgetWeights;
372     const ConstCpuTensorHandle* m_InputToCellWeights;
373     const ConstCpuTensorHandle* m_InputToOutputWeights;
374     const ConstCpuTensorHandle* m_RecurrentToInputWeights;
375     const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
376     const ConstCpuTensorHandle* m_RecurrentToCellWeights;
377     const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
378     const ConstCpuTensorHandle* m_CellToInputWeights;
379     const ConstCpuTensorHandle* m_CellToForgetWeights;
380     const ConstCpuTensorHandle* m_CellToOutputWeights;
381     const ConstCpuTensorHandle* m_InputGateBias;
382     const ConstCpuTensorHandle* m_ForgetGateBias;
383     const ConstCpuTensorHandle* m_CellBias;
384     const ConstCpuTensorHandle* m_OutputGateBias;
385     const ConstCpuTensorHandle* m_ProjectionWeights;
386     const ConstCpuTensorHandle* m_ProjectionBias;
387     const ConstCpuTensorHandle* m_InputLayerNormWeights;
388     const ConstCpuTensorHandle* m_ForgetLayerNormWeights;
389     const ConstCpuTensorHandle* m_CellLayerNormWeights;
390     const ConstCpuTensorHandle* m_OutputLayerNormWeights;
391
392     void Validate(const WorkloadInfo& workloadInfo) const;
393 };
394
395 struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
396 {
397     void Validate(const WorkloadInfo& workloadInfo) const;
398 };
399
400 struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
401 {
402     void Validate(const WorkloadInfo& workloadInfo) const;
403 };
404
405 struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters<BatchToSpaceNdDescriptor>
406 {
407     void Validate(const WorkloadInfo& workloadInfo) const;
408 };
409
410 struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters<StridedSliceDescriptor>
411 {
412     void Validate(const WorkloadInfo& workloadInfo) const;
413 };
414
415 // Minimum layer workload data.
416 struct MinimumQueueDescriptor : QueueDescriptor
417 {
418     void Validate(const WorkloadInfo& workloadInfo) const;
419 };
420
421 struct GreaterQueueDescriptor : QueueDescriptor
422 {
423     void Validate(const WorkloadInfo& workloadInfo) const;
424 };
425
426 struct DebugQueueDescriptor : QueueDescriptor
427 {
428     void Validate(const WorkloadInfo& workloadInfo) const;
429
430     LayerGuid m_Guid;
431     std::string m_LayerName;
432     unsigned int m_SlotIndex;
433 };
434
435 struct RsqrtQueueDescriptor : QueueDescriptor
436 {
437     void Validate(const WorkloadInfo& workloadInfo) const;
438 };
439
440 struct GatherQueueDescriptor : QueueDescriptor
441 {
442     void Validate(const WorkloadInfo& workloadInfo) const;
443 };
444
445 struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters<PreCompiledDescriptor>
446 {
447     PreCompiledQueueDescriptor()
448         : m_PreCompiledObject(nullptr)
449     {
450     }
451
452     void* m_PreCompiledObject;
453
454     void Validate(const WorkloadInfo& workloadInfo) const;
455 };
456
457 struct DequantizeQueueDescriptor : QueueDescriptor
458 {
459     void Validate(const WorkloadInfo& workloadInfo) const;
460 };
461
462 struct MergeQueueDescriptor : QueueDescriptor
463 {
464     void Validate(const WorkloadInfo& workloadInfo) const;
465 };
466
467 struct SwitchQueueDescriptor : QueueDescriptor
468 {
469     void Validate(const WorkloadInfo& workloadInfo) const;
470 };
471
472 struct PreluQueueDescriptor : QueueDescriptor
473 {
474     void Validate(const WorkloadInfo& workloadInfo) const;
475 };
476
477 struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters<TransposeConvolution2dDescriptor>
478 {
479     TransposeConvolution2dQueueDescriptor() :
480         m_Weight(nullptr),
481         m_Bias(nullptr)
482     {}
483
484     const ConstCpuTensorHandle* m_Weight;
485     const ConstCpuTensorHandle* m_Bias;
486
487     void Validate(const WorkloadInfo& workloadInfo) const;
488 };
489
490 struct QuantizedLstmQueueDescriptor : QueueDescriptor
491 {
492     QuantizedLstmQueueDescriptor()
493         : m_InputToInputWeights(nullptr)
494         , m_InputToForgetWeights(nullptr)
495         , m_InputToCellWeights(nullptr)
496         , m_InputToOutputWeights(nullptr)
497
498         , m_RecurrentToInputWeights(nullptr)
499         , m_RecurrentToForgetWeights(nullptr)
500         , m_RecurrentToCellWeights(nullptr)
501         , m_RecurrentToOutputWeights(nullptr)
502
503         , m_InputGateBias(nullptr)
504         , m_ForgetGateBias(nullptr)
505         , m_CellBias(nullptr)
506         , m_OutputGateBias(nullptr)
507     {}
508
509     const ConstCpuTensorHandle* m_InputToInputWeights;
510     const ConstCpuTensorHandle* m_InputToForgetWeights;
511     const ConstCpuTensorHandle* m_InputToCellWeights;
512     const ConstCpuTensorHandle* m_InputToOutputWeights;
513
514     const ConstCpuTensorHandle* m_RecurrentToInputWeights;
515     const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
516     const ConstCpuTensorHandle* m_RecurrentToCellWeights;
517     const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
518
519     const ConstCpuTensorHandle* m_InputGateBias;
520     const ConstCpuTensorHandle* m_ForgetGateBias;
521     const ConstCpuTensorHandle* m_CellBias;
522     const ConstCpuTensorHandle* m_OutputGateBias;
523
524     void Validate(const WorkloadInfo& workloadInfo) const;
525 };
526
527 struct AbsQueueDescriptor : QueueDescriptor
528 {
529     void Validate(const WorkloadInfo& workloadInfo) const;
530 };
531
532 } //namespace armnn