blob: c055beb88d647662cfa29d85ee405052cffe03a0 [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
Derek Lambertif674aa02019-08-01 15:56:25 +010066struct MemImportQueueDescriptor : QueueDescriptor
67{
68 void Validate(const WorkloadInfo& workloadInfo) const;
69};
70
71struct MemSyncQueueDescriptor : QueueDescriptor
72{
73 void Validate(const WorkloadInfo& workloadInfo) const;
74};
75
telsoa01c577f2c2018-08-31 09:22:23 +010076// Softmax layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000077struct SoftmaxQueueDescriptor : QueueDescriptorWithParameters<SoftmaxDescriptor>
78{
79 void Validate(const WorkloadInfo& workloadInfo) const;
80};
81
telsoa01c577f2c2018-08-31 09:22:23 +010082// Splitter layer workload data.
telsoa014fcda012018-03-09 14:13:49 +000083struct SplitterQueueDescriptor : QueueDescriptorWithParameters<ViewsDescriptor>
84{
85 struct ViewOrigin
86 {
87 ViewOrigin() {}
88 ViewOrigin(std::vector<unsigned int> const& origin) : m_Origin(origin) {}
89
telsoa01c577f2c2018-08-31 09:22:23 +010090 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +000091 std::vector<unsigned int> m_Origin;
92 };
93
telsoa01c577f2c2018-08-31 09:22:23 +010094 //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.
telsoa014fcda012018-03-09 14:13:49 +000096 std::vector<ViewOrigin> m_ViewOrigins;
97
98 void Validate(const WorkloadInfo& workloadInfo) const;
99};
100
Jim Flynne242f2d2019-05-22 14:24:13 +0100101// Concat layer workload data.
102struct ConcatQueueDescriptor : QueueDescriptorWithParameters<OriginsDescriptor>
telsoa014fcda012018-03-09 14:13:49 +0000103{
104 struct ViewOrigin
105 {
106 ViewOrigin() {}
107 ViewOrigin(const std::vector<unsigned int>& origin) : m_Origin(origin) {}
108
telsoa01c577f2c2018-08-31 09:22:23 +0100109 //View origin (size of the vector is the same as number of dimensions of the view).
telsoa014fcda012018-03-09 14:13:49 +0000110 std::vector<unsigned int> m_Origin;
111 };
112
telsoa01c577f2c2018-08-31 09:22:23 +0100113 //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.
telsoa014fcda012018-03-09 14:13:49 +0000115 std::vector<ViewOrigin> m_ViewOrigins;
116
117 void Validate(const WorkloadInfo& workloadInfo) const;
118};
119
Jim Flynne242f2d2019-05-22 14:24:13 +0100120// Deprecated. Use ConcatQueueDescriptor instead
121using MergerQueueDescriptor = ConcatQueueDescriptor;
122
Matthew Jackson2b8c1da2019-07-04 14:59:16 +0100123// Stack layer workload data.
124struct StackQueueDescriptor : QueueDescriptorWithParameters<StackDescriptor>
125{
126 void Validate(const WorkloadInfo& workloadInfo) const;
127};
128
telsoa01c577f2c2018-08-31 09:22:23 +0100129// Activation layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000130struct ActivationQueueDescriptor : QueueDescriptorWithParameters<ActivationDescriptor>
131{
132 void Validate(const WorkloadInfo& workloadInfo) const;
133};
134
telsoa01c577f2c2018-08-31 09:22:23 +0100135// Fully connected layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000136struct FullyConnectedQueueDescriptor : QueueDescriptorWithParameters<FullyConnectedDescriptor>
137{
138 FullyConnectedQueueDescriptor()
139 : m_Weight(nullptr)
140 , m_Bias(nullptr)
141 {
142 }
143
144 const ConstCpuTensorHandle* m_Weight;
145 const ConstCpuTensorHandle* m_Bias;
146
147 void Validate(const WorkloadInfo& workloadInfo) const;
148};
149
telsoa01c577f2c2018-08-31 09:22:23 +0100150// Permute layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000151struct PermuteQueueDescriptor : QueueDescriptorWithParameters<PermuteDescriptor>
152{
153 void Validate(const WorkloadInfo& workloadInfo) const;
154};
155
telsoa01c577f2c2018-08-31 09:22:23 +0100156// Pooling 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000157struct Pooling2dQueueDescriptor : QueueDescriptorWithParameters<Pooling2dDescriptor>
158{
159 void Validate(const WorkloadInfo& workloadInfo) const;
160};
161
telsoa01c577f2c2018-08-31 09:22:23 +0100162// Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000163struct Convolution2dQueueDescriptor : QueueDescriptorWithParameters<Convolution2dDescriptor>
164{
165 Convolution2dQueueDescriptor()
166 : m_Weight(nullptr)
167 , m_Bias(nullptr)
168 {
169 }
170
171 const ConstCpuTensorHandle* m_Weight;
172 const ConstCpuTensorHandle* m_Bias;
173
174 void Validate(const WorkloadInfo& workloadInfo) const;
175};
176
telsoa01c577f2c2018-08-31 09:22:23 +0100177// Depthwise Convolution 2D layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000178struct DepthwiseConvolution2dQueueDescriptor : QueueDescriptorWithParameters<DepthwiseConvolution2dDescriptor>
179{
180 DepthwiseConvolution2dQueueDescriptor()
181 : m_Weight(nullptr)
182 , m_Bias(nullptr)
183 {
184 }
185
186 const ConstCpuTensorHandle* m_Weight;
187 const ConstCpuTensorHandle* m_Bias;
188
189 void Validate(const WorkloadInfo& workloadInfo) const;
190};
191
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000192struct DetectionPostProcessQueueDescriptor : QueueDescriptorWithParameters<DetectionPostProcessDescriptor>
193{
Narumol Prangnawaratbc67cef2019-01-31 15:31:54 +0000194 DetectionPostProcessQueueDescriptor()
195 : m_Anchors(nullptr)
196 {
197 }
198
199 const ConstCpuTensorHandle* m_Anchors;
200
Narumol Prangnawarat94dd5d82019-01-23 18:06:26 +0000201 void Validate(const WorkloadInfo& workloadInfo) const;
202};
203
telsoa01c577f2c2018-08-31 09:22:23 +0100204// Normalization layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000205struct NormalizationQueueDescriptor : QueueDescriptorWithParameters<NormalizationDescriptor>
206{
207 void Validate(const WorkloadInfo& workloadInfo) const;
208};
209
telsoa01c577f2c2018-08-31 09:22:23 +0100210// Add layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000211struct AdditionQueueDescriptor : QueueDescriptor
212{
213 void Validate(const WorkloadInfo& workloadInfo) const;
214};
215
telsoa01c577f2c2018-08-31 09:22:23 +0100216// Multiplication layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000217struct MultiplicationQueueDescriptor : QueueDescriptor
218{
219 void Validate(const WorkloadInfo& workloadInfo) const;
220};
221
Francis Murtaghe7a86a42018-08-29 12:42:10 +0100222// Division layer workload data.
223struct DivisionQueueDescriptor : QueueDescriptor
224{
225 void Validate(const WorkloadInfo& workloadInfo) const;
226};
227
David Beckc2044fe2018-09-05 15:00:38 +0100228// Subtraction layer workload data.
229struct SubtractionQueueDescriptor : QueueDescriptor
230{
231 void Validate(const WorkloadInfo& workloadInfo) const;
232};
233
Nattapat Chaimanowong5a4304a2018-11-28 10:44:37 +0000234// Maximum layer workload data.
235struct MaximumQueueDescriptor : QueueDescriptor
236{
237 void Validate(const WorkloadInfo& workloadInfo) const;
238};
239
narpra01a6bf9122018-09-10 09:50:09 +0100240// Mean layer workload data.
narpra0132b90462018-09-13 11:07:48 +0100241struct MeanQueueDescriptor : QueueDescriptorWithParameters<MeanDescriptor>
narpra01a6bf9122018-09-10 09:50:09 +0100242{
243 void Validate(const WorkloadInfo& workloadInfo) const;
244};
245
jimfly012c9322a2018-09-19 10:59:49 +0100246// Pad layer workload data
247struct PadQueueDescriptor : QueueDescriptorWithParameters<PadDescriptor>
248{
249 void Validate(const WorkloadInfo& workloadInfo) const;
250};
251
Derek Lambertia9cca6a2019-03-25 15:41:58 +0000252struct QuantizeQueueDescriptor : QueueDescriptor
253{
254 void Validate(const WorkloadInfo& workloadInfo) const;
255};
256
FrancisMurtagh20995952018-12-17 12:11:36 +0000257// Equal layer workload data
258struct EqualQueueDescriptor : QueueDescriptor
259{
260 void Validate(const WorkloadInfo& workloadInfo) const;
261};
262
telsoa01c577f2c2018-08-31 09:22:23 +0100263// Batch norm layer workload data.
telsoa014fcda012018-03-09 14:13:49 +0000264struct BatchNormalizationQueueDescriptor : QueueDescriptorWithParameters<BatchNormalizationDescriptor>
265{
266 BatchNormalizationQueueDescriptor()
267 : m_Mean(nullptr)
268 , m_Variance(nullptr)
269 , m_Beta(nullptr)
270 , m_Gamma(nullptr)
271 {
272 }
273
274 const ConstCpuTensorHandle* m_Mean;
275 const ConstCpuTensorHandle* m_Variance;
276 const ConstCpuTensorHandle* m_Beta;
277 const ConstCpuTensorHandle* m_Gamma;
278
279 void Validate(const WorkloadInfo& workloadInfo) const;
280};
281
282struct ResizeBilinearQueueDescriptor : QueueDescriptorWithParameters<ResizeBilinearDescriptor>
283{
284 void Validate(const WorkloadInfo& workloadInfo) const;
285};
286
Teresa Charlina9075df2019-06-27 15:41:57 +0100287struct ResizeQueueDescriptor : QueueDescriptorWithParameters<ResizeDescriptor>
288{
289 void Validate(const WorkloadInfo& workloadInfo) const;
290};
291
telsoa014fcda012018-03-09 14:13:49 +0000292struct FakeQuantizationQueueDescriptor : QueueDescriptorWithParameters<FakeQuantizationDescriptor>
293{
294 FakeQuantizationQueueDescriptor()
295 : m_Min(nullptr)
296 , m_Max(nullptr)
297 {
298 }
299
300 const ConstCpuTensorHandle* m_Min;
301 const ConstCpuTensorHandle* m_Max;
302
303 void Validate(const WorkloadInfo& workloadInfo) const;
304};
305
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100306struct L2NormalizationQueueDescriptor : QueueDescriptorWithParameters<L2NormalizationDescriptor>
telsoa014fcda012018-03-09 14:13:49 +0000307{
308 void Validate(const WorkloadInfo& workloadInfo) const;
309};
310
311struct ConstantQueueDescriptor : QueueDescriptor
312{
313 ConstantQueueDescriptor()
314 : m_LayerOutput(nullptr)
315 {
316 }
317
318 const ConstCpuTensorHandle* m_LayerOutput;
319
320 void Validate(const WorkloadInfo& workloadInfo) const;
321};
322
323struct ReshapeQueueDescriptor : QueueDescriptorWithParameters<ReshapeDescriptor>
324{
325 void Validate(const WorkloadInfo& workloadInfo) const;
326};
327
Nattapat Chaimanowong207ef9a2018-11-02 10:57:25 +0000328struct SpaceToBatchNdQueueDescriptor : QueueDescriptorWithParameters<SpaceToBatchNdDescriptor>
329{
330 void Validate(const WorkloadInfo& workloadInfo) const;
331};
332
Aron Virginas-Tar972af152019-06-11 14:14:03 +0100333struct SpaceToDepthQueueDescriptor : QueueDescriptorWithParameters<SpaceToDepthDescriptor>
334{
335 void Validate(const WorkloadInfo& workloadInfo) const;
336};
337
telsoa014fcda012018-03-09 14:13:49 +0000338struct FloorQueueDescriptor : QueueDescriptor
339{
340 void Validate(const WorkloadInfo& workloadInfo) const;
341};
342
telsoa01c577f2c2018-08-31 09:22:23 +0100343struct LstmQueueDescriptor : QueueDescriptorWithParameters<LstmDescriptor>
344{
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)
Jan Eilers38e05bd2019-06-26 13:10:09 +0100363 , m_InputLayerNormWeights(nullptr)
364 , m_ForgetLayerNormWeights(nullptr)
365 , m_CellLayerNormWeights(nullptr)
366 , m_OutputLayerNormWeights(nullptr)
telsoa01c577f2c2018-08-31 09:22:23 +0100367 {
368 }
369
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;
Jan Eilers38e05bd2019-06-26 13:10:09 +0100387 const ConstCpuTensorHandle* m_InputLayerNormWeights;
388 const ConstCpuTensorHandle* m_ForgetLayerNormWeights;
389 const ConstCpuTensorHandle* m_CellLayerNormWeights;
390 const ConstCpuTensorHandle* m_OutputLayerNormWeights;
telsoa01c577f2c2018-08-31 09:22:23 +0100391
392 void Validate(const WorkloadInfo& workloadInfo) const;
393};
394
395struct ConvertFp16ToFp32QueueDescriptor : QueueDescriptor
396{
397 void Validate(const WorkloadInfo& workloadInfo) const;
398};
399
400struct ConvertFp32ToFp16QueueDescriptor : QueueDescriptor
401{
402 void Validate(const WorkloadInfo& workloadInfo) const;
403};
404
Éanna Ó Catháin4e1e1362018-11-12 11:36:34 +0000405struct BatchToSpaceNdQueueDescriptor : QueueDescriptorWithParameters<BatchToSpaceNdDescriptor>
406{
407 void Validate(const WorkloadInfo& workloadInfo) const;
408};
Conor Kennedy430b5d82018-11-14 15:28:28 +0000409
410struct StridedSliceQueueDescriptor : QueueDescriptorWithParameters<StridedSliceDescriptor>
411{
412 void Validate(const WorkloadInfo& workloadInfo) const;
413};
414
Éanna Ó Catháin20e58802018-12-04 10:29:06 +0000415// Minimum layer workload data.
kevmay0190539692018-11-29 08:40:19 +0000416struct MinimumQueueDescriptor : QueueDescriptor
417{
418 void Validate(const WorkloadInfo& workloadInfo) const;
419};
420
Matteo Martincigh59a950c2018-12-13 12:48:25 +0000421struct GreaterQueueDescriptor : QueueDescriptor
422{
423 void Validate(const WorkloadInfo& workloadInfo) const;
424};
425
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000426struct DebugQueueDescriptor : QueueDescriptor
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000427{
428 void Validate(const WorkloadInfo& workloadInfo) const;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000429
430 LayerGuid m_Guid;
431 std::string m_LayerName;
432 unsigned int m_SlotIndex;
Nattapat Chaimanowonga9a1cf12018-12-03 16:06:49 +0000433};
434
Mohamed Nour Abouelseouda1d3c6a2018-12-27 12:39:16 +0000435struct RsqrtQueueDescriptor : QueueDescriptor
436{
437 void Validate(const WorkloadInfo& workloadInfo) const;
438};
439
narpra01b89b05f2019-01-16 09:53:09 +0000440struct GatherQueueDescriptor : QueueDescriptor
441{
442 void Validate(const WorkloadInfo& workloadInfo) const;
443};
444
Matteo Martincigh49124022019-01-11 13:25:59 +0000445struct PreCompiledQueueDescriptor : QueueDescriptorWithParameters<PreCompiledDescriptor>
446{
447 PreCompiledQueueDescriptor()
448 : m_PreCompiledObject(nullptr)
449 {
450 }
451
Matteo Martincigh7997a352019-04-17 15:37:30 +0100452 void* m_PreCompiledObject;
Matteo Martincigh49124022019-01-11 13:25:59 +0000453
454 void Validate(const WorkloadInfo& workloadInfo) const;
455};
456
Nattapat Chaimanowonge4294fd2019-03-28 09:56:53 +0000457struct DequantizeQueueDescriptor : QueueDescriptor
458{
459 void Validate(const WorkloadInfo& workloadInfo) const;
460};
461
Nattapat Chaimanowong1f886302019-04-05 13:37:19 +0100462struct MergeQueueDescriptor : QueueDescriptor
463{
464 void Validate(const WorkloadInfo& workloadInfo) const;
465};
466
Sadik Armaganeff363d2019-04-05 15:25:46 +0100467struct SwitchQueueDescriptor : QueueDescriptor
468{
469 void Validate(const WorkloadInfo& workloadInfo) const;
470};
471
Matteo Martincigh0e406ee2019-06-12 15:42:18 +0100472struct PreluQueueDescriptor : QueueDescriptor
473{
474 void Validate(const WorkloadInfo& workloadInfo) const;
475};
476
Aron Virginas-Tar639fb042019-06-20 14:28:19 +0100477struct TransposeConvolution2dQueueDescriptor : QueueDescriptorWithParameters<TransposeConvolution2dDescriptor>
478{
479 TransposeConvolution2dQueueDescriptor() :
480 m_Weight(nullptr),
481 m_Bias(nullptr)
482 {}
483
484 const ConstCpuTensorHandle* m_Weight;
485 const ConstCpuTensorHandle* m_Bias;
486
487 void Validate(const WorkloadInfo& workloadInfo) const;
488};
489
James Conroyee18dc82019-07-17 11:27:46 +0100490struct QuantizedLstmQueueDescriptor : QueueDescriptor
491{
492 QuantizedLstmQueueDescriptor()
493 : m_InputToInputWeights(nullptr)
494 , m_InputToForgetWeights(nullptr)
495 , m_InputToCellWeights(nullptr)
496 , m_InputToOutputWeights(nullptr)
497
498 , m_RecurrentToInputWeights(nullptr)
499 , m_RecurrentToForgetWeights(nullptr)
500 , m_RecurrentToCellWeights(nullptr)
501 , m_RecurrentToOutputWeights(nullptr)
502
503 , m_InputGateBias(nullptr)
504 , m_ForgetGateBias(nullptr)
505 , m_CellBias(nullptr)
506 , m_OutputGateBias(nullptr)
507 {}
508
509 const ConstCpuTensorHandle* m_InputToInputWeights;
510 const ConstCpuTensorHandle* m_InputToForgetWeights;
511 const ConstCpuTensorHandle* m_InputToCellWeights;
512 const ConstCpuTensorHandle* m_InputToOutputWeights;
513
514 const ConstCpuTensorHandle* m_RecurrentToInputWeights;
515 const ConstCpuTensorHandle* m_RecurrentToForgetWeights;
516 const ConstCpuTensorHandle* m_RecurrentToCellWeights;
517 const ConstCpuTensorHandle* m_RecurrentToOutputWeights;
518
519 const ConstCpuTensorHandle* m_InputGateBias;
520 const ConstCpuTensorHandle* m_ForgetGateBias;
521 const ConstCpuTensorHandle* m_CellBias;
522 const ConstCpuTensorHandle* m_OutputGateBias;
523
524 void Validate(const WorkloadInfo& workloadInfo) const;
525};
526
telsoa014fcda012018-03-09 14:13:49 +0000527} //namespace armnn