ArmNN
 21.08
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 
106  Optional<DataType> dataType,
107  std::string& outReasonIfUnsupported,
108  const ModelOptions& modelOptions)
109 {
110  return IWorkloadFactory::IsLayerSupported(s_Id, layer, dataType, outReasonIfUnsupported, modelOptions);
111 }
112 
113 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
114  const bool isMemoryManaged) const
115 {
116  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
117  // to unmanaged memory. This also ensures memory alignment.
118  IgnoreUnused(isMemoryManaged);
119  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
120 }
121 
122 std::unique_ptr<ITensorHandle> RefWorkloadFactory::CreateTensorHandle(const TensorInfo& tensorInfo,
123  DataLayout dataLayout,
124  const bool isMemoryManaged) const
125 {
126  // For Ref it is okay to make the TensorHandle memory managed as it can also store a pointer
127  // to unmanaged memory. This also ensures memory alignment.
128  IgnoreUnused(isMemoryManaged, dataLayout);
129  return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
130 }
131 
132 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAbs(const AbsQueueDescriptor& descriptor,
133  const WorkloadInfo& info) const
134 {
135  IgnoreUnused(descriptor);
136  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
137  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Abs;
138 
139  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
140 }
141 
142 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateActivation(const ActivationQueueDescriptor& descriptor,
143  const WorkloadInfo& info) const
144 {
145  return std::make_unique<RefActivationWorkload>(descriptor, info);
146 }
147 
148 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateAddition(const AdditionQueueDescriptor& descriptor,
149  const WorkloadInfo& info) const
150 {
151  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
152  {
153  return std::make_unique<RefAdditionWorkload<int32_t>>(descriptor, info);
154  }
155  else
156  {
157  return std::make_unique<RefAdditionWorkload<float>>(descriptor, info);
158  }
159 }
160 
161 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateArgMinMax(const ArgMinMaxQueueDescriptor& descriptor,
162  const WorkloadInfo& info) const
163 {
164  return std::make_unique<RefArgMinMaxWorkload>(descriptor, info);
165 }
166 
168  const BatchNormalizationQueueDescriptor& descriptor,
169  const WorkloadInfo& info) const
170 {
171  return std::make_unique<RefBatchNormalizationWorkload>(descriptor, info);
172 }
173 
174 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor& descriptor,
175  const WorkloadInfo& info) const
176 {
177  return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor, info);
178 }
179 
180 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateCast(const CastQueueDescriptor& descriptor,
181  const WorkloadInfo& info) const
182 {
183  return std::make_unique<RefCastWorkload>(descriptor, info);
184 }
185 
186 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateComparison(const ComparisonQueueDescriptor& descriptor,
187  const WorkloadInfo& info) const
188 {
189  return std::make_unique<RefComparisonWorkload>(descriptor, info);
190 }
191 
192 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConcat(const ConcatQueueDescriptor& descriptor,
193  const WorkloadInfo& info) const
194 {
195  return std::make_unique<RefConcatWorkload>(descriptor, info);
196 }
197 
198 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConstant(const ConstantQueueDescriptor& descriptor,
199  const WorkloadInfo& info) const
200 {
201  return std::make_unique<RefConstantWorkload>(descriptor, info);
202 }
203 
205  const ConvertBf16ToFp32QueueDescriptor& descriptor,
206  const WorkloadInfo& info) const
207 {
208  return std::make_unique<RefConvertBf16ToFp32Workload>(descriptor, info);
209 }
210 
212  const ConvertFp16ToFp32QueueDescriptor& descriptor,
213  const WorkloadInfo& info) const
214 {
215  return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor, info);
216 }
217 
219  const ConvertFp32ToBf16QueueDescriptor& descriptor,
220  const WorkloadInfo& info) const
221 {
222  return std::make_unique<RefConvertFp32ToBf16Workload>(descriptor, info);
223 }
224 
226  const ConvertFp32ToFp16QueueDescriptor& descriptor,
227  const WorkloadInfo& info) const
228 {
229  return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor, info);
230 }
231 
232 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvolution2d(const Convolution2dQueueDescriptor& descriptor,
233  const WorkloadInfo& info) const
234 {
235  return std::make_unique<RefConvolution2dWorkload>(descriptor, info);
236 }
237 
238 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(const DebugQueueDescriptor& descriptor,
239  const WorkloadInfo& info) const
240 {
241  if (IsBFloat16(info))
242  {
243  return std::make_unique<RefDebugBFloat16Workload>(descriptor, info);
244  }
245  if (IsFloat16(info))
246  {
247  return std::make_unique<RefDebugFloat16Workload>(descriptor, info);
248  }
249  if (IsQSymmS16(info))
250  {
251  return std::make_unique<RefDebugQSymmS16Workload>(descriptor, info);
252  }
253  if (IsQSymmS8(info))
254  {
255  return std::make_unique<RefDebugQSymmS8Workload>(descriptor, info);
256  }
257  if (IsQAsymmU8(info))
258  {
259  return std::make_unique<RefDebugQAsymmU8Workload>(descriptor, info);
260  }
261  if (IsQAsymmS8(info))
262  {
263  return std::make_unique<RefDebugQAsymmS8Workload>(descriptor, info);
264  }
265  if (IsSigned32(info))
266  {
267  return std::make_unique<RefDebugSigned32Workload>(descriptor, info);
268  }
269 
270  return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(descriptor, info);
271 }
272 
273 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDepthToSpace(const DepthToSpaceQueueDescriptor& descriptor,
274  const WorkloadInfo& info) const
275 {
276  return std::make_unique<RefDepthToSpaceWorkload>(descriptor, info);
277 }
278 
280  const DepthwiseConvolution2dQueueDescriptor& descriptor,
281  const WorkloadInfo& info) const
282 {
283  return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor, info);
284 }
285 
286 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDequantize(const DequantizeQueueDescriptor& descriptor,
287  const WorkloadInfo& info) const
288 {
289  return std::make_unique<RefDequantizeWorkload>(descriptor, info);
290 }
291 
293  const DetectionPostProcessQueueDescriptor& descriptor,
294  const WorkloadInfo& info) const
295 {
296  return std::make_unique<RefDetectionPostProcessWorkload>(descriptor, info);
297 }
298 
299 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDivision(const DivisionQueueDescriptor& descriptor,
300  const WorkloadInfo& info) const
301 {
302  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
303  {
304  return std::make_unique<RefDivisionWorkload<int32_t>>(descriptor, info);
305  }
306  else
307  {
308  return std::make_unique<RefDivisionWorkload<float>>(descriptor, info);
309  }
310 }
311 
313  const WorkloadInfo& info) const
314 {
316  {
317  return std::make_unique<RefLogicalUnaryWorkload>(descriptor, info);
318  }
319  return std::make_unique<RefElementwiseUnaryWorkload>(descriptor, info);
320 }
321 
322 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateEqual(const EqualQueueDescriptor& descriptor,
323  const WorkloadInfo& info) const
324 {
325  IgnoreUnused(descriptor);
326  ComparisonQueueDescriptor comparisonDescriptor;
327  comparisonDescriptor.m_Parameters.m_Operation = ComparisonOperation::Equal;
328 
329  return CreateComparison(comparisonDescriptor, info);
330 }
331 
333  const WorkloadInfo& info) const
334 {
335  return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor, info);
336 }
337 
338 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFill(const FillQueueDescriptor& descriptor,
339  const WorkloadInfo& info) const
340 {
341  return std::make_unique<RefFillWorkload>(descriptor, info);
342 }
343 
344 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(const FloorQueueDescriptor& descriptor,
345  const WorkloadInfo& info) const
346 {
347  if(IsQuantizedType(info.m_InputTensorInfos[0].GetDataType()))
348  {
349  return nullptr;
350  }
351  else
352  {
353  return std::make_unique<RefFloorWorkload>(descriptor, info);
354  }
355 }
356 
357 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFullyConnected(
358  const FullyConnectedQueueDescriptor& descriptor,
359  const WorkloadInfo& info) const
360 {
361  return std::make_unique<RefFullyConnectedWorkload>(descriptor, info);
362 }
363 
364 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGather(const GatherQueueDescriptor& descriptor,
365  const WorkloadInfo& info) const
366 {
367  return std::make_unique<RefGatherWorkload>(descriptor, info);
368 }
369 
370 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateGreater(const GreaterQueueDescriptor& descriptor,
371  const WorkloadInfo& info) const
372 {
373  IgnoreUnused(descriptor);
374  ComparisonQueueDescriptor comparisonDescriptor;
376 
377  return CreateComparison(comparisonDescriptor, info);
378 }
379 
380 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(const InputQueueDescriptor& descriptor,
381  const WorkloadInfo& info) const
382 {
383  if (info.m_InputTensorInfos.empty() )
384  {
385  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Input cannot be zero length");
386  }
387  if (info.m_OutputTensorInfos.empty())
388  {
389  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: Output cannot be zero length");
390  }
391 
392  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
393  {
394  throw InvalidArgumentException("RefWorkloadFactory::CreateInput: data input and output differ in byte count.");
395  }
396 
397  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
398 }
399 
401  const InstanceNormalizationQueueDescriptor& descriptor,
402  const WorkloadInfo& info) const
403 {
404  return std::make_unique<RefInstanceNormalizationWorkload>(descriptor, info);
405 }
406 
408  const WorkloadInfo& info) const
409 {
410  return std::make_unique<RefL2NormalizationWorkload>(descriptor, info);
411 }
412 
413 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLogicalBinary(const LogicalBinaryQueueDescriptor& descriptor,
414  const WorkloadInfo& info) const
415 {
416  return std::make_unique<RefLogicalBinaryWorkload>(descriptor, info);
417 }
418 
419 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLogSoftmax(const LogSoftmaxQueueDescriptor& descriptor,
420  const WorkloadInfo& info) const
421 {
422  return std::make_unique<RefLogSoftmaxWorkload>(descriptor, info);
423 }
424 
425 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(const LstmQueueDescriptor& descriptor,
426  const WorkloadInfo& info) const
427 {
428  return std::make_unique<RefLstmWorkload>(descriptor, info);
429 }
430 
431 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMaximum(const MaximumQueueDescriptor& descriptor,
432  const WorkloadInfo& info) const
433 {
434  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
435  {
436  return std::make_unique<RefMaximumWorkload<int32_t>>(descriptor, info);
437  }
438  else
439  {
440  return std::make_unique<RefMaximumWorkload<float>>(descriptor, info);
441  }
442 }
443 
444 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMean(const MeanQueueDescriptor& descriptor,
445  const WorkloadInfo& info) const
446 {
447  return std::make_unique<RefMeanWorkload>(descriptor, info);
448 }
449 
450 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemCopy(const MemCopyQueueDescriptor& descriptor,
451  const WorkloadInfo& info) const
452 {
453  if (descriptor.m_Inputs.empty())
454  {
455  throw InvalidArgumentException("RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
456  }
457  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
458 }
459 
460 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMemImport(const MemImportQueueDescriptor& descriptor,
461  const WorkloadInfo& info) const
462 {
463  if (descriptor.m_Inputs.empty())
464  {
465  throw InvalidArgumentException("RefWorkloadFactory: CreateMemImport() expected an input tensor.");
466  }
467  return std::make_unique<ImportMemGenericWorkload>(descriptor, info);
468 }
469 
470 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMerger(const MergerQueueDescriptor& descriptor,
471  const WorkloadInfo& info) const
472 {
473  return CreateConcat(descriptor, info);
474 }
475 
476 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMinimum(const MinimumQueueDescriptor& descriptor,
477  const WorkloadInfo& info) const
478 {
479  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
480  {
481  return std::make_unique<RefMinimumWorkload<int32_t>>(descriptor, info);
482  }
483  else
484  {
485  return std::make_unique<RefMinimumWorkload<float>>(descriptor, info);
486  }
487 }
488 
489 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMultiplication(const MultiplicationQueueDescriptor& descriptor,
490  const WorkloadInfo& info) const
491 {
492  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
493  {
494  return std::make_unique<RefMultiplicationWorkload<int32_t>>(descriptor, info);
495  }
496  else
497  {
498  return std::make_unique<RefMultiplicationWorkload<float>>(descriptor, info);
499  }
500 }
501 
502 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateNormalization(const NormalizationQueueDescriptor& descriptor,
503  const WorkloadInfo& info) const
504 {
505  return std::make_unique<RefNormalizationWorkload>(descriptor, info);
506 }
507 
508 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(const OutputQueueDescriptor& descriptor,
509  const WorkloadInfo& info) const
510 {
511  if (info.m_InputTensorInfos.empty() )
512  {
513  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Input cannot be zero length");
514  }
515  if (info.m_OutputTensorInfos.empty())
516  {
517  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: Output cannot be zero length");
518  }
519  if (info.m_InputTensorInfos[0].GetNumBytes() != info.m_OutputTensorInfos[0].GetNumBytes())
520  {
521  throw InvalidArgumentException("RefWorkloadFactory::CreateOutput: data input and output differ in byte count.");
522  }
523 
524  return std::make_unique<CopyMemGenericWorkload>(descriptor, info);
525 }
526 
527 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(const PadQueueDescriptor& descriptor,
528  const WorkloadInfo& info) const
529 {
530  return std::make_unique<RefPadWorkload>(descriptor, info);
531 }
532 
533 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePermute(const PermuteQueueDescriptor& descriptor,
534  const WorkloadInfo& info) const
535 {
536  if (IsQSymmS16(info))
537  {
538  return std::make_unique<RefPermuteQSymm16Workload>(descriptor, info);
539  }
540  else if (IsBFloat16(info))
541  {
542  return std::make_unique<RefPermuteBFloat16Workload>(descriptor, info);
543  }
544  else if (IsQAsymmS8(info))
545  {
546  return std::make_unique<RefPermuteQAsymmS8Workload>(descriptor, info);
547  }
549  NullWorkload, NullWorkload, NullWorkload>(descriptor, info);
550 }
551 
552 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePooling2d(const Pooling2dQueueDescriptor& descriptor,
553  const WorkloadInfo& info) const
554 {
555  return std::make_unique<RefPooling2dWorkload>(descriptor, info);
556 }
557 
558 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePreCompiled(const PreCompiledQueueDescriptor& /*descriptor*/,
559  const WorkloadInfo& /*info*/) const
560 {
561  return nullptr;
562 }
563 
564 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(const PreluQueueDescriptor& descriptor,
565  const WorkloadInfo& info) const
566 {
567  return std::make_unique<RefPreluWorkload>(descriptor, info);
568 }
569 
570 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQLstm(const QLstmQueueDescriptor& descriptor,
571  const WorkloadInfo& info) const
572 {
573  return std::make_unique<RefQLstmWorkload>(descriptor, info);
574 }
575 
576 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQuantize(const QuantizeQueueDescriptor& descriptor,
577  const WorkloadInfo& info) const
578 {
579  return std::make_unique<RefQuantizeWorkload>(descriptor, info);
580 }
581 
582 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRank(const RankQueueDescriptor& descriptor,
583  const WorkloadInfo& info) const
584 {
585  return std::make_unique<RefRankWorkload>(descriptor, info);
586 }
587 
588 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReduce(const ReduceQueueDescriptor& descriptor,
589  const WorkloadInfo& info) const
590 {
591  return std::make_unique<RefReduceWorkload>(descriptor, info);
592 }
593 
594 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReshape(const ReshapeQueueDescriptor& descriptor,
595  const WorkloadInfo& info) const
596 {
597  return std::make_unique<RefReshapeWorkload>(descriptor, info);
598 }
599 
600 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(const ResizeQueueDescriptor& descriptor,
601  const WorkloadInfo& info) const
602 {
603  return std::make_unique<RefResizeWorkload>(descriptor, info);
604 }
605 
606 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResizeBilinear(const ResizeBilinearQueueDescriptor& descriptor,
607  const WorkloadInfo& info) const
608 {
609  ResizeQueueDescriptor resizeDescriptor;
610  resizeDescriptor.m_Parameters.m_Method = ResizeMethod::Bilinear;
611  resizeDescriptor.m_Parameters.m_DataLayout = descriptor.m_Parameters.m_DataLayout;
612  resizeDescriptor.m_Parameters.m_TargetWidth = descriptor.m_Parameters.m_TargetWidth;
613  resizeDescriptor.m_Parameters.m_TargetHeight = descriptor.m_Parameters.m_TargetHeight;
614 
615  return CreateResize(resizeDescriptor, info);
616 }
617 
618 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRsqrt(const RsqrtQueueDescriptor& descriptor,
619  const WorkloadInfo& info) const
620 {
621  IgnoreUnused(descriptor);
622  ElementwiseUnaryQueueDescriptor elementwiseUnaryDescriptor;
623  elementwiseUnaryDescriptor.m_Parameters.m_Operation = UnaryOperation::Rsqrt;
624 
625  return CreateElementwiseUnary(elementwiseUnaryDescriptor, info);
626 }
627 
628 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateShape(const ShapeQueueDescriptor& descriptor,
629  const WorkloadInfo& info) const
630 {
631  return std::make_unique<RefShapeWorkload>(descriptor, info);
632 }
633 
634 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSlice(const SliceQueueDescriptor& descriptor,
635  const WorkloadInfo& info) const
636 {
637  return std::make_unique<RefSliceWorkload>(descriptor, info);
638 }
639 
640 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSoftmax(const SoftmaxQueueDescriptor& descriptor,
641  const WorkloadInfo& info) const
642 {
643  return std::make_unique<RefSoftmaxWorkload>(descriptor, info);
644 }
645 
646 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor& descriptor,
647  const WorkloadInfo& info) const
648 {
649  return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor, info);
650 }
651 
652 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSpaceToDepth(const SpaceToDepthQueueDescriptor& descriptor,
653  const WorkloadInfo& info) const
654 {
655  return std::make_unique<RefSpaceToDepthWorkload>(descriptor, info);
656 }
657 
658 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSplitter(const SplitterQueueDescriptor& descriptor,
659  const WorkloadInfo& info) const
660 {
661  return std::make_unique<RefSplitterWorkload>(descriptor, info);
662 }
663 
664 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStack(const StackQueueDescriptor& descriptor,
665  const WorkloadInfo& info) const
666 {
667  return std::make_unique<RefStackWorkload>(descriptor, info);
668 }
669 
670 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStridedSlice(const StridedSliceQueueDescriptor& descriptor,
671  const WorkloadInfo& info) const
672 {
673  return std::make_unique<RefStridedSliceWorkload>(descriptor, info);
674 }
675 
676 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSubtraction(const SubtractionQueueDescriptor& descriptor,
677  const WorkloadInfo& info) const
678 {
679  if (info.m_InputTensorInfos[0].GetDataType() == armnn::DataType::Signed32)
680  {
681  return std::make_unique<RefSubtractionWorkload<int32_t>>(descriptor, info);
682  }
683  else
684  {
685  return std::make_unique<RefSubtractionWorkload<float>>(descriptor, info);
686  }
687 }
688 
689 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateTranspose(const TransposeQueueDescriptor& descriptor,
690  const WorkloadInfo& info) const
691 {
692  if (IsQSymmS16(info))
693  {
694  return std::make_unique<RefTransposeQSymm16Workload>(descriptor, info);
695  }
696  else if (IsBFloat16(info))
697  {
698  return std::make_unique<RefTransposeBFloat16Workload>(descriptor, info);
699  }
700  else if (IsQAsymmS8(info))
701  {
702  return std::make_unique<RefTransposeQAsymmS8Workload>(descriptor, info);
703  }
705  NullWorkload, NullWorkload, NullWorkload>(descriptor, info);
706 }
707 
709  const TransposeConvolution2dQueueDescriptor& descriptor,
710  const WorkloadInfo& info) const
711 {
712  return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor, info);
713 }
714 
717  const WorkloadInfo& info) const
718 {
719  return std::make_unique<RefUnidirectionalSequenceLstmWorkload>(descriptor, info);;
720 }
721 
722 } // 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
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
Definition: INetwork.hpp:61
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:53
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 > CreateUnidirectionalSequenceLstm(const UnidirectionalSequenceLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const override
constexpr bool IsQuantizedType()
Definition: TypesUtils.hpp:262
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::vector< BackendOptions > ModelOptions
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) 2021 ARM Limited and Contributors.
std::unique_ptr< IWorkload > CreateRank(const RankQueueDescriptor &descriptor, const WorkloadInfo &info) const override
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
std::unique_ptr< IWorkload > CreateFill(const FillQueueDescriptor &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
std::unique_ptr< IWorkload > CreateReduce(const ReduceQueueDescriptor &descriptor, const WorkloadInfo &info) const override
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:94
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 > CreateShape(const ShapeQueueDescriptor &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 > CreateLogicalBinary(const LogicalBinaryQueueDescriptor &descriptor, const WorkloadInfo &info) 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 TensorInfos of 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::unique_ptr< IWorkload > CreateCast(const CastQueueDescriptor &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
Depthwise Convolution 2D layer workload data.
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