2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
7 #include "WorkloadDataFwd.hpp"
9 #include <armnn/Types.hpp>
10 #include <armnn/Tensor.hpp>
11 #include <armnn/Descriptors.hpp>
12 #include <armnn/Exceptions.hpp>
13 #include <backends/WorkloadInfo.hpp>
15 #include <InternalTypes.hpp>
16 #include <backends/OutputHandler.hpp>
18 #include "CpuTensorHandleFwd.hpp"
23 //A helper function that returns the bias data type required for given input data type.
24 DataType GetBiasDataType(DataType inputDataType);
28 struct QueueDescriptor
30 std::vector<ITensorHandle*> m_Inputs;
31 std::vector<ITensorHandle*> m_Outputs;
33 void ValidateInputsOutputs(const std::string& descName,
34 unsigned int numExpectedIn, unsigned int numExpectedOut) const;
38 ~QueueDescriptor() = default;
39 QueueDescriptor() = default;
40 QueueDescriptor(QueueDescriptor const&) = default;
41 QueueDescriptor& operator=(QueueDescriptor const&) = default;
44 // Base class for queue descriptors which contain parameters.
45 template <typename LayerDescriptor>
46 struct QueueDescriptorWithParameters : public QueueDescriptor
48 LayerDescriptor m_Parameters;
51 ~QueueDescriptorWithParameters() = default;
52 QueueDescriptorWithParameters() = default;
53 QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
54 QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
57 struct MemCopyQueueDescriptor : QueueDescriptor
59 void Validate(const WorkloadInfo& workloadInfo) const;
62 using InputQueueDescriptor = MemCopyQueueDescriptor;
63 using OutputQueueDescriptor = MemCopyQueueDescriptor;
65 // Softmax layer workload data.
66 struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
68 void Validate(const WorkloadInfo& workloadInfo) const;
71 // Splitter layer workload data.
72 struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
77 ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
79 //View origin (size of the vector is the same as number of dimensions of the view).
80 std::vector<unsigned int> m_Origin;
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;
87 void Validate(const WorkloadInfo& workloadInfo) const;
90 // Merger layer workload data.
91 struct MergerQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
96 ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
98 //View origin (size of the vector is the same as number of dimensions of the view).
99 std::vector<unsigned int> m_Origin;
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;
106 void Validate(const WorkloadInfo& workloadInfo) const;
109 // Activation layer workload data.
110 struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
112 void Validate(const WorkloadInfo& workloadInfo) const;
115 // Fully connected layer workload data.
116 struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
118 FullyConnectedQueueDescriptor()
124 const ConstCpuTensorHandle* m_Weight;
125 const ConstCpuTensorHandle* m_Bias;
127 void Validate(const WorkloadInfo& workloadInfo) const;
130 // Permute layer workload data.
131 struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
133 void Validate(const WorkloadInfo& workloadInfo) const;
136 // Pooling 2D layer workload data.
137 struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
139 void Validate(const WorkloadInfo& workloadInfo) const;
142 // Convolution 2D layer workload data.
143 struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
145 Convolution2dQueueDescriptor()
151 const ConstCpuTensorHandle* m_Weight;
152 const ConstCpuTensorHandle* m_Bias;
154 void Validate(const WorkloadInfo& workloadInfo) const;
157 // Depthwise Convolution 2D layer workload data.
158 struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
160 DepthwiseConvolution2dQueueDescriptor()
166 const ConstCpuTensorHandle* m_Weight;
167 const ConstCpuTensorHandle* m_Bias;
169 void Validate(const WorkloadInfo& workloadInfo) const;
172 // Normalization layer workload data.
173 struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
175 void Validate(const WorkloadInfo& workloadInfo) const;
178 // Add layer workload data.
179 struct AdditionQueueDescriptor : QueueDescriptor
181 void Validate(const WorkloadInfo& workloadInfo) const;
184 // Multiplication layer workload data.
185 struct MultiplicationQueueDescriptor : QueueDescriptor
187 void Validate(const WorkloadInfo& workloadInfo) const;
190 // Division layer workload data.
191 struct DivisionQueueDescriptor : QueueDescriptor
193 void Validate(const WorkloadInfo& workloadInfo) const;
196 // Subtraction layer workload data.
197 struct SubtractionQueueDescriptor : QueueDescriptor
199 void Validate(const WorkloadInfo& workloadInfo) const;
202 // Mean layer workload data.
203 struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
205 void Validate(const WorkloadInfo& workloadInfo) const;
208 // Pad layer workload data
209 struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
211 void Validate(const WorkloadInfo& workloadInfo) const;
214 // Batch norm layer workload data.
215 struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
217 BatchNormalizationQueueDescriptor()
219 , m_Variance(nullptr)
225 const ConstCpuTensorHandle* m_Mean;
226 const ConstCpuTensorHandle* m_Variance;
227 const ConstCpuTensorHandle* m_Beta;
228 const ConstCpuTensorHandle* m_Gamma;
230 void Validate(const WorkloadInfo& workloadInfo) const;
233 struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
235 void Validate(const WorkloadInfo& workloadInfo) const;
238 struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
240 FakeQuantizationQueueDescriptor()
246 const ConstCpuTensorHandle* m_Min;
247 const ConstCpuTensorHandle* m_Max;
249 void Validate(const WorkloadInfo& workloadInfo) const;
252 struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
254 void Validate(const WorkloadInfo& workloadInfo) const;
257 struct ConstantQueueDescriptor : QueueDescriptor
259 ConstantQueueDescriptor()
260 : m_LayerOutput(nullptr)
264 const ConstCpuTensorHandle* m_LayerOutput;
266 void Validate(const WorkloadInfo& workloadInfo) const;
269 struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
271 void Validate(const WorkloadInfo& workloadInfo) const;
274 struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
276 void Validate(const WorkloadInfo& workloadInfo) const;
279 struct FloorQueueDescriptor : QueueDescriptor
281 void Validate(const WorkloadInfo& workloadInfo) const;
284 struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
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)
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;
325 void Validate(const WorkloadInfo& workloadInfo) const;
328 struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
330 void Validate(const WorkloadInfo& workloadInfo) const;
333 struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
335 void Validate(const WorkloadInfo& workloadInfo) const;