blob: d790dafd5820ec018c51fbe364bde6e32f6d35ac [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
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00007#include "CpuTensorHandleFwd.hpp"
telsoa014fcda012018-03-09 14:13:49 +00008#include "WorkloadDataFwd.hpp"
9
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <InternalTypes.hpp>
11
Jim Flynne242f2d2019-05-22 14:24:13 +010012#include <armnn/Deprecated.hpp>
David Beck0dbe0ee2018-09-24 15:59:27 +010013#include <armnn/Descriptors.hpp>
14#include <armnn/Exceptions.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <armnn/Types.hpp>
16#include <armnn/Tensor.hpp>
David Beck0dbe0ee2018-09-24 15:59:27 +010017
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000018#include <backendsCommon/OutputHandler.hpp>
19#include <backendsCommon/WorkloadInfo.hpp>
telsoa014fcda012018-03-09 14:13:49 +000020
21namespace armnn
22{
23
telsoa01c577f2c2018-08-31 09:22:23 +010024//A helper function that returns the bias data type required for given input data type.
telsoa014fcda012018-03-09 14:13:49 +000025DataType GetBiasDataType(DataType inputDataType);
26
27struct WorkloadInfo;
28
29struct 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
38protected:
39 ~QueueDescriptor() = default;
40 QueueDescriptor() = default;
41 QueueDescriptor(QueueDescriptor const&) = default;
42 QueueDescriptor& operator=(QueueDescriptor const&) = default;
43};
44
telsoa01c577f2c2018-08-31 09:22:23 +010045// Base class for queue descriptors which contain parameters.
telsoa014fcda012018-03-09 14:13:49 +000046template <typename LayerDescriptor>
47struct QueueDescriptorWithParameters : public QueueDescriptor
48{
49 LayerDescriptor m_Parameters;
50
51protected:
52 ~QueueDescriptorWithParameters() = default;
53 QueueDescriptorWithParameters() = default;
54 QueueDescriptorWithParameters(QueueDescriptorWithParameters const&) = default;
55 QueueDescriptorWithParameters& operator=(QueueDescriptorWithParameters const&) = default;
56};
57
58struct MemCopyQueueDescriptor : QueueDescriptor
59{
60 void Validate(const WorkloadInfo& workloadInfo) const;
61};
62
63using InputQueueDescriptor = MemCopyQueueDescriptor;
64using OutputQueueDescriptor = MemCopyQueueDescriptor;
65
telsoa01c577f2c2018-08-31 09:22:23 +010066// Softmax layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000067struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
68{
69 void Validate(const WorkloadInfo& workloadInfo) const;
70};
71
telsoa01c577f2c2018-08-31 09:22:23 +010072// Splitter layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000073struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
74{
75 struct ViewOrigin
76 {
77 ViewOrigin() {}
78 ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
79
telsoa01c577f2c2018-08-31 09:22:23 +010080 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +000081 std::vector<unsigned int> m_Origin;
82 };
83
telsoa01c577f2c2018-08-31 09:22:23 +010084 //View defines a tensor that will be carved from the input tensor.
85 //View origins are stored here, the extents are defined by sizes of the output tensors.
telsoa014fcda012018-03-09 14:13:49 +000086 std::vector<ViewOrigin> m_ViewOrigins;
87
88 void Validate(const WorkloadInfo& workloadInfo) const;
89};
90
Jim Flynne242f2d2019-05-22 14:24:13 +010091// Concat layer workload data.
92struct ConcatQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
telsoa014fcda012018-03-09 14:13:49 +000093{
94 struct ViewOrigin
95 {
96 ViewOrigin() {}
97 ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
98
telsoa01c577f2c2018-08-31 09:22:23 +010099 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +0000100 std::vector<unsigned int> m_Origin;
101 };
102
telsoa01c577f2c2018-08-31 09:22:23 +0100103 //View defines a sub-area of the output tensor that will be filled with the corresponding input tensor.
104 //View origins are stored here, the extents are defined by sizes of the input tensors.
telsoa014fcda012018-03-09 14:13:49 +0000105 std::vector<ViewOrigin> m_ViewOrigins;
106
107 void Validate(const WorkloadInfo& workloadInfo) const;
108};
109
Jim Flynne242f2d2019-05-22 14:24:13 +0100110// Deprecated. Use ConcatQueueDescriptor instead
111using MergerQueueDescriptor = ConcatQueueDescriptor;
112
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100113// Stack layer workload data.
114struct StackQueueDescriptor : QueueDescriptorWithParameters<StackDescriptor>
115{
116 void Validate(const WorkloadInfo& workloadInfo) const;
117};
118
telsoa01c577f2c2018-08-31 09:22:23 +0100119// Activation layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000120struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
121{
122 void Validate(const WorkloadInfo& workloadInfo) const;
123};
124
telsoa01c577f2c2018-08-31 09:22:23 +0100125// Fully connected layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000126struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
127{
128 FullyConnectedQueueDescriptor()
129 : m_Weight(nullptr)
130 , m_Bias(nullptr)
131 {
132 }
133
134 const ConstCpuTensorHandle* m_Weight;
135 const ConstCpuTensorHandle* m_Bias;
136
137 void Validate(const WorkloadInfo& workloadInfo) const;
138};
139
telsoa01c577f2c2018-08-31 09:22:23 +0100140// Permute layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000141struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
142{
143 void Validate(const WorkloadInfo& workloadInfo) const;
144};
145
telsoa01c577f2c2018-08-31 09:22:23 +0100146// Pooling 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000147struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
148{
149 void Validate(const WorkloadInfo& workloadInfo) const;
150};
151
telsoa01c577f2c2018-08-31 09:22:23 +0100152// Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000153struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
154{
155 Convolution2dQueueDescriptor()
156 : m_Weight(nullptr)
157 , m_Bias(nullptr)
158 {
159 }
160
161 const ConstCpuTensorHandle* m_Weight;
162 const ConstCpuTensorHandle* m_Bias;
163
164 void Validate(const WorkloadInfo& workloadInfo) const;
165};
166
telsoa01c577f2c2018-08-31 09:22:23 +0100167// Depthwise Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000168struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
169{
170 DepthwiseConvolution2dQueueDescriptor()
171 : m_Weight(nullptr)
172 , m_Bias(nullptr)
173 {
174 }
175
176 const ConstCpuTensorHandle* m_Weight;
177 const ConstCpuTensorHandle* m_Bias;
178
179 void Validate(const WorkloadInfo& workloadInfo) const;
180};
181
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000182struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters<DetectionPostProcessDescriptor>
183{
Narumol Prangnawaratbc67cef2019-01-31 15:31:54 +0000184 DetectionPostProcessQueueDescriptor()
185 : m_Anchors(nullptr)
186 {
187 }
188
189 const ConstCpuTensorHandle* m_Anchors;
190
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000191 void Validate(const WorkloadInfo& workloadInfo) const;
192};
193
telsoa01c577f2c2018-08-31 09:22:23 +0100194// Normalization layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000195struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
196{
197 void Validate(const WorkloadInfo& workloadInfo) const;
198};
199
telsoa01c577f2c2018-08-31 09:22:23 +0100200// Add layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000201struct AdditionQueueDescriptor : QueueDescriptor
202{
203 void Validate(const WorkloadInfo& workloadInfo) const;
204};
205
telsoa01c577f2c2018-08-31 09:22:23 +0100206// Multiplication layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000207struct MultiplicationQueueDescriptor : QueueDescriptor
208{
209 void Validate(const WorkloadInfo& workloadInfo) const;
210};
211
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100212// Division layer workload data.
213struct DivisionQueueDescriptor : QueueDescriptor
214{
215 void Validate(const WorkloadInfo& workloadInfo) const;
216};
217
David Beckc2044fe2018-09-05 15:00:38 +0100218// Subtraction layer workload data.
219struct SubtractionQueueDescriptor : QueueDescriptor
220{
221 void Validate(const WorkloadInfo& workloadInfo) const;
222};
223
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000224// Maximum layer workload data.
225struct MaximumQueueDescriptor : QueueDescriptor
226{
227 void Validate(const WorkloadInfo& workloadInfo) const;
228};
229
narpra01a6bf9122018-09-10 09:50:09 +0100230// Mean layer workload data.
narpra0132b90462018-09-13 11:07:48 +0100231struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
narpra01a6bf9122018-09-10 09:50:09 +0100232{
233 void Validate(const WorkloadInfo& workloadInfo) const;
234};
235
jimfly012c9322a2018-09-19 10:59:49 +0100236// Pad layer workload data
237struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
238{
239 void Validate(const WorkloadInfo& workloadInfo) const;
240};
241
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000242struct QuantizeQueueDescriptor : QueueDescriptor
243{
244 void Validate(const WorkloadInfo& workloadInfo) const;
245};
246
FrancisMurtagh20995952018-12-17 12:11:36 +0000247// Equal layer workload data
248struct EqualQueueDescriptor : QueueDescriptor
249{
250 void Validate(const WorkloadInfo& workloadInfo) const;
251};
252
telsoa01c577f2c2018-08-31 09:22:23 +0100253// Batch norm layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000254struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
255{
256 BatchNormalizationQueueDescriptor()
257 : m_Mean(nullptr)
258 , m_Variance(nullptr)
259 , m_Beta(nullptr)
260 , m_Gamma(nullptr)
261 {
262 }
263
264 const ConstCpuTensorHandle* m_Mean;
265 const ConstCpuTensorHandle* m_Variance;
266 const ConstCpuTensorHandle* m_Beta;
267 const ConstCpuTensorHandle* m_Gamma;
268
269 void Validate(const WorkloadInfo& workloadInfo) const;
270};
271
272struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
273{
274 void Validate(const WorkloadInfo& workloadInfo) const;
275};
276
Teresa Charlina9075df2019-06-27 15:41:57 +0100277struct ResizeQueueDescriptor : QueueDescriptorWithParameters<ResizeDescriptor>
278{
279 void Validate(const WorkloadInfo& workloadInfo) const;
280};
281
telsoa014fcda012018-03-09 14:13:49 +0000282struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
283{
284 FakeQuantizationQueueDescriptor()
285 : m_Min(nullptr)
286 , m_Max(nullptr)
287 {
288 }
289
290 const ConstCpuTensorHandle* m_Min;
291 const ConstCpuTensorHandle* m_Max;
292
293 void Validate(const WorkloadInfo& workloadInfo) const;
294};
295
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100296struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
telsoa014fcda012018-03-09 14:13:49 +0000297{
298 void Validate(const WorkloadInfo& workloadInfo) const;
299};
300
301struct ConstantQueueDescriptor : QueueDescriptor
302{
303 ConstantQueueDescriptor()
304 : m_LayerOutput(nullptr)
305 {
306 }
307
308 const ConstCpuTensorHandle* m_LayerOutput;
309
310 void Validate(const WorkloadInfo& workloadInfo) const;
311};
312
313struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
314{
315 void Validate(const WorkloadInfo& workloadInfo) const;
316};
317
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000318struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
319{
320 void Validate(const WorkloadInfo& workloadInfo) const;
321};
322
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100323struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters<SpaceToDepthDescriptor>
324{
325 void Validate(const WorkloadInfo& workloadInfo) const;
326};
327
telsoa014fcda012018-03-09 14:13:49 +0000328struct FloorQueueDescriptor : QueueDescriptor
329{
330 void Validate(const WorkloadInfo& workloadInfo) const;
331};
332
telsoa01c577f2c2018-08-31 09:22:23 +0100333struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
334{
335 LstmQueueDescriptor()
336 : m_InputToInputWeights(nullptr)
337 , m_InputToForgetWeights(nullptr)
338 , m_InputToCellWeights(nullptr)
339 , m_InputToOutputWeights(nullptr)
340 , m_RecurrentToInputWeights(nullptr)
341 , m_RecurrentToForgetWeights(nullptr)
342 , m_RecurrentToCellWeights(nullptr)
343 , m_RecurrentToOutputWeights(nullptr)
344 , m_CellToInputWeights(nullptr)
345 , m_CellToForgetWeights(nullptr)
346 , m_CellToOutputWeights(nullptr)
347 , m_InputGateBias(nullptr)
348 , m_ForgetGateBias(nullptr)
349 , m_CellBias(nullptr)
350 , m_OutputGateBias(nullptr)
351 , m_ProjectionWeights(nullptr)
352 , m_ProjectionBias(nullptr)
Jan Eilers38e05bd2019-06-26 13:10:09 +0100353 , m_InputLayerNormWeights(nullptr)
354 , m_ForgetLayerNormWeights(nullptr)
355 , m_CellLayerNormWeights(nullptr)
356 , m_OutputLayerNormWeights(nullptr)
telsoa01c577f2c2018-08-31 09:22:23 +0100357 {
358 }
359
360 const ConstCpuTensorHandle* m_InputToInputWeights;
361 const ConstCpuTensorHandle* m_InputToForgetWeights;
362 const ConstCpuTensorHandle* m_InputToCellWeights;
363 const ConstCpuTensorHandle* m_InputToOutputWeights;
364 const ConstCpuTensorHandle* m_RecurrentToInputWeights;
365 const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
366 const ConstCpuTensorHandle* m_RecurrentToCellWeights;
367 const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
368 const ConstCpuTensorHandle* m_CellToInputWeights;
369 const ConstCpuTensorHandle* m_CellToForgetWeights;
370 const ConstCpuTensorHandle* m_CellToOutputWeights;
371 const ConstCpuTensorHandle* m_InputGateBias;
372 const ConstCpuTensorHandle* m_ForgetGateBias;
373 const ConstCpuTensorHandle* m_CellBias;
374 const ConstCpuTensorHandle* m_OutputGateBias;
375 const ConstCpuTensorHandle* m_ProjectionWeights;
376 const ConstCpuTensorHandle* m_ProjectionBias;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100377 const ConstCpuTensorHandle* m_InputLayerNormWeights;
378 const ConstCpuTensorHandle* m_ForgetLayerNormWeights;
379 const ConstCpuTensorHandle* m_CellLayerNormWeights;
380 const ConstCpuTensorHandle* m_OutputLayerNormWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100381
382 void Validate(const WorkloadInfo& workloadInfo) const;
383};
384
385struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
386{
387 void Validate(const WorkloadInfo& workloadInfo) const;
388};
389
390struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
391{
392 void Validate(const WorkloadInfo& workloadInfo) const;
393};
394
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000395struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters<BatchToSpaceNdDescriptor>
396{
397 void Validate(const WorkloadInfo& workloadInfo) const;
398};
Conor Kennedy430b5d82018-11-14 15:28:28 +0000399
400struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters<StridedSliceDescriptor>
401{
402 void Validate(const WorkloadInfo& workloadInfo) const;
403};
404
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000405// Minimum layer workload data.
kevmay0190539692018-11-29 08:40:19 +0000406struct MinimumQueueDescriptor : QueueDescriptor
407{
408 void Validate(const WorkloadInfo& workloadInfo) const;
409};
410
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000411struct GreaterQueueDescriptor : QueueDescriptor
412{
413 void Validate(const WorkloadInfo& workloadInfo) const;
414};
415
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000416struct DebugQueueDescriptor : QueueDescriptor
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000417{
418 void Validate(const WorkloadInfo& workloadInfo) const;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000419
420 LayerGuid m_Guid;
421 std::string m_LayerName;
422 unsigned int m_SlotIndex;
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000423};
424
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000425struct RsqrtQueueDescriptor : QueueDescriptor
426{
427 void Validate(const WorkloadInfo& workloadInfo) const;
428};
429
narpra01b89b05f2019-01-16 09:53:09 +0000430struct GatherQueueDescriptor : QueueDescriptor
431{
432 void Validate(const WorkloadInfo& workloadInfo) const;
433};
434
Matteo Martincigh49124022019-01-11 13:25:59 +0000435struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters<PreCompiledDescriptor>
436{
437 PreCompiledQueueDescriptor()
438 : m_PreCompiledObject(nullptr)
439 {
440 }
441
Matteo Martincigh7997a352019-04-17 15:37:30 +0100442 void* m_PreCompiledObject;
Matteo Martincigh49124022019-01-11 13:25:59 +0000443
444 void Validate(const WorkloadInfo& workloadInfo) const;
445};
446
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000447struct DequantizeQueueDescriptor : QueueDescriptor
448{
449 void Validate(const WorkloadInfo& workloadInfo) const;
450};
451
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100452struct MergeQueueDescriptor : QueueDescriptor
453{
454 void Validate(const WorkloadInfo& workloadInfo) const;
455};
456
Sadik Armaganeff363d2019-04-05 15:25:46 +0100457struct SwitchQueueDescriptor : QueueDescriptor
458{
459 void Validate(const WorkloadInfo& workloadInfo) const;
460};
461
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100462struct PreluQueueDescriptor : QueueDescriptor
463{
464 void Validate(const WorkloadInfo& workloadInfo) const;
465};
466
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100467struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters<TransposeConvolution2dDescriptor>
468{
469 TransposeConvolution2dQueueDescriptor() :
470 m_Weight(nullptr),
471 m_Bias(nullptr)
472 {}
473
474 const ConstCpuTensorHandle* m_Weight;
475 const ConstCpuTensorHandle* m_Bias;
476
477 void Validate(const WorkloadInfo& workloadInfo) const;
478};
479
James Conroyee18dc82019-07-17 11:27:46 +0100480struct QuantizedLstmQueueDescriptor : QueueDescriptor
481{
482 QuantizedLstmQueueDescriptor()
483 : m_InputToInputWeights(nullptr)
484 , m_InputToForgetWeights(nullptr)
485 , m_InputToCellWeights(nullptr)
486 , m_InputToOutputWeights(nullptr)
487
488 , m_RecurrentToInputWeights(nullptr)
489 , m_RecurrentToForgetWeights(nullptr)
490 , m_RecurrentToCellWeights(nullptr)
491 , m_RecurrentToOutputWeights(nullptr)
492
493 , m_InputGateBias(nullptr)
494 , m_ForgetGateBias(nullptr)
495 , m_CellBias(nullptr)
496 , m_OutputGateBias(nullptr)
497 {}
498
499 const ConstCpuTensorHandle* m_InputToInputWeights;
500 const ConstCpuTensorHandle* m_InputToForgetWeights;
501 const ConstCpuTensorHandle* m_InputToCellWeights;
502 const ConstCpuTensorHandle* m_InputToOutputWeights;
503
504 const ConstCpuTensorHandle* m_RecurrentToInputWeights;
505 const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
506 const ConstCpuTensorHandle* m_RecurrentToCellWeights;
507 const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
508
509 const ConstCpuTensorHandle* m_InputGateBias;
510 const ConstCpuTensorHandle* m_ForgetGateBias;
511 const ConstCpuTensorHandle* m_CellBias;
512 const ConstCpuTensorHandle* m_OutputGateBias;
513
514 void Validate(const WorkloadInfo& workloadInfo) const;
515};
516
telsoa014fcda012018-03-09 14:13:49 +0000517} //namespace armnn