2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
7 #include "CpuTensorHandleFwd.hpp"
8 #include "WorkloadDataFwd.hpp"
10 #include <InternalTypes.hpp>
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>
18 #include <backendsCommon/OutputHandler.hpp>
19 #include <backendsCommon/WorkloadInfo.hpp>
24 //A helper function that returns the bias data type required for given input data type.
25 DataType GetBiasDataType(DataType inputDataType);
29 struct QueueDescriptor
31 std::vector<ITensorHandle*> m_Inputs;
32 std::vector<ITensorHandle*> m_Outputs;
34 void ValidateInputsOutputs(const std::string& descName,
35 unsigned int numExpectedIn, unsigned int numExpectedOut) const;
39 ~QueueDescriptor() = default;
40 QueueDescriptor() = default;
41 QueueDescriptor(QueueDescriptor const&) = default;
42 QueueDescriptor& operator=(QueueDescriptor const&) = default;
45 // Base class for queue descriptors which contain parameters.
46 template <typename LayerDescriptor>
47 struct QueueDescriptorWithParameters : public QueueDescriptor
49 LayerDescriptor m_Parameters;
52 ~QueueDescriptorWithParameters() = default;
53 QueueDescriptorWithParameters() = default;
54 QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
55 QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
58 struct MemCopyQueueDescriptor : QueueDescriptor
60 void Validate(const WorkloadInfo& workloadInfo) const;
63 using InputQueueDescriptor = MemCopyQueueDescriptor;
64 using OutputQueueDescriptor = MemCopyQueueDescriptor;
66 struct MemImportQueueDescriptor : QueueDescriptor
68 void Validate(const WorkloadInfo& workloadInfo) const;
71 struct MemSyncQueueDescriptor : QueueDescriptor
73 void Validate(const WorkloadInfo& workloadInfo) const;
76 // Softmax layer workload data.
77 struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
79 void Validate(const WorkloadInfo& workloadInfo) const;
82 // Splitter layer workload data.
83 struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
88 ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
90 //View origin (size of the vector is the same as number of dimensions of the view).
91 std::vector<unsigned int> m_Origin;
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;
98 void Validate(const WorkloadInfo& workloadInfo) const;
101 // Concat layer workload data.
102 struct ConcatQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
107 ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
109 //View origin (size of the vector is the same as number of dimensions of the view).
110 std::vector<unsigned int> m_Origin;
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;
117 void Validate(const WorkloadInfo& workloadInfo) const;
120 // Deprecated. Use ConcatQueueDescriptor instead
121 using MergerQueueDescriptor = ConcatQueueDescriptor;
123 // Stack layer workload data.
124 struct StackQueueDescriptor : QueueDescriptorWithParameters<StackDescriptor>
126 void Validate(const WorkloadInfo& workloadInfo) const;
129 // Activation layer workload data.
130 struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
132 void Validate(const WorkloadInfo& workloadInfo) const;
135 // Fully connected layer workload data.
136 struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
138 FullyConnectedQueueDescriptor()
144 const ConstCpuTensorHandle* m_Weight;
145 const ConstCpuTensorHandle* m_Bias;
147 void Validate(const WorkloadInfo& workloadInfo) const;
150 // Permute layer workload data.
151 struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
153 void Validate(const WorkloadInfo& workloadInfo) const;
156 // Pooling 2D layer workload data.
157 struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
159 void Validate(const WorkloadInfo& workloadInfo) const;
162 // Convolution 2D layer workload data.
163 struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
165 Convolution2dQueueDescriptor()
171 const ConstCpuTensorHandle* m_Weight;
172 const ConstCpuTensorHandle* m_Bias;
174 void Validate(const WorkloadInfo& workloadInfo) const;
177 // Depthwise Convolution 2D layer workload data.
178 struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
180 DepthwiseConvolution2dQueueDescriptor()
186 const ConstCpuTensorHandle* m_Weight;
187 const ConstCpuTensorHandle* m_Bias;
189 void Validate(const WorkloadInfo& workloadInfo) const;
192 struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters<DetectionPostProcessDescriptor>
194 DetectionPostProcessQueueDescriptor()
199 const ConstCpuTensorHandle* m_Anchors;
201 void Validate(const WorkloadInfo& workloadInfo) const;
204 // Normalization layer workload data.
205 struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
207 void Validate(const WorkloadInfo& workloadInfo) const;
210 // Add layer workload data.
211 struct AdditionQueueDescriptor : QueueDescriptor
213 void Validate(const WorkloadInfo& workloadInfo) const;
216 // Multiplication layer workload data.
217 struct MultiplicationQueueDescriptor : QueueDescriptor
219 void Validate(const WorkloadInfo& workloadInfo) const;
222 // Division layer workload data.
223 struct DivisionQueueDescriptor : QueueDescriptor
225 void Validate(const WorkloadInfo& workloadInfo) const;
228 // Subtraction layer workload data.
229 struct SubtractionQueueDescriptor : QueueDescriptor
231 void Validate(const WorkloadInfo& workloadInfo) const;
234 // Maximum layer workload data.
235 struct MaximumQueueDescriptor : QueueDescriptor
237 void Validate(const WorkloadInfo& workloadInfo) const;
240 // Mean layer workload data.
241 struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
243 void Validate(const WorkloadInfo& workloadInfo) const;
246 // Pad layer workload data
247 struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
249 void Validate(const WorkloadInfo& workloadInfo) const;
252 struct QuantizeQueueDescriptor : QueueDescriptor
254 void Validate(const WorkloadInfo& workloadInfo) const;
257 // Equal layer workload data
258 struct EqualQueueDescriptor : QueueDescriptor
260 void Validate(const WorkloadInfo& workloadInfo) const;
263 // Batch norm layer workload data.
264 struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
266 BatchNormalizationQueueDescriptor()
268 , m_Variance(nullptr)
274 const ConstCpuTensorHandle* m_Mean;
275 const ConstCpuTensorHandle* m_Variance;
276 const ConstCpuTensorHandle* m_Beta;
277 const ConstCpuTensorHandle* m_Gamma;
279 void Validate(const WorkloadInfo& workloadInfo) const;
282 struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
284 void Validate(const WorkloadInfo& workloadInfo) const;
287 struct ResizeQueueDescriptor : QueueDescriptorWithParameters<ResizeDescriptor>
289 void Validate(const WorkloadInfo& workloadInfo) const;
292 struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
294 FakeQuantizationQueueDescriptor()
300 const ConstCpuTensorHandle* m_Min;
301 const ConstCpuTensorHandle* m_Max;
303 void Validate(const WorkloadInfo& workloadInfo) const;
306 struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
308 void Validate(const WorkloadInfo& workloadInfo) const;
311 struct ConstantQueueDescriptor : QueueDescriptor
313 ConstantQueueDescriptor()
314 : m_LayerOutput(nullptr)
318 const ConstCpuTensorHandle* m_LayerOutput;
320 void Validate(const WorkloadInfo& workloadInfo) const;
323 struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
325 void Validate(const WorkloadInfo& workloadInfo) const;
328 struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
330 void Validate(const WorkloadInfo& workloadInfo) const;
333 struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters<SpaceToDepthDescriptor>
335 void Validate(const WorkloadInfo& workloadInfo) const;
338 struct FloorQueueDescriptor : QueueDescriptor
340 void Validate(const WorkloadInfo& workloadInfo) const;
343 struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
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)
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;
392 void Validate(const WorkloadInfo& workloadInfo) const;
395 struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
397 void Validate(const WorkloadInfo& workloadInfo) const;
400 struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
402 void Validate(const WorkloadInfo& workloadInfo) const;
405 struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters<BatchToSpaceNdDescriptor>
407 void Validate(const WorkloadInfo& workloadInfo) const;
410 struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters<StridedSliceDescriptor>
412 void Validate(const WorkloadInfo& workloadInfo) const;
415 // Minimum layer workload data.
416 struct MinimumQueueDescriptor : QueueDescriptor
418 void Validate(const WorkloadInfo& workloadInfo) const;
421 struct GreaterQueueDescriptor : QueueDescriptor
423 void Validate(const WorkloadInfo& workloadInfo) const;
426 struct DebugQueueDescriptor : QueueDescriptor
428 void Validate(const WorkloadInfo& workloadInfo) const;
431 std::string m_LayerName;
432 unsigned int m_SlotIndex;
435 struct RsqrtQueueDescriptor : QueueDescriptor
437 void Validate(const WorkloadInfo& workloadInfo) const;
440 struct GatherQueueDescriptor : QueueDescriptor
442 void Validate(const WorkloadInfo& workloadInfo) const;
445 struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters<PreCompiledDescriptor>
447 PreCompiledQueueDescriptor()
448 : m_PreCompiledObject(nullptr)
452 void* m_PreCompiledObject;
454 void Validate(const WorkloadInfo& workloadInfo) const;
457 struct DequantizeQueueDescriptor : QueueDescriptor
459 void Validate(const WorkloadInfo& workloadInfo) const;
462 struct MergeQueueDescriptor : QueueDescriptor
464 void Validate(const WorkloadInfo& workloadInfo) const;
467 struct SwitchQueueDescriptor : QueueDescriptor
469 void Validate(const WorkloadInfo& workloadInfo) const;
472 struct PreluQueueDescriptor : QueueDescriptor
474 void Validate(const WorkloadInfo& workloadInfo) const;
477 struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters<TransposeConvolution2dDescriptor>
479 TransposeConvolution2dQueueDescriptor() :
484 const ConstCpuTensorHandle* m_Weight;
485 const ConstCpuTensorHandle* m_Bias;
487 void Validate(const WorkloadInfo& workloadInfo) const;
490 struct QuantizedLstmQueueDescriptor : QueueDescriptor
492 QuantizedLstmQueueDescriptor()
493 : m_InputToInputWeights(nullptr)
494 , m_InputToForgetWeights(nullptr)
495 , m_InputToCellWeights(nullptr)
496 , m_InputToOutputWeights(nullptr)
498 , m_RecurrentToInputWeights(nullptr)
499 , m_RecurrentToForgetWeights(nullptr)
500 , m_RecurrentToCellWeights(nullptr)
501 , m_RecurrentToOutputWeights(nullptr)
503 , m_InputGateBias(nullptr)
504 , m_ForgetGateBias(nullptr)
505 , m_CellBias(nullptr)
506 , m_OutputGateBias(nullptr)
509 const ConstCpuTensorHandle* m_InputToInputWeights;
510 const ConstCpuTensorHandle* m_InputToForgetWeights;
511 const ConstCpuTensorHandle* m_InputToCellWeights;
512 const ConstCpuTensorHandle* m_InputToOutputWeights;
514 const ConstCpuTensorHandle* m_RecurrentToInputWeights;
515 const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
516 const ConstCpuTensorHandle* m_RecurrentToCellWeights;
517 const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
519 const ConstCpuTensorHandle* m_InputGateBias;
520 const ConstCpuTensorHandle* m_ForgetGateBias;
521 const ConstCpuTensorHandle* m_CellBias;
522 const ConstCpuTensorHandle* m_OutputGateBias;
524 void Validate(const WorkloadInfo& workloadInfo) const;
527 struct AbsQueueDescriptor : QueueDescriptor
529 void Validate(const WorkloadInfo& workloadInfo) const;