ArmNN
 20.02
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>
14 
19 
22 
23 #include <boost/polymorphic_cast.hpp>
24 
25 namespace armnn
26 {
27 
28 namespace
29 {
30 static const BackendId s_Id{NeonBackendId()};
31 }
32 
34  Optional<DataType> dataType,
35  std::string& outReasonIfUnsupported)
36 {
37  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
38 }
39 
41 {
42  return s_Id;
43 }
44 
45 NeonWorkloadFactory::NeonWorkloadFactory(const std::shared_ptr<NeonMemoryManager>& memoryManager)
46  : m_MemoryManager(memoryManager)
47 {
48 }
49 
50 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateSubTensorHandle(ITensorHandle& parent,
51  TensorShape const& subTensorShape,
52  unsigned int const* subTensorOrigin) const
53 {
54  const arm_compute::TensorShape shape = armcomputetensorutils::BuildArmComputeTensorShape(subTensorShape);
55 
57  coords.set_num_dimensions(subTensorShape.GetNumDimensions());
58  for (unsigned int i = 0; i < subTensorShape.GetNumDimensions(); i++)
59  {
60  // Arm compute indexes tensor coords in reverse order.
61  unsigned int revertedIndex = subTensorShape.GetNumDimensions() - i - 1;
62  coords.set(i, boost::numeric_cast<int>(subTensorOrigin[revertedIndex]));
63  }
64 
65  const arm_compute::TensorShape parentShape = armcomputetensorutils::BuildArmComputeTensorShape(parent.GetShape());
66  if (!::arm_compute::error_on_invalid_subtensor(__func__, __FILE__, __LINE__, parentShape, coords, shape))
67  {
68  return nullptr;
69  }
70 
71  return std::make_unique<NeonSubTensorHandle>(
72  boost::polymorphic_downcast<IAclTensorHandle*>(&parent), shape, coords);
73 }
74 
75 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
76  const bool IsMemoryManaged) const
77 {
78  auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo);
79  if (IsMemoryManaged)
80  {
81  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
82  }
83  return tensorHandle;
84 }
85 
86 std::unique_ptr<ITensorHandle> NeonWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
87  DataLayout dataLayout,
88  const bool IsMemoryManaged) const
89 {
90  auto tensorHandle = std::make_unique<NeonTensorHandle>(tensorInfo, dataLayout);
91  if (IsMemoryManaged)
92  {
93  tensorHandle->SetMemoryGroup(m_MemoryManager->GetInterLayerMemoryGroup());
94  }
95  return tensorHandle;
96 }
97 
98 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
99  const WorkloadInfo& info) const
100 {
101  IgnoreUnused(descriptor);
102 
103  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
104  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Abs);
105 
106  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
107 }
108 
109 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
110  const WorkloadInfo& info) const
111 {
112  return std::make_unique<NeonActivationWorkload>(descriptor, info);
113 }
114 
115 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
116  const WorkloadInfo& info) const
117 {
118  return std::make_unique<NeonAdditionWorkload>(descriptor, info);
119 }
120 
121 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
122  const WorkloadInfo& info) const
123 {
124  return std::make_unique<NeonArgMinMaxWorkload>(descriptor, info);
125 }
126 
127 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateBatchNormalization(
128  const BatchNormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
129 {
130  return std::make_unique<NeonBatchNormalizationWorkload>(descriptor, info);
131 }
132 
134  const WorkloadInfo& info) const
135 {
136  return std::make_unique<NeonBatchToSpaceNdWorkload>(descriptor, info);
137 }
138 
139 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
140  const WorkloadInfo& info) const
141 {
143  {
144  GreaterQueueDescriptor greaterQueueDescriptor;
145  greaterQueueDescriptor.m_Inputs = descriptor.m_Inputs;
146  greaterQueueDescriptor.m_Outputs = descriptor.m_Outputs;
147 
148  return MakeWorkloadHelper<NeonGreaterFloat32Workload, NeonGreaterUint8Workload>(greaterQueueDescriptor, info);
149  }
150  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
151 }
152 
153 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
154  const WorkloadInfo& info) const
155 {
156  return std::make_unique<NeonConcatWorkload>(descriptor, info);
157 }
158 
159 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
160  const WorkloadInfo& info) const
161 {
162  return std::make_unique<NeonConstantWorkload>(descriptor, info);
163 }
164 
166  const ConvertFp16ToFp32QueueDescriptor& descriptor,
167  const WorkloadInfo& info) const
168 {
169  return std::make_unique<NeonConvertFp16ToFp32Workload>(descriptor, info);
170 }
171 
173  const ConvertFp32ToFp16QueueDescriptor& descriptor,
174  const WorkloadInfo& info) const
175 {
176  return std::make_unique<NeonConvertFp32ToFp16Workload>(descriptor, info);
177 }
178 
179 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateConvolution2d(
180  const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
181 {
182  return std::make_unique<NeonConvolution2dWorkload>(descriptor, info,
183  m_MemoryManager->GetIntraLayerManager());
184 }
185 
186 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
187  const WorkloadInfo& info) const
188 {
189  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
190 }
191 
192 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
193  const WorkloadInfo& info) const
194 {
195  return std::make_unique<NeonDepthToSpaceWorkload>(descriptor, info);
196 }
197 
199  const DepthwiseConvolution2dQueueDescriptor& descriptor, const WorkloadInfo& info) const
200 {
201  return std::make_unique<NeonDepthwiseConvolutionWorkload>(descriptor, info);
202 }
203 
204 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
205  const WorkloadInfo& info) const
206 {
207  return std::make_unique<NeonDequantizeWorkload>(descriptor, info);
208 }
209 
212 {
213  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
214 }
215 
216 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateDivision(
217  const DivisionQueueDescriptor& descriptor, const WorkloadInfo& info) const
218 {
219  return std::make_unique<NeonDivisionWorkload>(descriptor, info);
220 }
221 
223  descriptor,
224  const WorkloadInfo& info) const
225 {
226  if (descriptor.m_Parameters.m_Operation == UnaryOperation::Abs)
227  {
228  AbsQueueDescriptor absQueueDescriptor;
229  absQueueDescriptor.m_Inputs = descriptor.m_Inputs;
230  absQueueDescriptor.m_Outputs = descriptor.m_Outputs;
231 
232  return std::make_unique<NeonAbsWorkload>(absQueueDescriptor, info);
233  }
234  else if (descriptor.m_Parameters.m_Operation == UnaryOperation::Rsqrt)
235  {
236  RsqrtQueueDescriptor rsqrtQueueDescriptor;
237  rsqrtQueueDescriptor.m_Inputs = descriptor.m_Inputs;
238  rsqrtQueueDescriptor.m_Outputs = descriptor.m_Outputs;
239 
240  return std::make_unique<NeonRsqrtWorkload>(rsqrtQueueDescriptor, info);
241  }
242  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
243 }
244 
245 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
246  const WorkloadInfo& info) const
247 {
248  IgnoreUnused(descriptor);
249 
250  ComparisonQueueDescriptor comparisonDescriptor;
252 
253  return CreateComparison(comparisonDescriptor, info);
254 }
255 
256 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
257  const WorkloadInfo& info) const
258 {
259  return MakeWorkloadHelper<NeonFloorFloatWorkload, NullWorkload>(descriptor, info);
260 }
261 
262 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateFullyConnected(
263  const FullyConnectedQueueDescriptor& descriptor, const WorkloadInfo& info) const
264 {
265  return MakeWorkloadHelper<NeonFullyConnectedWorkload, NeonFullyConnectedWorkload>(
266  descriptor, info, m_MemoryManager->GetIntraLayerManager());
267 }
268 
269 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGather(const armnn::GatherQueueDescriptor& descriptor,
270  const armnn::WorkloadInfo& info) const
271 {
272  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
273 }
274 
275 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
276  const WorkloadInfo& info) const
277 {
278  IgnoreUnused(descriptor);
279 
280  ComparisonQueueDescriptor comparisonDescriptor;
282 
283  return CreateComparison(comparisonDescriptor, info);
284 }
285 
286 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
287  const WorkloadInfo& info) const
288 {
289  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
290 }
291 
293  const InstanceNormalizationQueueDescriptor& descriptor,
294  const WorkloadInfo& info) const
295 {
296  return std::make_unique<NeonInstanceNormalizationWorkload>(descriptor, info);
297 }
298 
300  const WorkloadInfo& info) const
301 {
302  return MakeWorkloadHelper<NeonL2NormalizationFloatWorkload, NullWorkload>(descriptor, info,
303  m_MemoryManager->GetIntraLayerManager());
304 }
305 
306 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
307  const WorkloadInfo& info) const
308 {
309  return MakeWorkloadHelper<NeonLstmFloatWorkload, NullWorkload>(descriptor, info);
310 }
311 
312 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
313  const WorkloadInfo& info) const
314 {
315  return std::make_unique<NeonMaximumWorkload>(descriptor, info);
316 }
317 
318 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
319  const WorkloadInfo& info) const
320 {
321  return std::make_unique<NeonMeanWorkload>(descriptor, info);
322 }
323 
324 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
325  const WorkloadInfo& info) const
326 {
327  if (descriptor.m_Inputs.empty() || !descriptor.m_Inputs[0])
328  {
329  throw InvalidArgumentException("NeonWorkloadFactory: Invalid null input for MemCopy workload");
330  }
331 
332  return MakeWorkloadHelper<CopyMemGenericWorkload, CopyMemGenericWorkload>(descriptor, info);
333 }
334 
335 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& 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 MemImport workload");
341  }
342 
343  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
344 }
345 
346 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
347  const WorkloadInfo& info) const
348 {
349  return CreateConcat(descriptor, info);
350 }
351 
352 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
353  const WorkloadInfo& info) const
354 {
355  return std::make_unique<NeonMinimumWorkload>(descriptor, info);
356 }
357 
358 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateMultiplication(
359  const MultiplicationQueueDescriptor& descriptor, const WorkloadInfo& info) const
360 {
361  return std::make_unique<NeonMultiplicationWorkload>(descriptor, info);
362 }
363 
364 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateNormalization(
365  const NormalizationQueueDescriptor& descriptor, const WorkloadInfo& info) const
366 {
367  return MakeWorkloadHelper<NeonNormalizationFloatWorkload, NullWorkload>(descriptor, info,
368  m_MemoryManager->GetIntraLayerManager());
369 }
370 
371 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
372  const WorkloadInfo& info) const
373 {
374  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
375 }
376 
377 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
378  const WorkloadInfo& info) const
379 {
380  return std::make_unique<NeonPadWorkload>(descriptor, info);
381 }
382 
383 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
384  const WorkloadInfo& info) const
385 {
386  return std::make_unique<NeonPermuteWorkload>(descriptor, info);
387 }
388 
389 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
390  const WorkloadInfo& info) const
391 {
392  return std::make_unique<NeonPooling2dWorkload>(descriptor, info);
393 }
394 
395 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& descriptor,
396  const WorkloadInfo& info) const
397 {
398  return MakeWorkloadHelper<NullWorkload, NullWorkload>(descriptor, info);
399 }
400 
401 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreatePrelu(const armnn::PreluQueueDescriptor &descriptor,
402  const armnn::WorkloadInfo &info) const
403 {
404  return std::make_unique<NeonPreluWorkload>(descriptor, info);
405 }
406 
407 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
408  const WorkloadInfo& info) const
409 {
410  return std::make_unique<NeonQuantizeWorkload>(descriptor, info);
411 }
412 
413 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateQuantizedLstm(const QuantizedLstmQueueDescriptor& descriptor,
414  const WorkloadInfo& info) const
415 {
416  return std::make_unique<NeonQuantizedLstmWorkload>(descriptor, info);
417 }
418 
419 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
420  const WorkloadInfo& info) const
421 {
422  return std::make_unique<NeonReshapeWorkload>(descriptor, info);
423 }
424 
425 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
426  const WorkloadInfo& info) const
427 {
428  return std::make_unique<NeonResizeWorkload>(descriptor, info);
429 }
430 
431 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateResizeBilinear(
432  const ResizeBilinearQueueDescriptor& descriptor,
433  const WorkloadInfo& info) const
434 {
435  ResizeQueueDescriptor resizeDescriptor;
436  resizeDescriptor.m_Inputs = descriptor.m_Inputs;
437  resizeDescriptor.m_Outputs = descriptor.m_Outputs;
438 
439  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
440  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
441  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
442 
443  return CreateResize(resizeDescriptor, info);
444 }
445 
446 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor &descriptor,
447  const WorkloadInfo &info) const
448 {
449  IgnoreUnused(descriptor);
450 
451  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
452  elementwiseUnaryDescriptor.m_Parameters = ElementwiseUnaryDescriptor(UnaryOperation::Rsqrt);
453 
454  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
455 }
456 
457 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
458  const WorkloadInfo& info) const
459 {
460  return std::make_unique<NeonSliceWorkload>(descriptor, info);
461 }
462 
463 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
464  const WorkloadInfo& info) const
465 {
466  return MakeWorkloadHelper<NeonSoftmaxFloatWorkload, NeonSoftmaxUint8Workload>(
467  descriptor, info, m_MemoryManager->GetIntraLayerManager());
468 }
469 
471  const WorkloadInfo& info) const
472 {
473  return std::make_unique<NeonSpaceToBatchNdWorkload>(descriptor, info);
474 }
475 
476 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
477  const WorkloadInfo& info) const
478 {
479  return std::make_unique<NeonSpaceToDepthWorkload>(descriptor, info);
480 }
481 
482 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
483  const WorkloadInfo& info) const
484 {
485  return std::make_unique<NeonSplitterWorkload>(descriptor, info);
486 }
487 
488 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
489  const WorkloadInfo& info) const
490 {
491  return std::make_unique<NeonStackWorkload>(descriptor, info);
492 }
493 
494 std::unique_ptr<IWorkload> NeonWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
495  const WorkloadInfo& info) const
496 {
497  return std::make_unique<NeonStridedSliceWorkload>(descriptor, info);
498 }
499 
500 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateSubtraction(
501  const SubtractionQueueDescriptor& descriptor, const WorkloadInfo& info) const
502 {
503  return std::make_unique<NeonSubtractionWorkload>(descriptor, info);
504 }
505 
506 std::unique_ptr<armnn::IWorkload> NeonWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
507  const WorkloadInfo& info) const
508 {
509  return std::make_unique<NeonTransposeWorkload>(descriptor, info);
510 }
511 
513  const TransposeConvolution2dQueueDescriptor &descriptor,
514  const WorkloadInfo &info) const
515 {
516  return std::make_unique<NeonTransposeConvolution2dWorkload>(descriptor, info,
517  m_MemoryManager->GetIntraLayerManager());
518 }
519 
520 } // 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.
Definition: Descriptors.hpp:98
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:62
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 > 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
ComparisonOperation m_Operation
Specifies the comparison operation to execute.
Definition: Descriptors.hpp:78
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:82
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 > 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 > 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