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 convertFp16ToFp32QueueDescriptor
218 = PolymorphicDowncast<const ConvertFp16ToFp32QueueDescriptor*>(&descriptor);
219 return std::make_unique<RefConvertFp16ToFp32Workload>(*convertFp16ToFp32QueueDescriptor, info);
223 auto convertFp32ToFp16QueueDescriptor
224 = PolymorphicDowncast<const ConvertFp32ToFp16QueueDescriptor*>(&descriptor);
225 return std::make_unique<RefConvertFp32ToFp16Workload>(*convertFp32ToFp16QueueDescriptor, info);
229 auto convolution2dQueueDescriptor = PolymorphicDowncast<const Convolution2dQueueDescriptor*>(&descriptor);
230 return std::make_unique<RefConvolution2dWorkload>(*convolution2dQueueDescriptor, info);
234 auto convolution3dQueueDescriptor = PolymorphicDowncast<const Convolution3dQueueDescriptor*>(&descriptor);
235 return std::make_unique<RefConvolution3dWorkload>(*convolution3dQueueDescriptor, info);
239 auto debugQueueDescriptor = PolymorphicDowncast<const DebugQueueDescriptor*>(&descriptor);
242 return std::make_unique<RefDebugBFloat16Workload>(*debugQueueDescriptor, info);
246 return std::make_unique<RefDebugFloat16Workload>(*debugQueueDescriptor, info);
250 return std::make_unique<RefDebugQSymmS16Workload>(*debugQueueDescriptor, info);
254 return std::make_unique<RefDebugQSymmS8Workload>(*debugQueueDescriptor, info);
258 return std::make_unique<RefDebugQAsymmU8Workload>(*debugQueueDescriptor, info);
262 return std::make_unique<RefDebugQAsymmS8Workload>(*debugQueueDescriptor, info);
266 return std::make_unique<RefDebugSigned32Workload>(*debugQueueDescriptor, info);
269 return MakeWorkload<RefDebugFloat32Workload, RefDebugQAsymmU8Workload>(*debugQueueDescriptor, info);
273 auto depthToSpaceQueueDescriptor = PolymorphicDowncast<const DepthToSpaceQueueDescriptor*>(&descriptor);
274 return std::make_unique<RefDepthToSpaceWorkload>(*depthToSpaceQueueDescriptor, info);
278 auto depthwiseConvolution2DQueueDescriptor
279 = PolymorphicDowncast<const DepthwiseConvolution2dQueueDescriptor*>(&descriptor);
280 return std::make_unique<RefDepthwiseConvolution2dWorkload>(*depthwiseConvolution2DQueueDescriptor, info);
284 auto dequantizeQueueDescriptor = PolymorphicDowncast<const DequantizeQueueDescriptor*>(&descriptor);
285 return std::make_unique<RefDequantizeWorkload>(*dequantizeQueueDescriptor, info);
289 auto detectionPostProcessQueueDescriptor
290 = PolymorphicDowncast<const DetectionPostProcessQueueDescriptor*>(&descriptor);
291 return std::make_unique<RefDetectionPostProcessWorkload>(*detectionPostProcessQueueDescriptor, info);
295 auto divisionQueueDescriptor = PolymorphicDowncast<const DivisionQueueDescriptor*>(&descriptor);
298 return std::make_unique<RefDivisionWorkload<int32_t>>(*divisionQueueDescriptor,
info);
302 return std::make_unique<RefDivisionWorkload<float>>(*divisionQueueDescriptor,
info);
307 auto elementwiseUnaryQueueDescriptor
308 = PolymorphicDowncast<const ElementwiseUnaryQueueDescriptor*>(&descriptor);
311 return std::make_unique<RefLogicalUnaryWorkload>(*elementwiseUnaryQueueDescriptor, info);
313 return std::make_unique<RefElementwiseUnaryWorkload>(*elementwiseUnaryQueueDescriptor, info);
317 auto fakeQuantizationQueueDescriptor
318 = PolymorphicDowncast<const FakeQuantizationQueueDescriptor*>(&descriptor);
319 return std::make_unique<RefFakeQuantizationFloat32Workload>(*fakeQuantizationQueueDescriptor, info);
323 auto fillQueueDescriptor = PolymorphicDowncast<const FillQueueDescriptor*>(&descriptor);
324 return std::make_unique<RefFillWorkload>(*fillQueueDescriptor, info);
328 auto floorQueueDescriptor = PolymorphicDowncast<const FloorQueueDescriptor*>(&descriptor);
335 return std::make_unique<RefFloorWorkload>(*floorQueueDescriptor, info);
340 auto fullyConnectedQueueDescriptor
341 = PolymorphicDowncast<const FullyConnectedQueueDescriptor*>(&descriptor);
342 return std::make_unique<RefFullyConnectedWorkload>(*fullyConnectedQueueDescriptor, info);
346 auto gatherQueueDescriptor = PolymorphicDowncast<const GatherQueueDescriptor*>(&descriptor);
347 return std::make_unique<RefGatherWorkload>(*gatherQueueDescriptor, info);
351 auto gatherNdQueueDescriptor = PolymorphicDowncast<const GatherNdQueueDescriptor*>(&descriptor);
352 return std::make_unique<RefGatherNdWorkload>(*gatherNdQueueDescriptor, info);
356 auto inputQueueDescriptor = PolymorphicDowncast<const InputQueueDescriptor*>(&descriptor);
357 if (
info.m_InputTensorInfos.empty() )
359 throw InvalidArgumentException(
"RefWorkloadFactory::CreateInput: Input cannot be zero length");
361 if (
info.m_OutputTensorInfos.empty())
363 throw InvalidArgumentException(
"RefWorkloadFactory::CreateInput: Output cannot be zero length");
366 if (
info.m_InputTensorInfos[0].GetNumBytes() !=
info.m_OutputTensorInfos[0].GetNumBytes())
368 throw InvalidArgumentException(
"RefWorkloadFactory::CreateInput: "
369 "data input and output differ in byte count.");
372 return std::make_unique<CopyMemGenericWorkload>(*inputQueueDescriptor, info);
376 auto instanceNormalizationQueueDescriptor
377 = PolymorphicDowncast<const InstanceNormalizationQueueDescriptor*>(&descriptor);
378 return std::make_unique<RefInstanceNormalizationWorkload>(*instanceNormalizationQueueDescriptor, info);
382 auto l2NormalizationQueueDescriptor
383 = PolymorphicDowncast<const L2NormalizationQueueDescriptor*>(&descriptor);
384 return std::make_unique<RefL2NormalizationWorkload>(*l2NormalizationQueueDescriptor, info);
388 auto logicalBinaryQueueDescriptor = PolymorphicDowncast<const LogicalBinaryQueueDescriptor*>(&descriptor);
389 return std::make_unique<RefLogicalBinaryWorkload>(*logicalBinaryQueueDescriptor, info);
393 auto logSoftmaxQueueDescriptor = PolymorphicDowncast<const LogSoftmaxQueueDescriptor*>(&descriptor);
394 return std::make_unique<RefLogSoftmaxWorkload>(*logSoftmaxQueueDescriptor, info);
398 auto lstmQueueDescriptor = PolymorphicDowncast<const LstmQueueDescriptor*>(&descriptor);
399 return std::make_unique<RefLstmWorkload>(*lstmQueueDescriptor, info);
403 auto maximumQueueDescriptor = PolymorphicDowncast<const MaximumQueueDescriptor*>(&descriptor);
406 return std::make_unique<RefMaximumWorkload<int32_t>>(*maximumQueueDescriptor,
info);
410 return std::make_unique<RefMaximumWorkload<float>>(*maximumQueueDescriptor,
info);
415 auto meanQueueDescriptor = PolymorphicDowncast<const MeanQueueDescriptor*>(&descriptor);
416 return std::make_unique<RefMeanWorkload>(*meanQueueDescriptor, info);
420 auto memCopyQueueDescriptor = PolymorphicDowncast<const MemCopyQueueDescriptor*>(&descriptor);
421 if (descriptor.m_Inputs.empty())
423 throw InvalidArgumentException(
"RefWorkloadFactory: CreateMemCopy() expected an input tensor.");
425 return std::make_unique<CopyMemGenericWorkload>(*memCopyQueueDescriptor, info);
429 auto memImportQueueDescriptor = PolymorphicDowncast<const MemImportQueueDescriptor*>(&descriptor);
430 if (descriptor.m_Inputs.empty())
432 throw InvalidArgumentException(
"RefWorkloadFactory: CreateMemImport() expected an input tensor.");
434 return std::make_unique<ImportMemGenericWorkload>(*memImportQueueDescriptor, info);
438 auto minimumQueueDescriptor = PolymorphicDowncast<const MinimumQueueDescriptor*>(&descriptor);
441 return std::make_unique<RefMinimumWorkload<int32_t>>(*minimumQueueDescriptor,
info);
445 return std::make_unique<RefMinimumWorkload<float>>(*minimumQueueDescriptor,
info);
450 auto multiplicationQueueDescriptor
451 = PolymorphicDowncast<const MultiplicationQueueDescriptor*>(&descriptor);
454 return std::make_unique<RefMultiplicationWorkload<int32_t>>(*multiplicationQueueDescriptor,
info);
458 return std::make_unique<RefMultiplicationWorkload<float>>(*multiplicationQueueDescriptor,
info);
463 auto normalizationQueueDescriptor = PolymorphicDowncast<const NormalizationQueueDescriptor*>(&descriptor);
464 return std::make_unique<RefNormalizationWorkload>(*normalizationQueueDescriptor, info);
468 auto outputQueueDescriptor = PolymorphicDowncast<const OutputQueueDescriptor*>(&descriptor);
469 if (
info.m_InputTensorInfos.empty() )
471 throw InvalidArgumentException(
"RefWorkloadFactory::CreateOutput: Input cannot be zero length");
473 if (
info.m_OutputTensorInfos.empty())
475 throw InvalidArgumentException(
"RefWorkloadFactory::CreateOutput: Output cannot be zero length");
477 if (
info.m_InputTensorInfos[0].GetNumBytes() !=
info.m_OutputTensorInfos[0].GetNumBytes())
479 throw InvalidArgumentException(
"RefWorkloadFactory::CreateOutput: data input and output "
480 "differ in byte count.");
483 return std::make_unique<CopyMemGenericWorkload>(*outputQueueDescriptor, info);
487 auto padQueueDescriptor = PolymorphicDowncast<const PadQueueDescriptor*>(&descriptor);
488 return std::make_unique<RefPadWorkload>(*padQueueDescriptor, info);
492 auto permuteQueueDescriptor = PolymorphicDowncast<const PermuteQueueDescriptor*>(&descriptor);
495 return std::make_unique<RefPermuteQSymm16Workload>(*permuteQueueDescriptor, info);
499 return std::make_unique<RefPermuteBFloat16Workload>(*permuteQueueDescriptor, info);
503 return std::make_unique<RefPermuteQAsymmS8Workload>(*permuteQueueDescriptor, info);
506 NullWorkload, NullWorkload, NullWorkload>(*permuteQueueDescriptor,
info);
510 auto pooling2dQueueDescriptor = PolymorphicDowncast<const Pooling2dQueueDescriptor*>(&descriptor);
511 return std::make_unique<RefPooling2dWorkload>(*pooling2dQueueDescriptor, info);
515 auto pooling3dQueueDescriptor = PolymorphicDowncast<const Pooling3dQueueDescriptor*>(&descriptor);
516 return std::make_unique<RefPooling3dWorkload>(*pooling3dQueueDescriptor, info);
524 auto preluQueueDescriptor = PolymorphicDowncast<const PreluQueueDescriptor*>(&descriptor);
525 return std::make_unique<RefPreluWorkload>(*preluQueueDescriptor, info);
529 auto qlstmQueueDescriptor = PolymorphicDowncast<const QLstmQueueDescriptor*>(&descriptor);
530 return std::make_unique<RefQLstmWorkload>(*qlstmQueueDescriptor, info);
534 auto quantizeQueueDescriptor = PolymorphicDowncast<const QuantizeQueueDescriptor*>(&descriptor);
535 return std::make_unique<RefQuantizeWorkload>(*quantizeQueueDescriptor, info);
539 auto rankQueueDescriptor = PolymorphicDowncast<const RankQueueDescriptor*>(&descriptor);
540 return std::make_unique<RefRankWorkload>(*rankQueueDescriptor, info);
544 auto reduceQueueDescriptor = PolymorphicDowncast<const ReduceQueueDescriptor*>(&descriptor);
545 return std::make_unique<RefReduceWorkload>(*reduceQueueDescriptor, info);
549 auto reshapeQueueDescriptor = PolymorphicDowncast<const ReshapeQueueDescriptor*>(&descriptor);
550 return std::make_unique<RefReshapeWorkload>(*reshapeQueueDescriptor, info);
554 auto resizeQueueDescriptor = PolymorphicDowncast<const ResizeQueueDescriptor*>(&descriptor);
555 return std::make_unique<RefResizeWorkload>(*resizeQueueDescriptor, info);
559 auto shapeQueueDescriptor = PolymorphicDowncast<const ShapeQueueDescriptor*>(&descriptor);
560 return std::make_unique<RefShapeWorkload>(*shapeQueueDescriptor, info);
564 auto sliceQueueDescriptor = PolymorphicDowncast<const SliceQueueDescriptor*>(&descriptor);
565 return std::make_unique<RefSliceWorkload>(*sliceQueueDescriptor, info);
569 auto softmaxQueueDescriptor = PolymorphicDowncast<const SoftmaxQueueDescriptor*>(&descriptor);
570 return std::make_unique<RefSoftmaxWorkload>(*softmaxQueueDescriptor, info);
574 auto spaceToBatchNdQueueDescriptor
575 = PolymorphicDowncast<const SpaceToBatchNdQueueDescriptor*>(&descriptor);
576 return std::make_unique<RefSpaceToBatchNdWorkload>(*spaceToBatchNdQueueDescriptor, info);
580 auto spaceToDepthQueueDescriptor = PolymorphicDowncast<const SpaceToDepthQueueDescriptor*>(&descriptor);
581 return std::make_unique<RefSpaceToDepthWorkload>(*spaceToDepthQueueDescriptor, info);
585 auto splitterQueueDescriptor = PolymorphicDowncast<const SplitterQueueDescriptor*>(&descriptor);
586 return std::make_unique<RefSplitterWorkload>(*splitterQueueDescriptor, info);
590 auto stackQueueDescriptor = PolymorphicDowncast<const StackQueueDescriptor*>(&descriptor);
591 return std::make_unique<RefStackWorkload>(*stackQueueDescriptor, info);
595 auto stridedSliceQueueDescriptor = PolymorphicDowncast<const StridedSliceQueueDescriptor*>(&descriptor);
596 return std::make_unique<RefStridedSliceWorkload>(*stridedSliceQueueDescriptor, info);
600 auto subtractionQueueDescriptor = PolymorphicDowncast<const SubtractionQueueDescriptor*>(&descriptor);
603 return std::make_unique<RefSubtractionWorkload<int32_t>>(*subtractionQueueDescriptor,
info);
607 return std::make_unique<RefSubtractionWorkload<float>>(*subtractionQueueDescriptor,
info);
612 auto transposeQueueDescriptor = PolymorphicDowncast<const TransposeQueueDescriptor*>(&descriptor);
615 return std::make_unique<RefTransposeQSymm16Workload>(*transposeQueueDescriptor, info);
619 return std::make_unique<RefTransposeBFloat16Workload>(*transposeQueueDescriptor, info);
623 return std::make_unique<RefTransposeQAsymmS8Workload>(*transposeQueueDescriptor, info);
627 (*transposeQueueDescriptor,
info);
631 auto transposeConvolution2dQueueDescriptor
632 = PolymorphicDowncast<const TransposeConvolution2dQueueDescriptor*>(&descriptor);
633 return std::make_unique<RefTransposeConvolution2dWorkload>(*transposeConvolution2dQueueDescriptor, info);
637 auto unidirectionalSequenceLstmQueueDescriptor
638 = PolymorphicDowncast<const UnidirectionalSequenceLstmQueueDescriptor*>(&descriptor);
639 return std::make_unique<RefUnidirectionalSequenceLstmWorkload>(*unidirectionalSequenceLstmQueueDescriptor,