ArmNN
 20.05
NeonWorkloadFactory.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "NeonBackendId.hpp"
7 #include "NeonTensorHandle.hpp"
9 
10 #include <Layer.hpp>
11 
12 #include <armnn/Utils.hpp>
15 
20 
23 
24 namespace armnn
25 {
26 
27 namespace
28 {
29 static const BackendId s_Id{NeonBackendId()};
30 }
31 
33  Optional<DataType> dataType,
34  std::string& outReasonIfUnsupported)
35 {
36  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
37 }
38 
40 {
41  return s_Id;
42 }
43 
44 NeonWorkloadFactory::NeonWorkloadFactory(const std::shared_ptr<NeonMemoryManager>& memoryManager)
45  : m_MemoryManager(memoryManager)
46 {
47 }
48 
49 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
50  TensorShape const& subTensorShape,
51  unsigned int const* subTensorOrigin) const
52 {
53  const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
54 
56  coords.set_num_dimensions(subTensorShape.GetNumDimensions());
57  for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
58  {
59  // Arm compute indexes tensor coords in reverse order.
60  unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
61  coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
62  }
63 
64  const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(parent.GetShape());
65  if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape))
66  {
67  return nullptr;
68  }
69 
70  return std::make_unique<NeonSubTensorHandle>(
71  PolymorphicDowncast<IAclTensorHandle*>(&parent), shape, coords);
72 }
73 
74 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
75  const bool IsMemoryManaged) const
76 {
77  auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo);
78  if (IsMemoryManaged)
79  {
80  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
81  }
82  return tensorHandle;
83 }
84 
85 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
86  DataLayout dataLayout,
87  const bool IsMemoryManaged) const
88 {
89  auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo, dataLayout);
90  if (IsMemoryManaged)
91  {
92  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
93  }
94  return tensorHandle;
95 }
96 
97 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
98  const WorkloadInfo& info) const
99 {
100  IgnoreUnused(descriptor);
101 
102  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
103  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Abs);
104 
105  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
106 }
107 
108 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
109  const WorkloadInfo& info) const
110 {
111  return std::make_unique<NeonActivationWorkload>(descriptor, info);
112 }
113 
114 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
115  const WorkloadInfo& info) const
116 {
117  return std::make_unique<NeonAdditionWorkload>(descriptor, info);
118 }
119 
120 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
121  const WorkloadInfo& info) const
122 {
123  return std::make_unique<NeonArgMinMaxWorkload>(descriptor, info);
124 }
125 
126 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateBatchNormalization(
127  const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
128 {
129  return std::make_unique<NeonBatchNormalizationWorkload>(descriptor, info);
130 }
131 
133  const WorkloadInfo& info) const
134 {
135  return std::make_unique<NeonBatchToSpaceNdWorkload>(descriptor, info);
136 }
137 
138 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
139  const WorkloadInfo& info) const
140 {
141  return std::make_unique<NeonComparisonWorkload>(descriptor, info);
142 }
143 
144 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
145  const WorkloadInfo& info) const
146 {
147  return std::make_unique<NeonConcatWorkload>(descriptor, info);
148 }
149 
150 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
151  const WorkloadInfo& info) const
152 {
153  return std::make_unique<NeonConstantWorkload>(descriptor, info);
154 }
155 
157  const ConvertBf16ToFp32QueueDescriptor& descriptor,
158  const WorkloadInfo& info) const
159 {
160  return std::make_unique<NeonConvertBf16ToFp32Workload>(descriptor, info);
161 }
162 
164  const ConvertFp16ToFp32QueueDescriptor& descriptor,
165  const WorkloadInfo& info) const
166 {
167  return std::make_unique<NeonConvertFp16ToFp32Workload>(descriptor, info);
168 }
169 
171  const ConvertFp32ToBf16QueueDescriptor& descriptor,
172  const WorkloadInfo& info) const
173 {
174  return std::make_unique<NeonConvertFp32ToBf16Workload>(descriptor, info);
175 }
176 
178  const ConvertFp32ToFp16QueueDescriptor& descriptor,
179  const WorkloadInfo& info) const
180 {
181  return std::make_unique<NeonConvertFp32ToFp16Workload>(descriptor, info);
182 }
183 
184 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConvolution2d(
185  const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
186 {
187  return std::make_unique<NeonConvolution2dWorkload>(descriptor, info,
188  m_MemoryManager->GetIntraLayerManager());
189 }
190 
191 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
192  const WorkloadInfo& info) const
193 {
194  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
195 }
196 
197 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
198  const WorkloadInfo& info) const
199 {
200  return std::make_unique<NeonDepthToSpaceWorkload>(descriptor, info);
201 }
202 
204  const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
205 {
206  return std::make_unique<NeonDepthwiseConvolutionWorkload>(descriptor, info);
207 }
208 
209 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
210  const WorkloadInfo& info) const
211 {
212  return std::make_unique<NeonDequantizeWorkload>(descriptor, info);
213 }
214 
217 {
218  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
219 }
220 
221 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateDivision(
222  const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
223 {
224  return std::make_unique<NeonDivisionWorkload>(descriptor, info);
225 }
226 
228  const ElementwiseUnaryQueueDescriptor& descriptor, const WorkloadInfo& info) const
229 {
230  switch(descriptor.m_Parameters.m_Operation)
231  {
232  case UnaryOperation::Abs:
233  {
234  AbsQueueDescriptor absQueueDescriptor;
235  absQueueDescriptor.m_Inputs = descriptor.m_Inputs;
236  absQueueDescriptor.m_Outputs = descriptor.m_Outputs;
237 
238  return std::make_unique<NeonAbsWorkload>(absQueueDescriptor, info);
239  }
241  {
242  RsqrtQueueDescriptor rsqrtQueueDescriptor;
243  rsqrtQueueDescriptor.m_Inputs = descriptor.m_Inputs;
244  rsqrtQueueDescriptor.m_Outputs = descriptor.m_Outputs;
245 
246  return std::make_unique<NeonRsqrtWorkload>(rsqrtQueueDescriptor, info);
247  }
248  case UnaryOperation::Neg:
249  return std::make_unique<NeonNegWorkload>(descriptor, info);
250  case UnaryOperation::Exp:
251  return std::make_unique<NeonExpWorkload>(descriptor, info);
252  default:
253  return nullptr;
254  }
255 }
256 
257 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
258  const WorkloadInfo& info) const
259 {
260  IgnoreUnused(descriptor);
261 
262  ComparisonQueueDescriptor comparisonDescriptor;
264 
265  return CreateComparison(comparisonDescriptor, info);
266 }
267 
268 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
269  const WorkloadInfo& info) const
270 {
271  return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
272 }
273 
274 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateFullyConnected(
275  const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
276 {
277  return std::make_unique<NeonFullyConnectedWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
278 }
279 
280 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor,
281  const armnn::WorkloadInfo& info) const
282 {
283  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
284 }
285 
286 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
287  const WorkloadInfo& info) const
288 {
289  IgnoreUnused(descriptor);
290 
291  ComparisonQueueDescriptor comparisonDescriptor;
293 
294  return CreateComparison(comparisonDescriptor, info);
295 }
296 
297 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
298  const WorkloadInfo& info) const
299 {
300  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
301 }
302 
304  const InstanceNormalizationQueueDescriptor& descriptor,
305  const WorkloadInfo& info) const
306 {
307  return std::make_unique<NeonInstanceNormalizationWorkload>(descriptor, info);
308 }
309 
311  const WorkloadInfo& info) const
312 {
313  return MakeWorkloadHelper<NeonL2NormalizationFloatWorkload, NullWorkload>(descriptor, info,
314  m_MemoryManager->GetIntraLayerManager());
315 }
316 
317 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
318  const WorkloadInfo& info) const
319 {
320  return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
321 }
322 
323 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
324  const WorkloadInfo& info) const
325 {
326  return std::make_unique<NeonMaximumWorkload>(descriptor, info);
327 }
328 
329 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
330  const WorkloadInfo& info) const
331 {
332  return std::make_unique<NeonMeanWorkload>(descriptor, info);
333 }
334 
335 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
336  const WorkloadInfo& info) const
337 {
338  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
339  {
340  throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemCopy workload");
341  }
342 
343  return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
344 }
345 
346 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
347  const WorkloadInfo& info) const
348 {
349  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
350  {
351  throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemImport workload");
352  }
353 
354  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
355 }
356 
357 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
358  const WorkloadInfo& info) const
359 {
360  return CreateConcat(descriptor, info);
361 }
362 
363 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
364  const WorkloadInfo& info) const
365 {
366  return std::make_unique<NeonMinimumWorkload>(descriptor, info);
367 }
368 
369 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMultiplication(
370  const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
371 {
372  return std::make_unique<NeonMultiplicationWorkload>(descriptor, info);
373 }
374 
375 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateNormalization(
376  const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
377 {
378  return MakeWorkloadHelper<NeonNormalizationFloatWorkload, NullWorkload>(descriptor, info,
379  m_MemoryManager->GetIntraLayerManager());
380 }
381 
382 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
383  const WorkloadInfo& info) const
384 {
385  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
386 }
387 
388 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
389  const WorkloadInfo& info) const
390 {
391  return std::make_unique<NeonPadWorkload>(descriptor, info);
392 }
393 
394 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
395  const WorkloadInfo& info) const
396 {
397  return std::make_unique<NeonPermuteWorkload>(descriptor, info);
398 }
399 
400 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
401  const WorkloadInfo& info) const
402 {
403  return std::make_unique<NeonPooling2dWorkload>(descriptor, info);
404 }
405 
406 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
407  const WorkloadInfo& info) const
408 {
409  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
410 }
411 
412 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePrelu(const armnn::PreluQueueDescriptor &descriptor,
413  const armnn::WorkloadInfo &info) const
414 {
415  return std::make_unique<NeonPreluWorkload>(descriptor, info);
416 }
417 
418 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
419  const WorkloadInfo& info) const
420 {
421  return std::make_unique<NeonQLstmWorkload>(descriptor, info);
422 }
423 
424 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
425  const WorkloadInfo& info) const
426 {
427  return std::make_unique<NeonQuantizeWorkload>(descriptor, info);
428 }
429 
430 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
431  const WorkloadInfo& info) const
432 {
433  return std::make_unique<NeonQuantizedLstmWorkload>(descriptor, info);
434 }
435 
436 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
437  const WorkloadInfo& info) const
438 {
439  return std::make_unique<NeonReshapeWorkload>(descriptor, info);
440 }
441 
442 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
443  const WorkloadInfo& info) const
444 {
445  return std::make_unique<NeonResizeWorkload>(descriptor, info);
446 }
447 
448 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateResizeBilinear(
449  const ResizeBilinearQueueDescriptor& descriptor,
450  const WorkloadInfo& info) const
451 {
452  ResizeQueueDescriptor resizeDescriptor;
453  resizeDescriptor.m_Inputs = descriptor.m_Inputs;
454  resizeDescriptor.m_Outputs = descriptor.m_Outputs;
455 
456  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
457  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
458  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
459 
460  return CreateResize(resizeDescriptor, info);
461 }
462 
463 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor &descriptor,
464  const WorkloadInfo &info) const
465 {
466  IgnoreUnused(descriptor);
467 
468  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
469  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Rsqrt);
470 
471  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
472 }
473 
474 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
475  const WorkloadInfo& info) const
476 {
477  return std::make_unique<NeonSliceWorkload>(descriptor, info);
478 }
479 
480 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
481  const WorkloadInfo& info) const
482 {
483  return std::make_unique<NeonSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
484 }
485 
487  const WorkloadInfo& info) const
488 {
489  return std::make_unique<NeonSpaceToBatchNdWorkload>(descriptor, info);
490 }
491 
492 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
493  const WorkloadInfo& info) const
494 {
495  return std::make_unique<NeonSpaceToDepthWorkload>(descriptor, info);
496 }
497 
498 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
499  const WorkloadInfo& info) const
500 {
501  return std::make_unique<NeonSplitterWorkload>(descriptor, info);
502 }
503 
504 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
505  const WorkloadInfo& info) const
506 {
507  return std::make_unique<NeonStackWorkload>(descriptor, info);
508 }
509 
510 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
511  const WorkloadInfo& info) const
512 {
513  return std::make_unique<NeonStridedSliceWorkload>(descriptor, info);
514 }
515 
516 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateSubtraction(
517  const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
518 {
519  return std::make_unique<NeonSubtractionWorkload>(descriptor, info);
520 }
521 
522 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
523  const WorkloadInfo& info) const
524 {
525  return std::make_unique<NeonTransposeWorkload>(descriptor, info);
526 }
527 
529  const TransposeConvolution2dQueueDescriptor &descriptor,
530  const WorkloadInfo &info) const
531 {
532  return std::make_unique<NeonTransposeConvolution2dWorkload>(descriptor, info,
533  m_MemoryManager->GetIntraLayerManager());
534 }
535 
536 } // namespace armnn
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
DataLayout
Definition: Types.hpp:49
std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
A ComparisonDescriptor for the ComparisonLayer.
Definition: Descriptors.hpp:70
uint32_t m_TargetWidth
Target width value.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::array< unsigned int, MaxNumOfTensorDimensions > Coordinates
constexpr const char * NeonBackendId()
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Copyright (c) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
std::unique_ptr< ITensorHandle > CreateSubTensorHandle(ITensorHandle &parent, TensorShape const &subTensorShape, unsigned int const *subTensorOrigin) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
NeonWorkloadFactory(const std::shared_ptr< NeonMemoryManager > &memoryManager)
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQuantizedLstm(const QuantizedLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
const BackendId & GetBackendId() const override
std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
virtual TensorShape GetShape() const =0
Get the number of elements for each dimension ordered from slowest iterating dimension to fastest ite...
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetHeight
Target height value.
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
A ElementwiseUnaryDescriptor for the ElementwiseUnaryLayer.
Definition: Descriptors.hpp:90
std::vector< ITensorHandle * > m_Outputs
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
unsigned int GetNumDimensions() const
Definition: Tensor.hpp:43
std::unique_ptr< IWorkload > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
Contains information about inputs and outputs to a layer.
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< ITensorHandle * > m_Inputs
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const override
std::unique_ptr< IWorkload > CreateConvertBf16ToFp32(const ConvertBf16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override