ArmNN
 20.08
NeonWorkloadFactory.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. 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::CreateFill(const FillQueueDescriptor& descriptor,
269  const WorkloadInfo& info) const
270 {
271  return std::make_unique<NeonFillWorkload>(descriptor, info);
272 }
273 
274 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
275  const WorkloadInfo& info) const
276 {
277  return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
278 }
279 
280 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateFullyConnected(
281  const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
282 {
283  return std::make_unique<NeonFullyConnectedWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
284 }
285 
286 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor,
287  const armnn::WorkloadInfo& info) const
288 {
289  return std::make_unique<NeonGatherWorkload>(descriptor, info);
290 }
291 
292 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
293  const WorkloadInfo& info) const
294 {
295  IgnoreUnused(descriptor);
296 
297  ComparisonQueueDescriptor comparisonDescriptor;
299 
300  return CreateComparison(comparisonDescriptor, info);
301 }
302 
303 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
304  const WorkloadInfo& info) const
305 {
306  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
307 }
308 
310  const InstanceNormalizationQueueDescriptor& descriptor,
311  const WorkloadInfo& info) const
312 {
313  return std::make_unique<NeonInstanceNormalizationWorkload>(descriptor, info);
314 }
315 
317  const WorkloadInfo& info) const
318 {
319  return MakeWorkloadHelper<NeonL2NormalizationFloatWorkload, NullWorkload>(descriptor, info,
320  m_MemoryManager->GetIntraLayerManager());
321 }
322 
323 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
324  const WorkloadInfo& info) const
325 {
326  return std::make_unique<NeonLogSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
327 }
328 
329 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
330  const WorkloadInfo& info) const
331 {
332  return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
333 }
334 
335 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
336  const WorkloadInfo& info) const
337 {
338  return std::make_unique<NeonMaximumWorkload>(descriptor, info);
339 }
340 
341 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
342  const WorkloadInfo& info) const
343 {
344  return std::make_unique<NeonMeanWorkload>(descriptor, info);
345 }
346 
347 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
348  const WorkloadInfo& info) const
349 {
350  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
351  {
352  throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemCopy workload");
353  }
354 
355  return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
356 }
357 
358 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
359  const WorkloadInfo& info) const
360 {
361  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
362  {
363  throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemImport workload");
364  }
365 
366  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
367 }
368 
369 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
370  const WorkloadInfo& info) const
371 {
372  return CreateConcat(descriptor, info);
373 }
374 
375 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
376  const WorkloadInfo& info) const
377 {
378  return std::make_unique<NeonMinimumWorkload>(descriptor, info);
379 }
380 
381 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMultiplication(
382  const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
383 {
384  return std::make_unique<NeonMultiplicationWorkload>(descriptor, info);
385 }
386 
387 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateNormalization(
388  const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
389 {
390  return MakeWorkloadHelper<NeonNormalizationFloatWorkload, NullWorkload>(descriptor, info,
391  m_MemoryManager->GetIntraLayerManager());
392 }
393 
394 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
395  const WorkloadInfo& info) const
396 {
397  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
398 }
399 
400 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
401  const WorkloadInfo& info) const
402 {
403  return std::make_unique<NeonPadWorkload>(descriptor, info);
404 }
405 
406 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
407  const WorkloadInfo& info) const
408 {
409  return std::make_unique<NeonPermuteWorkload>(descriptor, info);
410 }
411 
412 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
413  const WorkloadInfo& info) const
414 {
415  return std::make_unique<NeonPooling2dWorkload>(descriptor, info);
416 }
417 
418 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
419  const WorkloadInfo& info) const
420 {
421  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
422 }
423 
424 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePrelu(const armnn::PreluQueueDescriptor &descriptor,
425  const armnn::WorkloadInfo &info) const
426 {
427  return std::make_unique<NeonPreluWorkload>(descriptor, info);
428 }
429 
430 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
431  const WorkloadInfo& info) const
432 {
433  return std::make_unique<NeonQLstmWorkload>(descriptor, info);
434 }
435 
436 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
437  const WorkloadInfo& info) const
438 {
439  return std::make_unique<NeonQuantizeWorkload>(descriptor, info);
440 }
441 
442 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
443  const WorkloadInfo& info) const
444 {
445  return std::make_unique<NeonQuantizedLstmWorkload>(descriptor, info);
446 }
447 
448 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
449  const WorkloadInfo& info) const
450 {
451  return std::make_unique<NeonReshapeWorkload>(descriptor, info);
452 }
453 
454 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
455  const WorkloadInfo& info) const
456 {
457  return std::make_unique<NeonResizeWorkload>(descriptor, info);
458 }
459 
460 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateResizeBilinear(
461  const ResizeBilinearQueueDescriptor& descriptor,
462  const WorkloadInfo& info) const
463 {
464  ResizeQueueDescriptor resizeDescriptor;
465  resizeDescriptor.m_Inputs = descriptor.m_Inputs;
466  resizeDescriptor.m_Outputs = descriptor.m_Outputs;
467 
468  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
469  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
470  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
471 
472  return CreateResize(resizeDescriptor, info);
473 }
474 
475 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor &descriptor,
476  const WorkloadInfo &info) const
477 {
478  IgnoreUnused(descriptor);
479 
480  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
481  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Rsqrt);
482 
483  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
484 }
485 
486 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
487  const WorkloadInfo& info) const
488 {
489  return std::make_unique<NeonSliceWorkload>(descriptor, info);
490 }
491 
492 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
493  const WorkloadInfo& info) const
494 {
495  return std::make_unique<NeonSoftmaxWorkload>(descriptor, info, m_MemoryManager->GetIntraLayerManager());
496 }
497 
499  const WorkloadInfo& info) const
500 {
501  return std::make_unique<NeonSpaceToBatchNdWorkload>(descriptor, info);
502 }
503 
504 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
505  const WorkloadInfo& info) const
506 {
507  return std::make_unique<NeonSpaceToDepthWorkload>(descriptor, info);
508 }
509 
510 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
511  const WorkloadInfo& info) const
512 {
513  return std::make_unique<NeonSplitterWorkload>(descriptor, info);
514 }
515 
516 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
517  const WorkloadInfo& info) const
518 {
519  return std::make_unique<NeonStackWorkload>(descriptor, info);
520 }
521 
522 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
523  const WorkloadInfo& info) const
524 {
525  return std::make_unique<NeonStridedSliceWorkload>(descriptor, info);
526 }
527 
528 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateSubtraction(
529  const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
530 {
531  return std::make_unique<NeonSubtractionWorkload>(descriptor, info);
532 }
533 
534 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
535  const WorkloadInfo& info) const
536 {
537  return std::make_unique<NeonTransposeWorkload>(descriptor, info);
538 }
539 
541  const TransposeConvolution2dQueueDescriptor &descriptor,
542  const WorkloadInfo &info) const
543 {
544  return std::make_unique<NeonTransposeConvolution2dWorkload>(descriptor, info,
545  m_MemoryManager->GetIntraLayerManager());
546 }
547 
548 } // 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.
std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
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 > CreateFill(const FillQueueDescriptor &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
Function that returns the tensor rank.
Definition: Tensor.cpp:175
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