23 template <
typename F32Workload,
typename U8Workload,
typename QueueDescriptorType>
24 std::unique_ptr<IWorkload> RefWorkloadFactory::MakeWorkload(
const QueueDescriptorType& descriptor,
25 const WorkloadInfo& info)
const 27 return MakeWorkloadHelper<NullWorkload, F32Workload, U8Workload, NullWorkload, NullWorkload, NullWorkload>
31 template <DataType ArmnnType>
34 auto checkType = [](
const TensorInfo& tensorInfo) {
return tensorInfo.GetDataType() == ArmnnType;};
50 return IsDataType<DataType::Signed32>(
info);
55 return IsDataType<DataType::BFloat16>(
info);
60 return IsDataType<DataType::Float16>(
info);
65 return IsDataType<DataType::QSymmS16>(
info);
70 return IsDataType<DataType::QSymmS8>(
info);
75 return IsDataType<DataType::QAsymmS8>(
info);
80 return IsDataType<DataType::QAsymmU8>(
info);
84 : m_MemoryManager(memoryManager)
100 std::string& outReasonIfUnsupported)
107 std::string& outReasonIfUnsupported,
114 const bool isMemoryManaged)
const 118 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
122 return std::make_unique<RefTensorHandle>(tensorInfo,
static_cast<unsigned int>(
MemorySource::Malloc));
128 const bool isMemoryManaged)
const 136 return std::make_unique<RefTensorHandle>(tensorInfo, m_MemoryManager);
140 return std::make_unique<RefTensorHandle>(tensorInfo,
static_cast<unsigned int>(
MemorySource::Malloc));
152 auto activationQueueDescriptor = PolymorphicDowncast<const ActivationQueueDescriptor*>(&descriptor);
153 return std::make_unique<RefActivationWorkload>(*activationQueueDescriptor,
info);
157 auto additionQueueDescriptor = PolymorphicDowncast<const AdditionQueueDescriptor*>(&descriptor);
161 return std::make_unique<RefAdditionWorkload<int32_t>>(*additionQueueDescriptor,
info);
165 return std::make_unique<RefAdditionWorkload<float>>(*additionQueueDescriptor,
info);
170 auto argMinMaxQueueDescriptor = PolymorphicDowncast<const ArgMinMaxQueueDescriptor*>(&descriptor);
171 return std::make_unique<RefArgMinMaxWorkload>(*argMinMaxQueueDescriptor,
info);
175 auto batchMatMulQueueDescriptor = PolymorphicDowncast<const BatchMatMulQueueDescriptor*>(&descriptor);
176 return std::make_unique<RefBatchMatMulWorkload>(*batchMatMulQueueDescriptor,
info);
180 auto batchNormQueueDescriptor = PolymorphicDowncast<const BatchNormalizationQueueDescriptor*>(&descriptor);
181 return std::make_unique<RefBatchNormalizationWorkload>(*batchNormQueueDescriptor,
info);
185 auto batchToSpaceNdQueueDescriptor
186 = PolymorphicDowncast<const BatchToSpaceNdQueueDescriptor*>(&descriptor);
187 return std::make_unique<RefBatchToSpaceNdWorkload>(*batchToSpaceNdQueueDescriptor,
info);
191 auto castQueueDescriptor = PolymorphicDowncast<const CastQueueDescriptor*>(&descriptor);
192 return std::make_unique<RefCastWorkload>(*castQueueDescriptor,
info);
196 auto channelShuffleQueueDescriptor
197 = PolymorphicDowncast<const ChannelShuffleQueueDescriptor*>(&descriptor);
198 return std::make_unique<RefChannelShuffleWorkload>(*channelShuffleQueueDescriptor,
info);
202 auto comparisonQueueDescriptor = PolymorphicDowncast<const ComparisonQueueDescriptor*>(&descriptor);
203 return std::make_unique<RefComparisonWorkload>(*comparisonQueueDescriptor,
info);
207 auto concatQueueDescriptor = PolymorphicDowncast<const ConcatQueueDescriptor*>(&descriptor);
208 return std::make_unique<RefConcatWorkload>(*concatQueueDescriptor,
info);
212 auto constantQueueDescriptor = PolymorphicDowncast<const ConstantQueueDescriptor*>(&descriptor);
213 return std::make_unique<RefConstantWorkload>(*constantQueueDescriptor,
info);
217 auto convertBf16ToFp32QueueDescriptor
218 = PolymorphicDowncast<const ConvertBf16ToFp32QueueDescriptor*>(&descriptor);
219 return std::make_unique<RefConvertBf16ToFp32Workload>(*convertBf16ToFp32QueueDescriptor,
info);
223 auto convertFp16ToFp32QueueDescriptor
224 = PolymorphicDowncast<const ConvertFp16ToFp32QueueDescriptor*>(&descriptor);
225 return std::make_unique<RefConvertFp16ToFp32Workload>(*convertFp16ToFp32QueueDescriptor,
info);
229 auto convertFp32ToBf16QueueDescriptor
230 = PolymorphicDowncast<const ConvertFp32ToBf16QueueDescriptor*>(&descriptor);
231 return std::make_unique<RefConvertFp32ToBf16Workload>(*convertFp32ToBf16QueueDescriptor,
info);
235 auto convertFp32ToFp16QueueDescriptor
236 = PolymorphicDowncast<const ConvertFp32ToFp16QueueDescriptor*>(&descriptor);
237 return std::make_unique<RefConvertFp32ToFp16Workload>(*convertFp32ToFp16QueueDescriptor,
info);
241 auto convolution2dQueueDescriptor = PolymorphicDowncast<const Convolution2dQueueDescriptor*>(&descriptor);
242 return std::make_unique<RefConvolution2dWorkload>(*convolution2dQueueDescriptor,
info);
246 auto convolution3dQueueDescriptor = PolymorphicDowncast<const Convolution3dQueueDescriptor*>(&descriptor);
247 return std::make_unique<RefConvolution3dWorkload>(*convolution3dQueueDescriptor,
info);
251 auto debugQueueDescriptor = PolymorphicDowncast<const DebugQueueDescriptor*>(&descriptor);
254 return std::make_unique<RefDebugBFloat16Workload>(*debugQueueDescriptor,
info);
258 return std::make_unique<RefDebugFloat16Workload>(*debugQueueDescriptor,
info);
262 return std::make_unique<RefDebugQSymmS16Workload>(*debugQueueDescriptor,
info);
266 return std::make_unique<RefDebugQSymmS8Workload>(*debugQueueDescriptor,
info);
270 return std::make_unique<RefDebugQAsymmU8Workload>(*debugQueueDescriptor,
info);
274 return std::make_unique<RefDebugQAsymmS8Workload>(*debugQueueDescriptor,
info);
278 return std::make_unique<RefDebugSigned32Workload>(*debugQueueDescriptor,
info);
281 return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(*debugQueueDescriptor,
info);
285 auto depthToSpaceQueueDescriptor = PolymorphicDowncast<const DepthToSpaceQueueDescriptor*>(&descriptor);
286 return std::make_unique<RefDepthToSpaceWorkload>(*depthToSpaceQueueDescriptor,
info);
290 auto depthwiseConvolution2DQueueDescriptor
291 = PolymorphicDowncast<const DepthwiseConvolution2dQueueDescriptor*>(&descriptor);
292 return std::make_unique<RefDepthwiseConvolution2dWorkload>(*depthwiseConvolution2DQueueDescriptor,
info);
296 auto dequantizeQueueDescriptor = PolymorphicDowncast<const DequantizeQueueDescriptor*>(&descriptor);
297 return std::make_unique<RefDequantizeWorkload>(*dequantizeQueueDescriptor,
info);
301 auto detectionPostProcessQueueDescriptor
302 = PolymorphicDowncast<const DetectionPostProcessQueueDescriptor*>(&descriptor);
303 return std::make_unique<RefDetectionPostProcessWorkload>(*detectionPostProcessQueueDescriptor,
info);
307 auto divisionQueueDescriptor = PolymorphicDowncast<const DivisionQueueDescriptor*>(&descriptor);
310 return std::make_unique<RefDivisionWorkload<int32_t>>(*divisionQueueDescriptor,
info);
314 return std::make_unique<RefDivisionWorkload<float>>(*divisionQueueDescriptor,
info);
319 auto elementwiseUnaryQueueDescriptor
320 = PolymorphicDowncast<const ElementwiseUnaryQueueDescriptor*>(&descriptor);
323 return std::make_unique<RefLogicalUnaryWorkload>(*elementwiseUnaryQueueDescriptor,
info);
325 return std::make_unique<RefElementwiseUnaryWorkload>(*elementwiseUnaryQueueDescriptor,
info);
329 auto fakeQuantizationQueueDescriptor
330 = PolymorphicDowncast<const FakeQuantizationQueueDescriptor*>(&descriptor);
331 return std::make_unique<RefFakeQuantizationFloat32Workload>(*fakeQuantizationQueueDescriptor,
info);
335 auto fillQueueDescriptor = PolymorphicDowncast<const FillQueueDescriptor*>(&descriptor);
336 return std::make_unique<RefFillWorkload>(*fillQueueDescriptor,
info);
340 auto floorQueueDescriptor = PolymorphicDowncast<const FloorQueueDescriptor*>(&descriptor);
347 return std::make_unique<RefFloorWorkload>(*floorQueueDescriptor,
info);
352 auto fullyConnectedQueueDescriptor
353 = PolymorphicDowncast<const FullyConnectedQueueDescriptor*>(&descriptor);
354 return std::make_unique<RefFullyConnectedWorkload>(*fullyConnectedQueueDescriptor,
info);
358 auto gatherQueueDescriptor = PolymorphicDowncast<const GatherQueueDescriptor*>(&descriptor);
359 return std::make_unique<RefGatherWorkload>(*gatherQueueDescriptor,
info);
363 auto gatherNdQueueDescriptor = PolymorphicDowncast<const GatherNdQueueDescriptor*>(&descriptor);
364 return std::make_unique<RefGatherNdWorkload>(*gatherNdQueueDescriptor,
info);
368 auto inputQueueDescriptor = PolymorphicDowncast<const InputQueueDescriptor*>(&descriptor);
381 "data input and output differ in byte count.");
384 return std::make_unique<CopyMemGenericWorkload>(*inputQueueDescriptor,
info);
388 auto instanceNormalizationQueueDescriptor
389 = PolymorphicDowncast<const InstanceNormalizationQueueDescriptor*>(&descriptor);
390 return std::make_unique<RefInstanceNormalizationWorkload>(*instanceNormalizationQueueDescriptor,
info);
394 auto l2NormalizationQueueDescriptor
395 = PolymorphicDowncast<const L2NormalizationQueueDescriptor*>(&descriptor);
396 return std::make_unique<RefL2NormalizationWorkload>(*l2NormalizationQueueDescriptor,
info);
400 auto logicalBinaryQueueDescriptor = PolymorphicDowncast<const LogicalBinaryQueueDescriptor*>(&descriptor);
401 return std::make_unique<RefLogicalBinaryWorkload>(*logicalBinaryQueueDescriptor,
info);
405 auto logSoftmaxQueueDescriptor = PolymorphicDowncast<const LogSoftmaxQueueDescriptor*>(&descriptor);
406 return std::make_unique<RefLogSoftmaxWorkload>(*logSoftmaxQueueDescriptor,
info);
410 auto lstmQueueDescriptor = PolymorphicDowncast<const LstmQueueDescriptor*>(&descriptor);
411 return std::make_unique<RefLstmWorkload>(*lstmQueueDescriptor,
info);
415 auto maximumQueueDescriptor = PolymorphicDowncast<const MaximumQueueDescriptor*>(&descriptor);
418 return std::make_unique<RefMaximumWorkload<int32_t>>(*maximumQueueDescriptor,
info);
422 return std::make_unique<RefMaximumWorkload<float>>(*maximumQueueDescriptor,
info);
427 auto meanQueueDescriptor = PolymorphicDowncast<const MeanQueueDescriptor*>(&descriptor);
428 return std::make_unique<RefMeanWorkload>(*meanQueueDescriptor,
info);
432 auto memCopyQueueDescriptor = PolymorphicDowncast<const MemCopyQueueDescriptor*>(&descriptor);
437 return std::make_unique<CopyMemGenericWorkload>(*memCopyQueueDescriptor,
info);
441 auto memImportQueueDescriptor = PolymorphicDowncast<const MemImportQueueDescriptor*>(&descriptor);
446 return std::make_unique<ImportMemGenericWorkload>(*memImportQueueDescriptor,
info);
450 auto minimumQueueDescriptor = PolymorphicDowncast<const MinimumQueueDescriptor*>(&descriptor);
453 return std::make_unique<RefMinimumWorkload<int32_t>>(*minimumQueueDescriptor,
info);
457 return std::make_unique<RefMinimumWorkload<float>>(*minimumQueueDescriptor,
info);
462 auto multiplicationQueueDescriptor
463 = PolymorphicDowncast<const MultiplicationQueueDescriptor*>(&descriptor);
466 return std::make_unique<RefMultiplicationWorkload<int32_t>>(*multiplicationQueueDescriptor,
info);
470 return std::make_unique<RefMultiplicationWorkload<float>>(*multiplicationQueueDescriptor,
info);
475 auto normalizationQueueDescriptor = PolymorphicDowncast<const NormalizationQueueDescriptor*>(&descriptor);
476 return std::make_unique<RefNormalizationWorkload>(*normalizationQueueDescriptor,
info);
480 auto outputQueueDescriptor = PolymorphicDowncast<const OutputQueueDescriptor*>(&descriptor);
492 "differ in byte count.");
495 return std::make_unique<CopyMemGenericWorkload>(*outputQueueDescriptor,
info);
499 auto padQueueDescriptor = PolymorphicDowncast<const PadQueueDescriptor*>(&descriptor);
500 return std::make_unique<RefPadWorkload>(*padQueueDescriptor,
info);
504 auto permuteQueueDescriptor = PolymorphicDowncast<const PermuteQueueDescriptor*>(&descriptor);
507 return std::make_unique<RefPermuteQSymm16Workload>(*permuteQueueDescriptor,
info);
511 return std::make_unique<RefPermuteBFloat16Workload>(*permuteQueueDescriptor,
info);
515 return std::make_unique<RefPermuteQAsymmS8Workload>(*permuteQueueDescriptor,
info);
522 auto pooling2dQueueDescriptor = PolymorphicDowncast<const Pooling2dQueueDescriptor*>(&descriptor);
523 return std::make_unique<RefPooling2dWorkload>(*pooling2dQueueDescriptor,
info);
527 auto pooling3dQueueDescriptor = PolymorphicDowncast<const Pooling3dQueueDescriptor*>(&descriptor);
528 return std::make_unique<RefPooling3dWorkload>(*pooling3dQueueDescriptor,
info);
536 auto preluQueueDescriptor = PolymorphicDowncast<const PreluQueueDescriptor*>(&descriptor);
537 return std::make_unique<RefPreluWorkload>(*preluQueueDescriptor,
info);
541 auto qlstmQueueDescriptor = PolymorphicDowncast<const QLstmQueueDescriptor*>(&descriptor);
542 return std::make_unique<RefQLstmWorkload>(*qlstmQueueDescriptor,
info);
546 auto quantizeQueueDescriptor = PolymorphicDowncast<const QuantizeQueueDescriptor*>(&descriptor);
547 return std::make_unique<RefQuantizeWorkload>(*quantizeQueueDescriptor,
info);
551 auto rankQueueDescriptor = PolymorphicDowncast<const RankQueueDescriptor*>(&descriptor);
552 return std::make_unique<RefRankWorkload>(*rankQueueDescriptor,
info);
556 auto reduceQueueDescriptor = PolymorphicDowncast<const ReduceQueueDescriptor*>(&descriptor);
557 return std::make_unique<RefReduceWorkload>(*reduceQueueDescriptor,
info);
561 auto reshapeQueueDescriptor = PolymorphicDowncast<const ReshapeQueueDescriptor*>(&descriptor);
562 return std::make_unique<RefReshapeWorkload>(*reshapeQueueDescriptor,
info);
566 auto resizeQueueDescriptor = PolymorphicDowncast<const ResizeQueueDescriptor*>(&descriptor);
567 return std::make_unique<RefResizeWorkload>(*resizeQueueDescriptor,
info);
571 auto shapeQueueDescriptor = PolymorphicDowncast<const ShapeQueueDescriptor*>(&descriptor);
572 return std::make_unique<RefShapeWorkload>(*shapeQueueDescriptor,
info);
576 auto sliceQueueDescriptor = PolymorphicDowncast<const SliceQueueDescriptor*>(&descriptor);
577 return std::make_unique<RefSliceWorkload>(*sliceQueueDescriptor,
info);
581 auto softmaxQueueDescriptor = PolymorphicDowncast<const SoftmaxQueueDescriptor*>(&descriptor);
582 return std::make_unique<RefSoftmaxWorkload>(*softmaxQueueDescriptor,
info);
586 auto spaceToBatchNdQueueDescriptor
587 = PolymorphicDowncast<const SpaceToBatchNdQueueDescriptor*>(&descriptor);
588 return std::make_unique<RefSpaceToBatchNdWorkload>(*spaceToBatchNdQueueDescriptor,
info);
592 auto spaceToDepthQueueDescriptor = PolymorphicDowncast<const SpaceToDepthQueueDescriptor*>(&descriptor);
593 return std::make_unique<RefSpaceToDepthWorkload>(*spaceToDepthQueueDescriptor,
info);
597 auto splitterQueueDescriptor = PolymorphicDowncast<const SplitterQueueDescriptor*>(&descriptor);
598 return std::make_unique<RefSplitterWorkload>(*splitterQueueDescriptor,
info);
602 auto stackQueueDescriptor = PolymorphicDowncast<const StackQueueDescriptor*>(&descriptor);
603 return std::make_unique<RefStackWorkload>(*stackQueueDescriptor,
info);
607 auto stridedSliceQueueDescriptor = PolymorphicDowncast<const StridedSliceQueueDescriptor*>(&descriptor);
608 return std::make_unique<RefStridedSliceWorkload>(*stridedSliceQueueDescriptor,
info);
612 auto subtractionQueueDescriptor = PolymorphicDowncast<const SubtractionQueueDescriptor*>(&descriptor);
615 return std::make_unique<RefSubtractionWorkload<int32_t>>(*subtractionQueueDescriptor,
info);
619 return std::make_unique<RefSubtractionWorkload<float>>(*subtractionQueueDescriptor,
info);
624 auto transposeQueueDescriptor = PolymorphicDowncast<const TransposeQueueDescriptor*>(&descriptor);
627 return std::make_unique<RefTransposeQSymm16Workload>(*transposeQueueDescriptor,
info);
631 return std::make_unique<RefTransposeBFloat16Workload>(*transposeQueueDescriptor,
info);
635 return std::make_unique<RefTransposeQAsymmS8Workload>(*transposeQueueDescriptor,
info);
639 (*transposeQueueDescriptor,
info);
643 auto transposeConvolution2dQueueDescriptor
644 = PolymorphicDowncast<const TransposeConvolution2dQueueDescriptor*>(&descriptor);
645 return std::make_unique<RefTransposeConvolution2dWorkload>(*transposeConvolution2dQueueDescriptor,
info);
649 auto unidirectionalSequenceLstmQueueDescriptor
650 = PolymorphicDowncast<const UnidirectionalSequenceLstmQueueDescriptor*>(&descriptor);
651 return std::make_unique<RefUnidirectionalSequenceLstmWorkload>(*unidirectionalSequenceLstmQueueDescriptor,
662 return std::make_unique<RefActivationWorkload>(descriptor,
info);
670 return std::make_unique<RefAdditionWorkload<int32_t>>(descriptor,
info);
674 return std::make_unique<RefAdditionWorkload<float>>(descriptor,
info);
681 return std::make_unique<RefArgMinMaxWorkload>(descriptor,
info);
684 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateBatchNormalization(
688 return std::make_unique<RefBatchNormalizationWorkload>(descriptor,
info);
694 return std::make_unique<RefBatchToSpaceNdWorkload>(descriptor,
info);
697 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateCast(
const CastQueueDescriptor& descriptor,
700 return std::make_unique<RefCastWorkload>(descriptor,
info);
706 return std::make_unique<RefChannelShuffleWorkload>(descriptor,
info);
712 return std::make_unique<RefComparisonWorkload>(descriptor,
info);
718 return std::make_unique<RefConcatWorkload>(descriptor,
info);
724 return std::make_unique<RefConstantWorkload>(descriptor,
info);
727 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertBf16ToFp32(
731 return std::make_unique<RefConvertBf16ToFp32Workload>(descriptor,
info);
734 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp16ToFp32(
738 return std::make_unique<RefConvertFp16ToFp32Workload>(descriptor,
info);
741 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp32ToBf16(
745 return std::make_unique<RefConvertFp32ToBf16Workload>(descriptor,
info);
748 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateConvertFp32ToFp16(
752 return std::make_unique<RefConvertFp32ToFp16Workload>(descriptor,
info);
758 return std::make_unique<RefConvolution2dWorkload>(descriptor,
info);
764 return std::make_unique<RefConvolution3dWorkload>(descriptor,
info);
767 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDebug(
const DebugQueueDescriptor& descriptor,
772 return std::make_unique<RefDebugBFloat16Workload>(descriptor,
info);
776 return std::make_unique<RefDebugFloat16Workload>(descriptor,
info);
780 return std::make_unique<RefDebugQSymmS16Workload>(descriptor,
info);
784 return std::make_unique<RefDebugQSymmS8Workload>(descriptor,
info);
788 return std::make_unique<RefDebugQAsymmU8Workload>(descriptor,
info);
792 return std::make_unique<RefDebugQAsymmS8Workload>(descriptor,
info);
796 return std::make_unique<RefDebugSigned32Workload>(descriptor,
info);
799 return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(descriptor,
info);
805 return std::make_unique<RefDepthToSpaceWorkload>(descriptor,
info);
808 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDepthwiseConvolution2d(
812 return std::make_unique<RefDepthwiseConvolution2dWorkload>(descriptor,
info);
818 return std::make_unique<RefDequantizeWorkload>(descriptor,
info);
821 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateDetectionPostProcess(
825 return std::make_unique<RefDetectionPostProcessWorkload>(descriptor,
info);
833 return std::make_unique<RefDivisionWorkload<int32_t>>(descriptor,
info);
837 return std::make_unique<RefDivisionWorkload<float>>(descriptor,
info);
846 return std::make_unique<RefLogicalUnaryWorkload>(descriptor,
info);
848 return std::make_unique<RefElementwiseUnaryWorkload>(descriptor,
info);
854 return MakeWorkload<RefFakeQuantizationFloat32Workload, NullWorkload>(descriptor,
info);
857 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFill(
const FillQueueDescriptor& descriptor,
860 return std::make_unique<RefFillWorkload>(descriptor,
info);
863 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFloor(
const FloorQueueDescriptor& descriptor,
872 return std::make_unique<RefFloorWorkload>(descriptor,
info);
876 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateFullyConnected(
880 return std::make_unique<RefFullyConnectedWorkload>(descriptor,
info);
886 return std::make_unique<RefGatherWorkload>(descriptor,
info);
889 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInput(
const InputQueueDescriptor& descriptor,
906 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
909 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateInstanceNormalization(
913 return std::make_unique<RefInstanceNormalizationWorkload>(descriptor,
info);
919 return std::make_unique<RefL2NormalizationWorkload>(descriptor,
info);
925 return std::make_unique<RefLogicalBinaryWorkload>(descriptor,
info);
931 return std::make_unique<RefLogSoftmaxWorkload>(descriptor,
info);
934 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateLstm(
const LstmQueueDescriptor& descriptor,
937 return std::make_unique<RefLstmWorkload>(descriptor,
info);
945 return std::make_unique<RefMaximumWorkload<int32_t>>(descriptor,
info);
949 return std::make_unique<RefMaximumWorkload<float>>(descriptor,
info);
953 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateMean(
const MeanQueueDescriptor& descriptor,
956 return std::make_unique<RefMeanWorkload>(descriptor,
info);
966 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
976 return std::make_unique<ImportMemGenericWorkload>(descriptor,
info);
984 return std::make_unique<RefMinimumWorkload<int32_t>>(descriptor,
info);
988 return std::make_unique<RefMinimumWorkload<float>>(descriptor,
info);
997 return std::make_unique<RefMultiplicationWorkload<int32_t>>(descriptor,
info);
1001 return std::make_unique<RefMultiplicationWorkload<float>>(descriptor,
info);
1008 return std::make_unique<RefNormalizationWorkload>(descriptor,
info);
1011 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateOutput(
const OutputQueueDescriptor& descriptor,
1027 return std::make_unique<CopyMemGenericWorkload>(descriptor,
info);
1030 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePad(
const PadQueueDescriptor& descriptor,
1033 return std::make_unique<RefPadWorkload>(descriptor,
info);
1041 return std::make_unique<RefPermuteQSymm16Workload>(descriptor,
info);
1045 return std::make_unique<RefPermuteBFloat16Workload>(descriptor,
info);
1049 return std::make_unique<RefPermuteQAsymmS8Workload>(descriptor,
info);
1058 return std::make_unique<RefPooling2dWorkload>(descriptor,
info);
1064 return std::make_unique<RefPooling3dWorkload>(descriptor,
info);
1073 std::unique_ptr<IWorkload> RefWorkloadFactory::CreatePrelu(
const PreluQueueDescriptor& descriptor,
1076 return std::make_unique<RefPreluWorkload>(descriptor,
info);
1079 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateQLstm(
const QLstmQueueDescriptor& descriptor,
1082 return std::make_unique<RefQLstmWorkload>(descriptor,
info);
1088 return std::make_unique<RefQuantizeWorkload>(descriptor,
info);
1091 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateRank(
const RankQueueDescriptor& descriptor,
1094 return std::make_unique<RefRankWorkload>(descriptor,
info);
1097 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateReduce(
const ReduceQueueDescriptor& descriptor,
1100 return std::make_unique<RefReduceWorkload>(descriptor,
info);
1106 return std::make_unique<RefReshapeWorkload>(descriptor,
info);
1109 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateResize(
const ResizeQueueDescriptor& descriptor,
1112 return std::make_unique<RefResizeWorkload>(descriptor,
info);
1115 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateShape(
const ShapeQueueDescriptor& descriptor,
1118 return std::make_unique<RefShapeWorkload>(descriptor,
info);
1121 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateSlice(
const SliceQueueDescriptor& descriptor,
1124 return std::make_unique<RefSliceWorkload>(descriptor,
info);
1130 return std::make_unique<RefSoftmaxWorkload>(descriptor,
info);
1136 return std::make_unique<RefSpaceToBatchNdWorkload>(descriptor,
info);
1142 return std::make_unique<RefSpaceToDepthWorkload>(descriptor,
info);
1148 return std::make_unique<RefSplitterWorkload>(descriptor,
info);
1151 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateStack(
const StackQueueDescriptor& descriptor,
1154 return std::make_unique<RefStackWorkload>(descriptor,
info);
1160 return std::make_unique<RefStridedSliceWorkload>(descriptor,
info);
1168 return std::make_unique<RefSubtractionWorkload<int32_t>>(descriptor,
info);
1172 return std::make_unique<RefSubtractionWorkload<float>>(descriptor,
info);
1181 return std::make_unique<RefTransposeQSymm16Workload>(descriptor,
info);
1185 return std::make_unique<RefTransposeBFloat16Workload>(descriptor,
info);
1189 return std::make_unique<RefTransposeQAsymmS8Workload>(descriptor,
info);
1195 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateTransposeConvolution2d(
1199 return std::make_unique<RefTransposeConvolution2dWorkload>(descriptor,
info);
1202 std::unique_ptr<IWorkload> RefWorkloadFactory::CreateUnidirectionalSequenceLstm(
1206 return std::make_unique<RefUnidirectionalSequenceLstmWorkload>(descriptor,
info);;
UnaryOperation m_Operation
Specifies the elementwiseUnary operation to execute.
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
constexpr bool IsQuantizedType()
constexpr const char * RefBackendId()
std::vector< BackendOptions > ModelOptions
RefPermuteWorkload< DataType::Float16 > RefPermuteFloat16Workload
RefTransposeWorkload< DataType::Float16 > RefTransposeFloat16Workload
bool IsQAsymmS8(const WorkloadInfo &info)
RefPermuteWorkload< DataType::Float32 > RefPermuteFloat32Workload
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
bool IsQAsymmU8(const WorkloadInfo &info)
bool IsQSymmS8(const WorkloadInfo &info)
bool IsBFloat16(const WorkloadInfo &info)
LayerDescriptor m_Parameters
const BackendId & GetBackendId() const override
std::vector< TensorInfo > m_InputTensorInfos
bool IsFloat16(const WorkloadInfo &info)
RefTransposeWorkload< DataType::Float32 > RefTransposeFloat32Workload
RefTransposeWorkload< DataType::QAsymmU8 > RefTransposeQAsymm8Workload
std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const override
static bool IsLayerSupported(const Layer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
bool IsSigned32(const WorkloadInfo &info)
bool IsDataType(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< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const override
Contains information about TensorInfos of a layer.
std::vector< ITensorHandle * > m_Inputs
RefPermuteWorkload< DataType::QAsymmU8 > RefPermuteQAsymm8Workload
bool IsQSymmS16(const WorkloadInfo &info)
Depthwise Convolution 2D layer workload data.
LayerType
When adding a new layer, adapt also the LastLayer enum value in the enum class LayerType below...