blob: b5b0402237af752a6c140a8d7fe60cd14fae6368 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5#pragma once
6
7#include "WorkloadDataFwd.hpp"
8
9#include "armnn/Types.hpp"
10#include "armnn/Tensor.hpp"
11#include "armnn/Descriptors.hpp"
12#include "armnn/Exceptions.hpp"
13#include "InternalTypes.hpp"
14#include "OutputHandler.hpp"
15#include "CpuTensorHandleFwd.hpp"
16
17namespace armnn
18{
19
telsoa01c577f2c2018-08-31 09:22:23 +010020//A helper function that returns the bias data type required for given input data type.
telsoa014fcda012018-03-09 14:13:49 +000021DataType GetBiasDataType(DataType inputDataType);
22
23struct WorkloadInfo;
24
25struct QueueDescriptor
26{
27 std::vector<ITensorHandle*> m_Inputs;
28 std::vector<ITensorHandle*> m_Outputs;
29
30 void ValidateInputsOutputs(const std::string& descName,
31 unsigned int numExpectedIn, unsigned int numExpectedOut) const;
32
33
34protected:
35 ~QueueDescriptor() = default;
36 QueueDescriptor() = default;
37 QueueDescriptor(QueueDescriptor const&) = default;
38 QueueDescriptor& operator=(QueueDescriptor const&) = default;
39};
40
telsoa01c577f2c2018-08-31 09:22:23 +010041// Base class for queue descriptors which contain parameters.
telsoa014fcda012018-03-09 14:13:49 +000042template <typename LayerDescriptor>
43struct QueueDescriptorWithParameters : public QueueDescriptor
44{
45 LayerDescriptor m_Parameters;
46
47protected:
48 ~QueueDescriptorWithParameters() = default;
49 QueueDescriptorWithParameters() = default;
50 QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
51 QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
52};
53
54struct MemCopyQueueDescriptor : QueueDescriptor
55{
56 void Validate(const WorkloadInfo& workloadInfo) const;
57};
58
59using InputQueueDescriptor = MemCopyQueueDescriptor;
60using OutputQueueDescriptor = MemCopyQueueDescriptor;
61
telsoa01c577f2c2018-08-31 09:22:23 +010062// Softmax layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000063struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
64{
65 void Validate(const WorkloadInfo& workloadInfo) const;
66};
67
telsoa01c577f2c2018-08-31 09:22:23 +010068// Splitter layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000069struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
70{
71 struct ViewOrigin
72 {
73 ViewOrigin() {}
74 ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
75
telsoa01c577f2c2018-08-31 09:22:23 +010076 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +000077 std::vector<unsigned int> m_Origin;
78 };
79
telsoa01c577f2c2018-08-31 09:22:23 +010080 //View defines a tensor that will be carved from the input tensor.
81 //View origins are stored here, the extents are defined by sizes of the output tensors.
telsoa014fcda012018-03-09 14:13:49 +000082 std::vector<ViewOrigin> m_ViewOrigins;
83
84 void Validate(const WorkloadInfo& workloadInfo) const;
85};
86
telsoa01c577f2c2018-08-31 09:22:23 +010087// Merger layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000088struct MergerQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
89{
90 struct ViewOrigin
91 {
92 ViewOrigin() {}
93 ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
94
telsoa01c577f2c2018-08-31 09:22:23 +010095 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +000096 std::vector<unsigned int> m_Origin;
97 };
98
telsoa01c577f2c2018-08-31 09:22:23 +010099 //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
100 //View origins are stored here, the extents are defined by sizes of the input tensors.
telsoa014fcda012018-03-09 14:13:49 +0000101 std::vector<ViewOrigin> m_ViewOrigins;
102
103 void Validate(const WorkloadInfo& workloadInfo) const;
104};
105
telsoa01c577f2c2018-08-31 09:22:23 +0100106// Activation layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000107struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
108{
109 void Validate(const WorkloadInfo& workloadInfo) const;
110};
111
telsoa01c577f2c2018-08-31 09:22:23 +0100112// Fully connected layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000113struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
114{
115 FullyConnectedQueueDescriptor()
116 : m_Weight(nullptr)
117 , m_Bias(nullptr)
118 {
119 }
120
121 const ConstCpuTensorHandle* m_Weight;
122 const ConstCpuTensorHandle* m_Bias;
123
124 void Validate(const WorkloadInfo& workloadInfo) const;
125};
126
telsoa01c577f2c2018-08-31 09:22:23 +0100127// Permute layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000128struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
129{
130 void Validate(const WorkloadInfo& workloadInfo) const;
131};
132
telsoa01c577f2c2018-08-31 09:22:23 +0100133// Pooling 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000134struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
135{
136 void Validate(const WorkloadInfo& workloadInfo) const;
137};
138
telsoa01c577f2c2018-08-31 09:22:23 +0100139// Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000140struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
141{
142 Convolution2dQueueDescriptor()
143 : m_Weight(nullptr)
144 , m_Bias(nullptr)
145 {
146 }
147
148 const ConstCpuTensorHandle* m_Weight;
149 const ConstCpuTensorHandle* m_Bias;
150
151 void Validate(const WorkloadInfo& workloadInfo) const;
152};
153
telsoa01c577f2c2018-08-31 09:22:23 +0100154// Depthwise Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000155struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
156{
157 DepthwiseConvolution2dQueueDescriptor()
158 : m_Weight(nullptr)
159 , m_Bias(nullptr)
160 {
161 }
162
163 const ConstCpuTensorHandle* m_Weight;
164 const ConstCpuTensorHandle* m_Bias;
165
166 void Validate(const WorkloadInfo& workloadInfo) const;
167};
168
telsoa01c577f2c2018-08-31 09:22:23 +0100169// Normalization layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000170struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
171{
172 void Validate(const WorkloadInfo& workloadInfo) const;
173};
174
telsoa01c577f2c2018-08-31 09:22:23 +0100175// Add layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000176struct AdditionQueueDescriptor : QueueDescriptor
177{
178 void Validate(const WorkloadInfo& workloadInfo) const;
179};
180
telsoa01c577f2c2018-08-31 09:22:23 +0100181// Multiplication layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000182struct MultiplicationQueueDescriptor : QueueDescriptor
183{
184 void Validate(const WorkloadInfo& workloadInfo) const;
185};
186
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100187// Division layer workload data.
188struct DivisionQueueDescriptor : QueueDescriptor
189{
190 void Validate(const WorkloadInfo& workloadInfo) const;
191};
192
David Beckc2044fe2018-09-05 15:00:38 +0100193// Subtraction layer workload data.
194struct SubtractionQueueDescriptor : QueueDescriptor
195{
196 void Validate(const WorkloadInfo& workloadInfo) const;
197};
198
narpra01a6bf9122018-09-10 09:50:09 +0100199// Mean layer workload data.
narpra0132b90462018-09-13 11:07:48 +0100200struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
narpra01a6bf9122018-09-10 09:50:09 +0100201{
202 void Validate(const WorkloadInfo& workloadInfo) const;
203};
204
jimfly012c9322a2018-09-19 10:59:49 +0100205// Pad layer workload data
206struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
207{
208 void Validate(const WorkloadInfo& workloadInfo) const;
209};
210
telsoa01c577f2c2018-08-31 09:22:23 +0100211// Batch norm layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000212struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
213{
214 BatchNormalizationQueueDescriptor()
215 : m_Mean(nullptr)
216 , m_Variance(nullptr)
217 , m_Beta(nullptr)
218 , m_Gamma(nullptr)
219 {
220 }
221
222 const ConstCpuTensorHandle* m_Mean;
223 const ConstCpuTensorHandle* m_Variance;
224 const ConstCpuTensorHandle* m_Beta;
225 const ConstCpuTensorHandle* m_Gamma;
226
227 void Validate(const WorkloadInfo& workloadInfo) const;
228};
229
230struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
231{
232 void Validate(const WorkloadInfo& workloadInfo) const;
233};
234
235struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
236{
237 FakeQuantizationQueueDescriptor()
238 : m_Min(nullptr)
239 , m_Max(nullptr)
240 {
241 }
242
243 const ConstCpuTensorHandle* m_Min;
244 const ConstCpuTensorHandle* m_Max;
245
246 void Validate(const WorkloadInfo& workloadInfo) const;
247};
248
249struct L2NormalizationQueueDescriptor : QueueDescriptor
250{
251 void Validate(const WorkloadInfo& workloadInfo) const;
252};
253
254struct ConstantQueueDescriptor : QueueDescriptor
255{
256 ConstantQueueDescriptor()
257 : m_LayerOutput(nullptr)
258 {
259 }
260
261 const ConstCpuTensorHandle* m_LayerOutput;
262
263 void Validate(const WorkloadInfo& workloadInfo) const;
264};
265
266struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
267{
268 void Validate(const WorkloadInfo& workloadInfo) const;
269};
270
271struct FloorQueueDescriptor : QueueDescriptor
272{
273 void Validate(const WorkloadInfo& workloadInfo) const;
274};
275
telsoa01c577f2c2018-08-31 09:22:23 +0100276struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
277{
278 LstmQueueDescriptor()
279 : m_InputToInputWeights(nullptr)
280 , m_InputToForgetWeights(nullptr)
281 , m_InputToCellWeights(nullptr)
282 , m_InputToOutputWeights(nullptr)
283 , m_RecurrentToInputWeights(nullptr)
284 , m_RecurrentToForgetWeights(nullptr)
285 , m_RecurrentToCellWeights(nullptr)
286 , m_RecurrentToOutputWeights(nullptr)
287 , m_CellToInputWeights(nullptr)
288 , m_CellToForgetWeights(nullptr)
289 , m_CellToOutputWeights(nullptr)
290 , m_InputGateBias(nullptr)
291 , m_ForgetGateBias(nullptr)
292 , m_CellBias(nullptr)
293 , m_OutputGateBias(nullptr)
294 , m_ProjectionWeights(nullptr)
295 , m_ProjectionBias(nullptr)
296 {
297 }
298
299 const ConstCpuTensorHandle* m_InputToInputWeights;
300 const ConstCpuTensorHandle* m_InputToForgetWeights;
301 const ConstCpuTensorHandle* m_InputToCellWeights;
302 const ConstCpuTensorHandle* m_InputToOutputWeights;
303 const ConstCpuTensorHandle* m_RecurrentToInputWeights;
304 const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
305 const ConstCpuTensorHandle* m_RecurrentToCellWeights;
306 const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
307 const ConstCpuTensorHandle* m_CellToInputWeights;
308 const ConstCpuTensorHandle* m_CellToForgetWeights;
309 const ConstCpuTensorHandle* m_CellToOutputWeights;
310 const ConstCpuTensorHandle* m_InputGateBias;
311 const ConstCpuTensorHandle* m_ForgetGateBias;
312 const ConstCpuTensorHandle* m_CellBias;
313 const ConstCpuTensorHandle* m_OutputGateBias;
314 const ConstCpuTensorHandle* m_ProjectionWeights;
315 const ConstCpuTensorHandle* m_ProjectionBias;
316
317 void Validate(const WorkloadInfo& workloadInfo) const;
318};
319
320struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
321{
322 void Validate(const WorkloadInfo& workloadInfo) const;
323};
324
325struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
326{
327 void Validate(const WorkloadInfo& workloadInfo) const;
328};
329
telsoa014fcda012018-03-09 14:13:49 +0000330} //namespace armnn