IVGCVSW-2093 Add SpaceToBatchNd layer and corresponding no-op factory implementations
[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/Descriptors.hpp>
13 #include <armnn/Exceptions.hpp>
14 #include <armnn/Types.hpp>
15 #include <armnn/Tensor.hpp>
16
17 #include <backendsCommon/OutputHandler.hpp>
18 #include <backendsCommon/WorkloadInfo.hpp>
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
28 struct QueueDescriptor
29 {
30     std::vector<ITensorHandle*> m_Inputs;
31     std::vector<ITensorHandle*> m_Outputs;
32
33     void ValidateInputsOutputs(const std::string& descName,
34         unsigned int numExpectedIn, unsigned int numExpectedOut) const;
35
36
37 protected:
38     ~QueueDescriptor() = default;
39     QueueDescriptor() = default;
40     QueueDescriptor(QueueDescriptor const&) = default;
41     QueueDescriptor& operator=(QueueDescriptor const&) = default;
42 };
43
44 // Base class for queue descriptors which contain parameters.
45 template <typename LayerDescriptor>
46 struct QueueDescriptorWithParameters : public QueueDescriptor
47 {
48     LayerDescriptor m_Parameters;
49
50 protected:
51     ~QueueDescriptorWithParameters() = default;
52     QueueDescriptorWithParameters() = default;
53     QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
54     QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
55 };
56
57 struct MemCopyQueueDescriptor : QueueDescriptor
58 {
59     void Validate(const WorkloadInfo& workloadInfo) const;
60 };
61
62 using InputQueueDescriptor = MemCopyQueueDescriptor;
63 using OutputQueueDescriptor = MemCopyQueueDescriptor;
64
65 // Softmax layer workload data.
66 struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
67 {
68     void Validate(const WorkloadInfo& workloadInfo) const;
69 };
70
71 // Splitter layer workload data.
72 struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
73 {
74     struct ViewOrigin
75     {
76         ViewOrigin() {}
77         ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
78
79         //View origin (size of the vector is the same as number of dimensions of the view).
80         std::vector<unsigned int> m_Origin;
81     };
82
83     //View defines a tensor that will be carved from the input tensor.
84     //View origins are stored here, the extents are defined by sizes of the output tensors.
85     std::vector<ViewOrigin> m_ViewOrigins;
86
87     void Validate(const WorkloadInfo& workloadInfo) const;
88 };
89
90 // Merger layer workload data.
91 struct MergerQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
92 {
93     struct ViewOrigin
94     {
95         ViewOrigin() {}
96         ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
97
98         //View origin (size of the vector is the same as number of dimensions of the view).
99         std::vector<unsigned int> m_Origin;
100     };
101
102     //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
103     //View origins are stored here, the extents are defined by sizes of the input tensors.
104     std::vector<ViewOrigin> m_ViewOrigins;
105
106     void Validate(const WorkloadInfo& workloadInfo) const;
107 };
108
109 // Activation layer workload data.
110 struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
111 {
112     void Validate(const WorkloadInfo& workloadInfo) const;
113 };
114
115 // Fully connected layer workload data.
116 struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
117 {
118     FullyConnectedQueueDescriptor()
119         : m_Weight(nullptr)
120         , m_Bias(nullptr)
121     {
122     }
123
124     const ConstCpuTensorHandle* m_Weight;
125     const ConstCpuTensorHandle* m_Bias;
126
127     void Validate(const WorkloadInfo& workloadInfo) const;
128 };
129
130 // Permute layer workload data.
131 struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
132 {
133     void Validate(const WorkloadInfo& workloadInfo) const;
134 };
135
136 // Pooling 2D layer workload data.
137 struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
138 {
139     void Validate(const WorkloadInfo& workloadInfo) const;
140 };
141
142 // Convolution 2D layer workload data.
143 struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
144 {
145     Convolution2dQueueDescriptor()
146         : m_Weight(nullptr)
147         , m_Bias(nullptr)
148     {
149     }
150
151     const ConstCpuTensorHandle* m_Weight;
152     const ConstCpuTensorHandle* m_Bias;
153
154     void Validate(const WorkloadInfo& workloadInfo) const;
155 };
156
157 // Depthwise Convolution 2D layer workload data.
158 struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
159 {
160     DepthwiseConvolution2dQueueDescriptor()
161         : m_Weight(nullptr)
162         , m_Bias(nullptr)
163     {
164     }
165
166     const ConstCpuTensorHandle* m_Weight;
167     const ConstCpuTensorHandle* m_Bias;
168
169     void Validate(const WorkloadInfo& workloadInfo) const;
170 };
171
172 // Normalization layer workload data.
173 struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
174 {
175     void Validate(const WorkloadInfo& workloadInfo) const;
176 };
177
178 // Add layer workload data.
179 struct AdditionQueueDescriptor : QueueDescriptor
180 {
181     void Validate(const WorkloadInfo& workloadInfo) const;
182 };
183
184 // Multiplication layer workload data.
185 struct MultiplicationQueueDescriptor : QueueDescriptor
186 {
187     void Validate(const WorkloadInfo& workloadInfo) const;
188 };
189
190 // Division layer workload data.
191 struct DivisionQueueDescriptor : QueueDescriptor
192 {
193     void Validate(const WorkloadInfo& workloadInfo) const;
194 };
195
196 // Subtraction layer workload data.
197 struct SubtractionQueueDescriptor : QueueDescriptor
198 {
199     void Validate(const WorkloadInfo& workloadInfo) const;
200 };
201
202 // Mean layer workload data.
203 struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
204 {
205     void Validate(const WorkloadInfo& workloadInfo) const;
206 };
207
208 // Pad layer workload data
209 struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
210 {
211     void Validate(const WorkloadInfo& workloadInfo) const;
212 };
213
214 // Batch norm layer workload data.
215 struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
216 {
217     BatchNormalizationQueueDescriptor()
218         : m_Mean(nullptr)
219         , m_Variance(nullptr)
220         , m_Beta(nullptr)
221         , m_Gamma(nullptr)
222     {
223     }
224
225     const ConstCpuTensorHandle* m_Mean;
226     const ConstCpuTensorHandle* m_Variance;
227     const ConstCpuTensorHandle* m_Beta;
228     const ConstCpuTensorHandle* m_Gamma;
229
230     void Validate(const WorkloadInfo& workloadInfo) const;
231 };
232
233 struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
234 {
235     void Validate(const WorkloadInfo& workloadInfo) const;
236 };
237
238 struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
239 {
240     FakeQuantizationQueueDescriptor()
241     : m_Min(nullptr)
242     , m_Max(nullptr)
243     {
244     }
245
246     const ConstCpuTensorHandle* m_Min;
247     const ConstCpuTensorHandle* m_Max;
248
249     void Validate(const WorkloadInfo& workloadInfo) const;
250 };
251
252 struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
253 {
254     void Validate(const WorkloadInfo& workloadInfo) const;
255 };
256
257 struct ConstantQueueDescriptor : QueueDescriptor
258 {
259     ConstantQueueDescriptor()
260         : m_LayerOutput(nullptr)
261     {
262     }
263
264     const ConstCpuTensorHandle* m_LayerOutput;
265
266     void Validate(const WorkloadInfo& workloadInfo) const;
267 };
268
269 struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
270 {
271     void Validate(const WorkloadInfo& workloadInfo) const;
272 };
273
274 struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
275 {
276     void Validate(const WorkloadInfo& workloadInfo) const;
277 };
278
279 struct FloorQueueDescriptor : QueueDescriptor
280 {
281     void Validate(const WorkloadInfo& workloadInfo) const;
282 };
283
284 struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
285 {
286     LstmQueueDescriptor()
287         : m_InputToInputWeights(nullptr)
288         , m_InputToForgetWeights(nullptr)
289         , m_InputToCellWeights(nullptr)
290         , m_InputToOutputWeights(nullptr)
291         , m_RecurrentToInputWeights(nullptr)
292         , m_RecurrentToForgetWeights(nullptr)
293         , m_RecurrentToCellWeights(nullptr)
294         , m_RecurrentToOutputWeights(nullptr)
295         , m_CellToInputWeights(nullptr)
296         , m_CellToForgetWeights(nullptr)
297         , m_CellToOutputWeights(nullptr)
298         , m_InputGateBias(nullptr)
299         , m_ForgetGateBias(nullptr)
300         , m_CellBias(nullptr)
301         , m_OutputGateBias(nullptr)
302         , m_ProjectionWeights(nullptr)
303         , m_ProjectionBias(nullptr)
304     {
305     }
306
307     const ConstCpuTensorHandle* m_InputToInputWeights;
308     const ConstCpuTensorHandle* m_InputToForgetWeights;
309     const ConstCpuTensorHandle* m_InputToCellWeights;
310     const ConstCpuTensorHandle* m_InputToOutputWeights;
311     const ConstCpuTensorHandle* m_RecurrentToInputWeights;
312     const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
313     const ConstCpuTensorHandle* m_RecurrentToCellWeights;
314     const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
315     const ConstCpuTensorHandle* m_CellToInputWeights;
316     const ConstCpuTensorHandle* m_CellToForgetWeights;
317     const ConstCpuTensorHandle* m_CellToOutputWeights;
318     const ConstCpuTensorHandle* m_InputGateBias;
319     const ConstCpuTensorHandle* m_ForgetGateBias;
320     const ConstCpuTensorHandle* m_CellBias;
321     const ConstCpuTensorHandle* m_OutputGateBias;
322     const ConstCpuTensorHandle* m_ProjectionWeights;
323     const ConstCpuTensorHandle* m_ProjectionBias;
324
325     void Validate(const WorkloadInfo& workloadInfo) const;
326 };
327
328 struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
329 {
330     void Validate(const WorkloadInfo& workloadInfo) const;
331 };
332
333 struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
334 {
335     void Validate(const WorkloadInfo& workloadInfo) const;
336 };
337
338 } //namespace armnn