ArmNN
 20.05
RefWorkloadFactory.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 #include <Layer.hpp>
10 #include "RefWorkloadFactory.hpp"
11 #include "RefBackendId.hpp"
13 #include "RefTensorHandle.hpp"
14 
15 
16 namespace armnn
17 {
18 
19 namespace
20 {
21 static const BackendId s_Id{RefBackendId()};
22 }
23 template <typename F32Workload, typename U8Workload, typename QueueDescriptorType>
24 std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(const QueueDescriptorType& descriptor,
25  const WorkloadInfo& info) const
26 {
27  return MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload, NullWorkload>
28  (descriptor, info);
29 }
30 
31 template <DataType ArmnnType>
33 {
34  auto checkType = [](const TensorInfo& tensorInfo) {return tensorInfo.GetDataType() == ArmnnType;};
35  auto it = std::find_if(std::begin(info.m_InputTensorInfos), std::end(info.m_InputTensorInfos), checkType);
36  if (it != std::end(info.m_InputTensorInfos))
37  {
38  return true;
39  }
40  it = std::find_if(std::begin(info.m_OutputTensorInfos), std::end(info.m_OutputTensorInfos), checkType);
41  if (it != std::end(info.m_OutputTensorInfos))
42  {
43  return true;
44  }
45  return false;
46 }
47 
49 {
50  return IsDataType<DataType::Signed32>(info);
51 }
52 
54 {
55  return IsDataType<DataType::BFloat16>(info);
56 }
57 
59 {
60  return IsDataType<DataType::Float16>(info);
61 }
62 
64 {
65  return IsDataType<DataType::QSymmS16>(info);
66 }
67 
69 {
70  return IsDataType<DataType::QSymmS8>(info);
71 }
72 
74 {
75  return IsDataType<DataType::QAsymmS8>(info);
76 }
77 
79 {
80  return IsDataType<DataType::QAsymmU8>(info);
81 }
82 
83 RefWorkloadFactory::RefWorkloadFactory(const std::shared_ptr<RefMemoryManager>& memoryManager)
84  : m_MemoryManager(memoryManager)
85 {
86 }
87 
89  : m_MemoryManager(new RefMemoryManager())
90 {
91 }
92 
94 {
95  return s_Id;
96 }
97 
99  Optional<DataType> dataType,
100  std::string& outReasonIfUnsupported)
101 {
102  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported);
103 }
104 
105 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
106  const bool isMemoryManaged) const
107 {
108  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
109  // to unmanaged memory. This also ensures memory alignment.
110  IgnoreUnused(isMemoryManaged);
111  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
112 }
113 
114 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
115  DataLayout dataLayout,
116  const bool isMemoryManaged) const
117 {
118  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
119  // to unmanaged memory. This also ensures memory alignment.
120  IgnoreUnused(isMemoryManaged, dataLayout);
121  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
122 }
123 
124 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
125  const WorkloadInfo& info) const
126 {
127  IgnoreUnused(descriptor);
128  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
129  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Abs;
130 
131  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
132 }
133 
134 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
135  const WorkloadInfo& info) const
136 {
137  return std::make_unique<RefActivationWorkload>(descriptor, info);
138 }
139 
140 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
141  const WorkloadInfo& info) const
142 {
143  return std::make_unique<RefAdditionWorkload>(descriptor, info);
144 }
145 
146 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
147  const WorkloadInfo& info) const
148 {
149  return std::make_unique<RefArgMinMaxWorkload>(descriptor, info);
150 }
151 
153  const BatchNormalizationQueueDescriptor& descriptor,
154  const WorkloadInfo& info) const
155 {
156  return std::make_unique<RefBatchNormalizationWorkload>(descriptor, info);
157 }
158 
159 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
160  const WorkloadInfo& info) const
161 {
162  return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor, info);
163 }
164 
165 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
166  const WorkloadInfo& info) const
167 {
168  return std::make_unique<RefComparisonWorkload>(descriptor, info);
169 }
170 
171 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
172  const WorkloadInfo& info) const
173 {
174  return std::make_unique<RefConcatWorkload>(descriptor, info);
175 }
176 
177 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
178  const WorkloadInfo& info) const
179 {
180  return std::make_unique<RefConstantWorkload>(descriptor, info);
181 }
182 
184  const ConvertBf16ToFp32QueueDescriptor& descriptor,
185  const WorkloadInfo& info) const
186 {
187  return std::make_unique<RefConvertBf16ToFp32Workload>(descriptor, info);
188 }
189 
191  const ConvertFp16ToFp32QueueDescriptor& descriptor,
192  const WorkloadInfo& info) const
193 {
194  return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor, info);
195 }
196 
198  const ConvertFp32ToBf16QueueDescriptor& descriptor,
199  const WorkloadInfo& info) const
200 {
201  return std::make_unique<RefConvertFp32ToBf16Workload>(descriptor, info);
202 }
203 
205  const ConvertFp32ToFp16QueueDescriptor& descriptor,
206  const WorkloadInfo& info) const
207 {
208  return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor, info);
209 }
210 
211 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
212  const WorkloadInfo& info) const
213 {
214  return std::make_unique<RefConvolution2dWorkload>(descriptor, info);
215 }
216 
217 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
218  const WorkloadInfo& info) const
219 {
220  if (IsBFloat16(info))
221  {
222  return std::make_unique<RefDebugBFloat16Workload>(descriptor, info);
223  }
224  if (IsFloat16(info))
225  {
226  return std::make_unique<RefDebugFloat16Workload>(descriptor, info);
227  }
228  if (IsQSymmS16(info))
229  {
230  return std::make_unique<RefDebugQSymmS16Workload>(descriptor, info);
231  }
232  if (IsQSymmS8(info))
233  {
234  return std::make_unique<RefDebugQSymmS8Workload>(descriptor, info);
235  }
236  if (IsQAsymmU8(info))
237  {
238  return std::make_unique<RefDebugQAsymmU8Workload>(descriptor, info);
239  }
240  if (IsQAsymmS8(info))
241  {
242  return std::make_unique<RefDebugQAsymmS8Workload>(descriptor, info);
243  }
244  if (IsSigned32(info))
245  {
246  return std::make_unique<RefDebugSigned32Workload>(descriptor, info);
247  }
248 
249  return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(descriptor, info);
250 }
251 
252 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
253  const WorkloadInfo& info) const
254 {
255  return std::make_unique<RefDepthToSpaceWorkload>(descriptor, info);
256 }
257 
259  const DepthwiseConvolution2dQueueDescriptor& descriptor,
260  const WorkloadInfo& info) const
261 {
262  return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor, info);
263 }
264 
265 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
266  const WorkloadInfo& info) const
267 {
268  return std::make_unique<RefDequantizeWorkload>(descriptor, info);
269 }
270 
272  const DetectionPostProcessQueueDescriptor& descriptor,
273  const WorkloadInfo& info) const
274 {
275  return std::make_unique<RefDetectionPostProcessWorkload>(descriptor, info);
276 }
277 
278 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
279  const WorkloadInfo& info) const
280 {
281  return std::make_unique<RefDivisionWorkload>(descriptor, info);
282 }
283 
285  const WorkloadInfo& info) const
286 {
287  return std::make_unique<RefElementwiseUnaryWorkload>(descriptor, info);
288 }
289 
290 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
291  const WorkloadInfo& info) const
292 {
293  IgnoreUnused(descriptor);
294  ComparisonQueueDescriptor comparisonDescriptor;
295  comparisonDescriptor.m_Parameters.m_Operation = ComparisonOperation::Equal;
296 
297  return CreateComparison(comparisonDescriptor, info);
298 }
299 
301  const FakeQuantizationQueueDescriptor& descriptor,
302  const WorkloadInfo& info) const
303 {
304  return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info);
305 }
306 
307 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
308  const WorkloadInfo& info) const
309 {
310  return std::make_unique<RefFloorWorkload>(descriptor, info);
311 }
312 
313 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFullyConnected(
314  const FullyConnectedQueueDescriptor& descriptor,
315  const WorkloadInfo& info) const
316 {
317  return std::make_unique<RefFullyConnectedWorkload>(descriptor, info);
318 }
319 
320 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGather(const GatherQueueDescriptor& descriptor,
321  const WorkloadInfo& info) const
322 {
323  return std::make_unique<RefGatherWorkload>(descriptor, info);
324 }
325 
326 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
327  const WorkloadInfo& info) const
328 {
329  IgnoreUnused(descriptor);
330  ComparisonQueueDescriptor comparisonDescriptor;
332 
333  return CreateComparison(comparisonDescriptor, info);
334 }
335 
336 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
337  const WorkloadInfo& info) const
338 {
339  if (info.m_InputTensorInfos.empty() )
340  {
341  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Input cannot be zero length");
342  }
343  if (info.m_OutputTensorInfos.empty())
344  {
345  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Output cannot be zero length");
346  }
347 
348  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
349  {
350  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: data input and output differ in byte count.");
351  }
352 
353  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
354 }
355 
357  const InstanceNormalizationQueueDescriptor& descriptor,
358  const WorkloadInfo& info) const
359 {
360  return std::make_unique<RefInstanceNormalizationWorkload>(descriptor, info);
361 }
362 
364  const WorkloadInfo& info) const
365 {
366  return std::make_unique<RefL2NormalizationWorkload>(descriptor, info);
367 }
368 
369 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
370  const WorkloadInfo& info) const
371 {
372  return std::make_unique<RefLogSoftmaxWorkload>(descriptor, info);
373 }
374 
375 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
376  const WorkloadInfo& info) const
377 {
378  return std::make_unique<RefLstmWorkload>(descriptor, info);
379 }
380 
381 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
382  const WorkloadInfo& info) const
383 {
384  return std::make_unique<RefMaximumWorkload>(descriptor, info);
385 }
386 
387 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
388  const WorkloadInfo& info) const
389 {
390  return std::make_unique<RefMeanWorkload>(descriptor, info);
391 }
392 
393 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
394  const WorkloadInfo& info) const
395 {
396  if (descriptor.m_Inputs.empty())
397  {
398  throw InvalidArgumentException("RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
399  }
400  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
401 }
402 
403 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
404  const WorkloadInfo& info) const
405 {
406  if (descriptor.m_Inputs.empty())
407  {
408  throw InvalidArgumentException("RefWorkloadFactory: CreateMemImport() expected an input tensor.");
409  }
410  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
411 }
412 
413 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
414  const WorkloadInfo& info) const
415 {
416  return CreateConcat(descriptor, info);
417 }
418 
419 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
420  const WorkloadInfo& info) const
421 {
422  return std::make_unique<RefMinimumWorkload>(descriptor, info);
423 }
424 
425 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
426  const WorkloadInfo& info) const
427 {
428  return std::make_unique<RefMultiplicationWorkload>(descriptor, info);
429 }
430 
431 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
432  const WorkloadInfo& info) const
433 {
434  return std::make_unique<RefNormalizationWorkload>(descriptor, info);
435 }
436 
437 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
438  const WorkloadInfo& info) const
439 {
440  if (info.m_InputTensorInfos.empty() )
441  {
442  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Input cannot be zero length");
443  }
444  if (info.m_OutputTensorInfos.empty())
445  {
446  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Output cannot be zero length");
447  }
448  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
449  {
450  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: data input and output differ in byte count.");
451  }
452 
453  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
454 }
455 
456 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
457  const WorkloadInfo& info) const
458 {
459  if (IsQSymmS16(info))
460  {
461  return std::make_unique<RefPadQSymm16Workload>(descriptor, info);
462  }
463  else if (IsFloat16(info))
464  {
465  return std::make_unique<RefPadFloat16Workload>(descriptor, info);
466  }
467  else if (IsBFloat16(info))
468  {
469  return std::make_unique<RefPadBFloat16Workload>(descriptor, info);
470  }
471  else if (IsQAsymmS8(info))
472  {
473  return std::make_unique<RefPadQAsymmS8Workload>(descriptor, info);
474  }
475  return MakeWorkload<RefPadFloat32Workload, RefPadQAsymm8Workload>(descriptor, info);
476 }
477 
478 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
479  const WorkloadInfo& info) const
480 {
481  if (IsQSymmS16(info))
482  {
483  return std::make_unique<RefPermuteQSymm16Workload>(descriptor, info);
484  }
485  else if (IsBFloat16(info))
486  {
487  return std::make_unique<RefPermuteBFloat16Workload>(descriptor, info);
488  }
489  else if (IsQAsymmS8(info))
490  {
491  return std::make_unique<RefPermuteQAsymmS8Workload>(descriptor, info);
492  }
494  NullWorkload, NullWorkload, NullWorkload>(descriptor, info);
495 }
496 
497 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
498  const WorkloadInfo& info) const
499 {
500  return std::make_unique<RefPooling2dWorkload>(descriptor, info);
501 }
502 
503 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& /*descriptor*/,
504  const WorkloadInfo& /*info*/) const
505 {
506  return nullptr;
507 }
508 
509 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(const PreluQueueDescriptor& descriptor,
510  const WorkloadInfo& info) const
511 {
512  return std::make_unique<RefPreluWorkload>(descriptor, info);
513 }
514 
515 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
516  const WorkloadInfo& info) const
517 {
518  return std::make_unique<RefQLstmWorkload>(descriptor, info);
519 }
520 
521 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
522  const WorkloadInfo& info) const
523 {
524  return std::make_unique<RefQuantizeWorkload>(descriptor, info);
525 }
526 
527 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
528  const WorkloadInfo& info) const
529 {
530  return std::make_unique<RefReshapeWorkload>(descriptor, info);
531 }
532 
533 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
534  const WorkloadInfo& info) const
535 {
536  return std::make_unique<RefResizeWorkload>(descriptor, info);
537 }
538 
539 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
540  const WorkloadInfo& info) const
541 {
542  ResizeQueueDescriptor resizeDescriptor;
543  resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
544  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
545  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
546  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
547 
548  return CreateResize(resizeDescriptor, info);
549 }
550 
551 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
552  const WorkloadInfo& info) const
553 {
554  IgnoreUnused(descriptor);
555  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
556  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Rsqrt;
557 
558  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
559 }
560 
561 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
562  const WorkloadInfo& info) const
563 {
564  return std::make_unique<RefSliceWorkload>(descriptor, info);
565 }
566 
567 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
568  const WorkloadInfo& info) const
569 {
570  return std::make_unique<RefSoftmaxWorkload>(descriptor, info);
571 }
572 
573 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
574  const WorkloadInfo& info) const
575 {
576  return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor, info);
577 }
578 
579 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
580  const WorkloadInfo& info) const
581 {
582  return std::make_unique<RefSpaceToDepthWorkload>(descriptor, info);
583 }
584 
585 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
586  const WorkloadInfo& info) const
587 {
588  return std::make_unique<RefSplitterWorkload>(descriptor, info);
589 }
590 
591 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
592  const WorkloadInfo& info) const
593 {
594  return std::make_unique<RefStackWorkload>(descriptor, info);
595 }
596 
597 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
598  const WorkloadInfo& info) const
599 {
600  return std::make_unique<RefStridedSliceWorkload>(descriptor, info);
601 }
602 
603 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
604  const WorkloadInfo& info) const
605 {
606  return std::make_unique<RefSubtractionWorkload>(descriptor, info);
607 }
608 
609 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
610  const WorkloadInfo& info) const
611 {
612  if (IsQSymmS16(info))
613  {
614  return std::make_unique<RefTransposeQSymm16Workload>(descriptor, info);
615  }
616  else if (IsBFloat16(info))
617  {
618  return std::make_unique<RefTransposeBFloat16Workload>(descriptor, info);
619  }
620  else if (IsQAsymmS8(info))
621  {
622  return std::make_unique<RefTransposeQAsymmS8Workload>(descriptor, info);
623  }
625  NullWorkload, NullWorkload, NullWorkload>(descriptor, info);
626 }
627 
629  const TransposeConvolution2dQueueDescriptor& descriptor,
630  const WorkloadInfo& info) const
631 {
632  return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor, info);
633 }
634 
635 } // namespace armnn
std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFakeQuantization(const FakeQuantizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInput(const InputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &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 > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
constexpr const char * RefBackendId()
std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ResizeMethod m_Method
The Interpolation method to use (Bilinear, NearestNeighbor).
std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::Float16 > RefPermuteFloat16Workload
RefTransposeWorkload< DataType::Float16 > RefTransposeFloat16Workload
std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQAsymmS8(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefPermuteWorkload< DataType::Float32 > RefPermuteFloat32Workload
std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const override
Copyright (c) 2020 ARM Limited.
void IgnoreUnused(Ts &&...)
bool IsQAsymmU8(const WorkloadInfo &info)
bool IsQSymmS8(const WorkloadInfo &info)
bool IsDataType(const WorkloadInfo &info)
bool IsBFloat16(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const override
const BackendId & GetBackendId() const override
std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< TensorInfo > m_InputTensorInfos
bool IsFloat16(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
RefTransposeWorkload< DataType::Float32 > RefTransposeFloat32Workload
RefTransposeWorkload< DataType::QAsymmU8 > RefTransposeQAsymm8Workload
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetWidth
Target width value.
bool IsSigned32(const WorkloadInfo &info)
std::vector< TensorInfo > m_OutputTensorInfos
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
uint32_t m_TargetHeight
Target height value.
uint32_t m_TargetHeight
Target height value.
std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) 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 > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const override
ComparisonOperation m_Operation
Specifies the comparison operation to execute.
Definition: Descriptors.hpp:86
std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
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 > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override
std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const override
Contains information about inputs and outputs to a layer.
std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::vector< ITensorHandle * > m_Inputs
RefPermuteWorkload< DataType::QAsymmU8 > RefPermuteQAsymm8Workload
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const override
bool IsQSymmS16(const WorkloadInfo &info)
std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const override
std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const override