27 using LayerList = std::list<Layer*>;
28 using Iterator = LayerList::const_iterator;
30 const TensorInfo OverrideDataType(
const TensorInfo& info, Optional<DataType> type)
37 return TensorInfo(
info.GetShape(),
39 info.GetQuantizationScale(),
40 info.GetQuantizationOffset(),
53 switch(weightsType.
value())
65 ARMNN_ASSERT_MSG(
false,
"GetBiasTypeFromWeightsType(): Unsupported data type.");
71 bool IWorkloadFactory::IsLayerConfigurationSupported(
const BackendId& backendId,
72 const IConnectableLayer& connectableLayer,
73 Optional<DataType> dataType,
74 std::string& outReasonIfUnsupported,
77 Optional<std::string&> reason = outReasonIfUnsupported;
79 const Layer& layer = *(PolymorphicDowncast<const Layer*>(&connectableLayer));
82 if (!backendRegistry.IsBackendRegistered(backendId))
85 ss << connectableLayer.GetName() <<
" is not supported on " << backendId
86 <<
" because this backend is not registered.";
88 outReasonIfUnsupported = ss.str();
92 auto backendFactory = backendRegistry.GetFactory(backendId);
93 auto backendObject = backendFactory();
94 auto layerSupportObject = LayerSupportHandle(backendObject->GetLayerSupport(modelOptions), backendId);
96 switch(layer.GetType())
100 auto cLayer = PolymorphicDowncast<const ActivationLayer*>(&layer);
101 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
102 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
103 result = layerSupportObject.IsActivationSupported(
104 OverrideDataType(input, dataType),
105 OverrideDataType(output, dataType),
106 cLayer->GetParameters(),
112 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
113 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
114 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
115 result = layerSupportObject.IsAdditionSupported(
116 OverrideDataType(input0, dataType),
117 OverrideDataType(input1, dataType),
118 OverrideDataType(output, dataType),
124 auto cLayer = PolymorphicDowncast<const ArgMinMaxLayer*>(&layer);
125 const ArgMinMaxDescriptor& descriptor = cLayer->GetParameters();
127 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
128 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
129 result = layerSupportObject.IsArgMinMaxSupported(
130 OverrideDataType(input, dataType),
138 auto cLayer = PolymorphicDowncast<const BatchMatMulLayer*>(&layer);
139 const BatchMatMulDescriptor& descriptor = cLayer->GetParameters();
141 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
142 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
143 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
144 result = layerSupportObject.IsBatchMatMulSupported(
145 OverrideDataType(input0, dataType),
146 OverrideDataType(input1, dataType),
147 OverrideDataType(output, dataType),
154 auto cLayer = PolymorphicDowncast<const BatchNormalizationLayer*>(&layer);
155 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
156 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
157 const TensorInfo& mean = cLayer->m_Mean->GetTensorInfo();
158 const TensorInfo& var = cLayer->m_Variance->GetTensorInfo();
159 const TensorInfo& beta = cLayer->m_Beta->GetTensorInfo();
160 const TensorInfo& gamma = cLayer->m_Gamma->GetTensorInfo();
161 result = layerSupportObject.IsBatchNormalizationSupported(
162 OverrideDataType(input, dataType),
163 OverrideDataType(output, dataType),
164 OverrideDataType(mean, dataType),
165 OverrideDataType(var, dataType),
166 OverrideDataType(beta, dataType),
167 OverrideDataType(gamma, dataType),
168 cLayer->GetParameters(),
174 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
175 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
176 auto cLayer = PolymorphicDowncast<const BatchToSpaceNdLayer*>(&layer);
178 result = layerSupportObject.IsBatchToSpaceNdSupported(OverrideDataType(input, dataType),
179 OverrideDataType(output, dataType),
180 cLayer->GetParameters(),
186 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
187 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
189 result = layerSupportObject.IsCastSupported(OverrideDataType(input, dataType),
190 OverrideDataType(output, dataType),
196 auto cLayer = PolymorphicDowncast<const ChannelShuffleLayer*>(&layer);
198 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
199 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
201 const ChannelShuffleDescriptor descriptor = cLayer->GetParameters();
203 result = layerSupportObject.IsChannelShuffleSupported(OverrideDataType(input, dataType),
204 OverrideDataType(output, dataType),
211 auto cLayer = PolymorphicDowncast<const ComparisonLayer*>(&layer);
213 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
214 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
215 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
217 result = layerSupportObject.IsComparisonSupported(OverrideDataType(input0, dataType),
218 OverrideDataType(input1, dataType),
220 cLayer->GetParameters(),
226 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
227 result = layerSupportObject.IsConstantSupported(OverrideDataType(output, dataType), reason);
232 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
233 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
234 result = layerSupportObject.IsConvertFp16ToFp32Supported(input, output, reason);
239 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
240 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
241 result = layerSupportObject.IsConvertFp32ToFp16Supported(input, output, reason);
246 auto cLayer = PolymorphicDowncast<const Convolution2dLayer*>(&layer);
248 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
250 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
252 "Convolution2dLayer: Weights should be connected as a Constant Layer.");
253 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
256 const Convolution2dDescriptor& descriptor = cLayer->GetParameters();
259 Optional<TensorInfo> biases;
260 if (descriptor.m_BiasEnabled)
263 "Convolution2dLayer: Bias should be connected as a Constant Layer.");
264 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
268 result = layerSupportObject.IsConvolution2dSupported(
279 auto cLayer = PolymorphicDowncast<const Convolution3dLayer*>(&layer);
281 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
283 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
286 "Convolution3dLayer: Weights should be connected as a Constant Layer.");
287 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
290 const Convolution3dDescriptor& descriptor = cLayer->GetParameters();
293 Optional<TensorInfo> biases;
294 if (descriptor.m_BiasEnabled)
296 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
300 result = layerSupportObject.IsConvolution3dSupported(
311 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
312 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
314 result = layerSupportObject.IsDebugSupported(OverrideDataType(input, dataType),
315 OverrideDataType(output, dataType),
321 auto cLayer = PolymorphicDowncast<const DepthToSpaceLayer*>(&layer);
323 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
324 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
326 result = layerSupportObject.IsDepthToSpaceSupported(OverrideDataType(input, dataType),
327 OverrideDataType(output, dataType),
328 cLayer->GetParameters(),
334 auto cLayer = PolymorphicDowncast<const DepthwiseConvolution2dLayer*>(&layer);
335 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
337 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
338 const TensorInfo& weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
341 ARMNN_ASSERT(cLayer->GetInputSlot(1).GetConnection() !=
nullptr);
343 const DepthwiseConvolution2dDescriptor& descriptor = cLayer->GetParameters();
346 Optional<TensorInfo> biases;
347 if (descriptor.m_BiasEnabled)
349 biases = OverrideDataType(cLayer->GetInputSlot(2).GetConnection()->GetTensorInfo(),
353 result = layerSupportObject.IsDepthwiseConvolutionSupported(input,
363 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
364 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
366 result = layerSupportObject.IsDequantizeSupported(input,
367 OverrideDataType(output, dataType),
373 auto cLayer = PolymorphicDowncast<const DetectionPostProcessLayer*>(&layer);
374 const TensorInfo& boxEncodings = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
375 const TensorInfo& scores = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
376 const TensorInfo& anchors = cLayer->m_Anchors->GetTensorInfo();
378 const TensorInfo& detectionBoxes = layer.GetOutputSlot(0).GetTensorInfo();
379 const TensorInfo& detectionClasses = layer.GetOutputSlot(1).GetTensorInfo();
380 const TensorInfo& detectionScores = layer.GetOutputSlot(2).GetTensorInfo();
381 const TensorInfo& numDetections = layer.GetOutputSlot(3).GetTensorInfo();
383 const DetectionPostProcessDescriptor& descriptor = cLayer->GetParameters();
384 result = layerSupportObject.IsDetectionPostProcessSupported(boxEncodings,
397 auto cLayer = PolymorphicDowncast<const ElementwiseUnaryLayer*>(&layer);
399 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
400 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
402 result = layerSupportObject.IsElementwiseUnarySupported(OverrideDataType(input, dataType),
403 OverrideDataType(output, dataType),
404 cLayer->GetParameters(),
410 auto cLayer = PolymorphicDowncast<const FillLayer*>(&layer);
411 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
412 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
413 const FillDescriptor& descriptor = cLayer->GetParameters();
415 result = layerSupportObject.IsFillSupported(
416 OverrideDataType(input, dataType),
417 OverrideDataType(output, dataType),
424 auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer);
425 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
426 result = layerSupportObject.IsFakeQuantizationSupported(OverrideDataType(input, dataType),
427 cLayer->GetParameters(),
433 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
434 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
435 result = layerSupportObject.IsFloorSupported(OverrideDataType(input, dataType),
436 OverrideDataType(output, dataType),
442 auto cLayer = PolymorphicDowncast<const FullyConnectedLayer*>(&layer);
443 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
444 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
446 const FullyConnectedDescriptor& descriptor = cLayer->GetParameters();
447 TensorInfo weightsInfo;
448 const TensorInfo* weightsInfoPtr =
nullptr;
450 weightsInfo = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(), dataType);
451 weightsInfoPtr = &weightsInfo;
454 const TensorInfo* biasInfoPtr =
nullptr;
455 static const TensorInfo dummyBFloat16Bias(TensorShape({1,1,1,1}),
DataType::BFloat16);
456 static const TensorInfo dummyFloat16Bias(TensorShape({1,1,1,1}),
DataType::Float16);
457 static const TensorInfo dummyFloat32Bias(TensorShape({1,1,1,1}),
DataType::Float32);
460 if (descriptor.m_BiasEnabled)
462 biasInfo = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(), dataType);
463 biasInfoPtr = &biasInfo;
468 switch(input.GetDataType())
472 biasInfoPtr = &dummyBFloat16Bias;
477 biasInfoPtr = &dummyFloat16Bias;
482 biasInfoPtr = &dummyFloat32Bias;
490 biasInfoPtr = &dummyQA8Bias;
499 result = layerSupportObject.IsFullyConnectedSupported(
500 OverrideDataType(input, dataType),
501 OverrideDataType(output, dataType),
510 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
511 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
512 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
513 auto cLayer = PolymorphicDowncast<const GatherLayer*>(&layer);
514 const GatherDescriptor& descriptor = cLayer->GetParameters();
515 result = layerSupportObject.IsGatherSupported(OverrideDataType(input0, dataType),
517 OverrideDataType(output, dataType),
524 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
525 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
526 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
527 result = layerSupportObject.IsGatherNdSupported(OverrideDataType(input0, dataType),
529 OverrideDataType(output, dataType),
535 const TensorInfo& input = layer.GetOutputSlot(0).GetTensorInfo();
536 result = layerSupportObject.IsInputSupported(OverrideDataType(input, dataType), reason);
541 auto cLayer = PolymorphicDowncast<const InstanceNormalizationLayer*>(&layer);
542 const InstanceNormalizationDescriptor& descriptor = cLayer->GetParameters();
544 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
545 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
547 result = layerSupportObject.IsInstanceNormalizationSupported(
548 OverrideDataType(input, dataType),
549 OverrideDataType(output, dataType),
556 auto cLayer = PolymorphicDowncast<const L2NormalizationLayer*>(&layer);
557 const L2NormalizationDescriptor& descriptor = cLayer->GetParameters();
559 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
560 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
562 result = layerSupportObject.IsL2NormalizationSupported(
563 OverrideDataType(input, dataType),
564 OverrideDataType(output, dataType),
571 auto cLayer = PolymorphicDowncast<const LogicalBinaryLayer*>(&layer);
573 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
574 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
575 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
577 result = layerSupportObject.IsLogicalBinarySupported(input0,
580 cLayer->GetParameters(),
586 auto cLayer = PolymorphicDowncast<const LogSoftmaxLayer*>(&layer);
588 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
589 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
591 result = layerSupportObject.IsLogSoftmaxSupported(OverrideDataType(input, dataType),
592 OverrideDataType(output, dataType),
593 cLayer->GetParameters(),
599 auto cLayer = PolymorphicDowncast<const LstmLayer*>(&layer);
600 const LstmDescriptor& descriptor = cLayer->GetParameters();
603 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
605 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
607 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
610 const TensorInfo& scratchBuffer = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
611 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
612 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
613 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(3).GetTensorInfo(), dataType);
616 const TensorInfo& inputToForgetWeights
617 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
618 const TensorInfo& inputToCellWeights
619 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
620 const TensorInfo& inputToOutputWeights
621 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
622 const TensorInfo& recurrentToForgetWeights
623 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
624 const TensorInfo& recurrentToCellWeights
625 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
626 const TensorInfo& recurrentToOutputWeights
627 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
628 const TensorInfo& forgetGateBias
629 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
630 const TensorInfo& cellBias
631 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
632 const TensorInfo& outputGateBias
633 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
635 LstmInputParamsInfo paramsInfo;
637 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
638 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
639 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
640 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
641 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
642 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
643 paramsInfo.m_ForgetGateBias = &forgetGateBias;
644 paramsInfo.m_CellBias = &cellBias;
645 paramsInfo.m_OutputGateBias = &outputGateBias;
649 TensorInfo optInputToInputWeights;
650 TensorInfo optRecurrentToInputWeights;
651 TensorInfo optCellToInputWeights;
652 TensorInfo optInputGateBias;
653 TensorInfo optProjectionWeights;
654 TensorInfo optProjectionBias;
655 TensorInfo optCellToForgetWeights;
656 TensorInfo optCellToOutputWeights;
657 TensorInfo optInputLayerNormWeights;
658 TensorInfo optForgetLayerNormWeights;
659 TensorInfo optCellLayerNormWeights;
660 TensorInfo optOutputLayerNormWeights;
662 if(!descriptor.m_CifgEnabled)
664 optInputToInputWeights =
665 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
666 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
668 optRecurrentToInputWeights =
669 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
670 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
672 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
673 paramsInfo.m_InputGateBias = &optInputGateBias;
676 if(descriptor.m_ProjectionEnabled)
678 optProjectionWeights =
679 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
680 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
681 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
684 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
685 paramsInfo.m_ProjectionBias = &optProjectionBias;
689 if(descriptor.m_PeepholeEnabled)
691 if(!descriptor.m_CifgEnabled)
693 optCellToInputWeights =
694 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
696 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
698 optCellToForgetWeights =
699 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
700 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
701 optCellToOutputWeights =
702 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
703 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
706 if(descriptor.m_LayerNormEnabled)
708 if (!descriptor.m_CifgEnabled)
710 optInputLayerNormWeights = OverrideDataType(
711 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
712 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
715 optForgetLayerNormWeights = OverrideDataType(
716 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
717 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
719 optCellLayerNormWeights = OverrideDataType(
720 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
721 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
723 optOutputLayerNormWeights = OverrideDataType(
724 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
725 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
728 result = layerSupportObject.IsLstmSupported(
743 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
744 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
745 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
747 result = layerSupportObject.IsMaximumSupported(OverrideDataType(input0, dataType),
748 OverrideDataType(input1, dataType),
749 OverrideDataType(output, dataType),
755 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
756 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
758 result = layerSupportObject.IsMemCopySupported(OverrideDataType(input, dataType),
759 OverrideDataType(output, dataType),
765 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
766 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
768 result = layerSupportObject.IsMemImportSupported(OverrideDataType(input, dataType),
769 OverrideDataType(output, dataType),
775 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
776 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
777 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
779 result = layerSupportObject.IsMergeSupported(OverrideDataType(input0, dataType),
780 OverrideDataType(input1, dataType),
781 OverrideDataType(output, dataType),
787 auto cLayer = PolymorphicDowncast<const ConcatLayer*>(&layer);
790 auto getTensorInfo = [&dataType](
const InputSlot& slot)
792 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
797 std::vector<TensorInfo> inputs(beginI, endI);
799 auto getTensorInfoPtr = [](
const TensorInfo&
info)
806 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
808 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
810 result = layerSupportObject.IsConcatSupported(inputPtrs, output, cLayer->GetParameters(), reason);
817 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
818 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
819 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
820 result = layerSupportObject.IsMultiplicationSupported(
821 OverrideDataType(input0, dataType),
822 OverrideDataType(input1, dataType),
823 OverrideDataType(output, dataType),
829 auto cLayer = PolymorphicDowncast<const NormalizationLayer*>(&layer);
830 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
831 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
832 result = layerSupportObject.IsNormalizationSupported(OverrideDataType(input, dataType),
833 OverrideDataType(output, dataType),
834 cLayer->GetParameters(),
840 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
841 result = layerSupportObject.IsOutputSupported(OverrideDataType(output, dataType), reason);
846 auto cLayer = PolymorphicDowncast<const PermuteLayer*>(&layer);
847 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
848 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
849 result = layerSupportObject.IsPermuteSupported(OverrideDataType(input, dataType),
850 OverrideDataType(output, dataType),
851 cLayer->GetParameters(),
857 auto cLayer = PolymorphicDowncast<const PadLayer*>(&layer);
858 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
859 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
860 result = layerSupportObject.IsPadSupported(
861 OverrideDataType(input, dataType),
862 OverrideDataType(output, dataType),
863 cLayer->GetParameters(),
869 auto cLayer = PolymorphicDowncast<const Pooling2dLayer*>(&layer);
870 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
871 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
872 result = layerSupportObject.IsPooling2dSupported(OverrideDataType(input, dataType),
873 OverrideDataType(output, dataType),
874 cLayer->GetParameters(),
880 auto cLayer = PolymorphicDowncast<const Pooling3dLayer*>(&layer);
881 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
882 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
883 result = layerSupportObject.IsPooling3dSupported(OverrideDataType(input, dataType),
884 OverrideDataType(output, dataType),
885 cLayer->GetParameters(),
891 auto cLayer = PolymorphicDowncast<const PreCompiledLayer*>(&layer);
892 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
893 result = layerSupportObject.IsPreCompiledSupported(OverrideDataType(input, dataType),
894 cLayer->GetParameters(),
900 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
901 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
902 result = layerSupportObject.IsQuantizeSupported(input, output, reason);
907 auto cLayer = PolymorphicDowncast<const QLstmLayer*>(&layer);
908 const QLstmDescriptor& descriptor = cLayer->GetParameters();
911 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
912 const TensorInfo& previousOutputIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
913 const TensorInfo& previousCellStateIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
916 const TensorInfo& outputStateOut = layer.GetOutputSlot(0).GetTensorInfo();
917 const TensorInfo& cellStateOut = layer.GetOutputSlot(1).GetTensorInfo();
918 const TensorInfo& output = layer.GetOutputSlot(2).GetTensorInfo();
921 LstmInputParamsInfo paramsInfo;
924 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToForgetWeights.get() !=
nullptr);
925 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToCellWeights.get() !=
nullptr);
926 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToOutputWeights.get() !=
nullptr);
927 paramsInfo.m_InputToForgetWeights = &cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo();
928 paramsInfo.m_InputToCellWeights = &cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo();
929 paramsInfo.m_InputToOutputWeights = &cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo();
931 paramsInfo.m_RecurrentToForgetWeights =
932 &cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo();
933 paramsInfo.m_RecurrentToCellWeights =
934 &cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo();
935 paramsInfo.m_RecurrentToOutputWeights =
936 &cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo();
938 paramsInfo.m_ForgetGateBias = &cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo();
939 paramsInfo.m_CellBias = &cLayer->m_BasicParameters.m_CellBias->GetTensorInfo();
940 paramsInfo.m_OutputGateBias = &cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo();
942 if(!descriptor.m_CifgEnabled)
944 paramsInfo.m_InputToInputWeights = &cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo();
945 paramsInfo.m_RecurrentToInputWeights =
946 &cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo();
947 paramsInfo.m_InputGateBias = &cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo();
950 if(descriptor.m_ProjectionEnabled)
952 paramsInfo.m_ProjectionWeights = &cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo();
955 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
957 paramsInfo.m_ProjectionBias = &cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo();
961 if(descriptor.m_PeepholeEnabled)
963 if (!descriptor.m_CifgEnabled)
965 paramsInfo.m_CellToInputWeights =
966 &cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo();
969 paramsInfo.m_CellToForgetWeights =
970 &cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo();
971 paramsInfo.m_CellToOutputWeights = &cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo();
974 if(descriptor.m_LayerNormEnabled)
976 if (!descriptor.m_CifgEnabled)
978 paramsInfo.m_InputLayerNormWeights =
979 &cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo();
982 paramsInfo.m_ForgetLayerNormWeights =
983 &cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo();
984 paramsInfo.m_CellLayerNormWeights =
985 &cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo();
986 paramsInfo.m_OutputLayerNormWeights =
987 &cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo();
990 result = layerSupportObject.IsQLstmSupported(input,
1003 auto cLayer = PolymorphicDowncast<const QuantizedLstmLayer*>(&layer);
1006 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1007 const TensorInfo& previousCellStateIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1008 const TensorInfo& previousOutputIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
1011 const TensorInfo& cellStateOut = layer.GetOutputSlot(0).GetTensorInfo();
1012 const TensorInfo& output = layer.GetOutputSlot(1).GetTensorInfo();
1015 QuantizedLstmInputParamsInfo paramsInfo;
1017 paramsInfo.m_InputToInputWeights =
1018 &cLayer->m_QuantizedLstmParameters.m_InputToInputWeights->GetTensorInfo();
1019 paramsInfo.m_InputToForgetWeights =
1020 &cLayer->m_QuantizedLstmParameters.m_InputToForgetWeights->GetTensorInfo();
1021 paramsInfo.m_InputToCellWeights =
1022 &cLayer->m_QuantizedLstmParameters.m_InputToCellWeights->GetTensorInfo();
1023 paramsInfo.m_InputToOutputWeights =
1024 &cLayer->m_QuantizedLstmParameters.m_InputToOutputWeights->GetTensorInfo();
1026 paramsInfo.m_RecurrentToInputWeights =
1027 &cLayer->m_QuantizedLstmParameters.m_RecurrentToInputWeights->GetTensorInfo();
1028 paramsInfo.m_RecurrentToForgetWeights =
1029 &cLayer->m_QuantizedLstmParameters.m_RecurrentToForgetWeights->GetTensorInfo();
1030 paramsInfo.m_RecurrentToCellWeights =
1031 &cLayer->m_QuantizedLstmParameters.m_RecurrentToCellWeights->GetTensorInfo();
1032 paramsInfo.m_RecurrentToOutputWeights =
1033 &cLayer->m_QuantizedLstmParameters.m_RecurrentToOutputWeights->GetTensorInfo();
1035 paramsInfo.m_InputGateBias =
1036 &cLayer->m_QuantizedLstmParameters.m_InputGateBias->GetTensorInfo();
1037 paramsInfo.m_ForgetGateBias =
1038 &cLayer->m_QuantizedLstmParameters.m_ForgetGateBias->GetTensorInfo();
1039 paramsInfo.m_CellBias =
1040 &cLayer->m_QuantizedLstmParameters.m_CellBias->GetTensorInfo();
1041 paramsInfo.m_OutputGateBias =
1042 &cLayer->m_QuantizedLstmParameters.m_OutputGateBias->GetTensorInfo();;
1044 result = layerSupportObject.IsQuantizedLstmSupported(input,
1045 previousCellStateIn,
1055 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1056 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1057 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1058 result = layerSupportObject.IsDivisionSupported(
1059 OverrideDataType(input0, dataType),
1060 OverrideDataType(input1, dataType),
1061 OverrideDataType(output, dataType),
1067 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1068 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1069 result = layerSupportObject.IsRankSupported(OverrideDataType(input, dataType),
1070 OverrideDataType(output, dataType),
1076 auto cLayer = PolymorphicDowncast<const ReshapeLayer*>(&layer);
1077 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1078 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1079 result = layerSupportObject.IsReshapeSupported(OverrideDataType(input, dataType),
1080 OverrideDataType(output, dataType),
1081 cLayer->GetParameters(),
1087 auto cLayer = PolymorphicDowncast<const ResizeLayer*>(&layer);
1088 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1089 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1090 result = layerSupportObject.IsResizeSupported(OverrideDataType(input, dataType),
1091 OverrideDataType(output, dataType),
1092 cLayer->GetParameters(),
1098 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1099 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1101 result = layerSupportObject.IsShapeSupported(OverrideDataType(input, dataType),
1102 OverrideDataType(output, dataType),
1108 auto cLayer = PolymorphicDowncast<const SliceLayer*>(&layer);
1110 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1111 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1113 result = layerSupportObject.IsSliceSupported(OverrideDataType(input, dataType),
1114 OverrideDataType(output, dataType),
1115 cLayer->GetParameters(),
1121 auto cLayer = PolymorphicDowncast<const SoftmaxLayer*>(&layer);
1122 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1123 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1124 result = layerSupportObject.IsSoftmaxSupported(OverrideDataType(input, dataType),
1125 OverrideDataType(output, dataType),
1126 cLayer->GetParameters(),
1132 auto cLayer = PolymorphicDowncast<const SpaceToBatchNdLayer*>(&layer);
1133 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1134 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1135 result = layerSupportObject.IsSpaceToBatchNdSupported(OverrideDataType(input, dataType),
1136 OverrideDataType(output, dataType),
1137 cLayer->GetParameters(),
1143 auto cLayer = PolymorphicDowncast<const SpaceToDepthLayer*>(&layer);
1145 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1146 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1148 result = layerSupportObject.IsSpaceToDepthSupported(OverrideDataType(input, dataType),
1149 OverrideDataType(output, dataType),
1150 cLayer->GetParameters(),
1156 auto cLayer = PolymorphicDowncast<const SplitterLayer*>(&layer);
1157 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1160 auto getTensorInfo = [&dataType](
const OutputSlot& slot)
1162 return OverrideDataType(slot.GetTensorInfo(), dataType);
1166 std::vector<TensorInfo> outputs(beginI, endI);
1168 const std::vector<std::reference_wrapper<TensorInfo>> outputPtrs(outputs.begin(), outputs.end());
1170 result = layerSupportObject.IsSplitterSupported(OverrideDataType(input, dataType),
1172 cLayer->GetParameters(),
1178 auto cLayer = PolymorphicDowncast<const StackLayer*>(&layer);
1181 auto getTensorInfo = [&dataType](
const InputSlot& slot)
1183 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1187 std::vector<TensorInfo> inputs(beginI, endI);
1189 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1195 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
1197 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1199 result = layerSupportObject.IsStackSupported(inputPtrs, output, cLayer->GetParameters(), reason);
1205 auto cLayer = PolymorphicDowncast<const StandInLayer*>(&layer);
1208 auto getTensorInfoIn = [&dataType](
const InputSlot& slot)
1210 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1212 auto getTensorInfoOut = [&dataType](
const OutputSlot& slot)
1214 return OverrideDataType(slot.GetTensorInfo(), dataType);
1218 std::vector<TensorInfo> inputs(beginI, endI);
1222 std::vector<TensorInfo> outputs(beginO, endO);
1225 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1231 std::vector<const TensorInfo*> inputPtrs(beginPtrI, endPtrI);
1235 std::vector<const TensorInfo*> outputPtrs(beginPtrO, endPtrO);
1238 result = layerSupportObject.IsStandInSupported(inputPtrs,
1240 cLayer->GetParameters(),
1246 auto cLayer = PolymorphicDowncast<const StridedSliceLayer*>(&layer);
1247 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1248 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1249 result = layerSupportObject.IsStridedSliceSupported(OverrideDataType(input, dataType),
1250 OverrideDataType(output, dataType),
1251 cLayer->GetParameters(),
1257 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1258 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1259 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1260 result = layerSupportObject.IsSubtractionSupported(
1261 OverrideDataType(input0, dataType),
1262 OverrideDataType(input1, dataType),
1263 OverrideDataType(output, dataType),
1269 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1270 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1271 const TensorInfo& output0 = layer.GetOutputSlot(0).GetTensorInfo();
1272 const TensorInfo& output1 = layer.GetOutputSlot(1).GetTensorInfo();
1273 result = layerSupportObject.IsSwitchSupported(OverrideDataType(input0, dataType),
1274 OverrideDataType(input1, dataType),
1275 OverrideDataType(output0, dataType),
1276 OverrideDataType(output1, dataType),
1282 auto cLayer = PolymorphicDowncast<const MeanLayer*>(&layer);
1283 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1284 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1285 result = layerSupportObject.IsMeanSupported(
1286 OverrideDataType(input, dataType),
1287 OverrideDataType(output, dataType),
1288 cLayer->GetParameters(),
1294 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1295 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1296 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1297 result = layerSupportObject.IsMinimumSupported(OverrideDataType(input0, dataType),
1298 OverrideDataType(input1, dataType),
1299 OverrideDataType(output, dataType),
1305 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1306 const TensorInfo& alpha = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1307 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1308 result = layerSupportObject.IsPreluSupported(OverrideDataType(input, dataType),
1309 OverrideDataType(alpha, dataType),
1310 OverrideDataType(output, dataType),
1316 auto cLayer = PolymorphicDowncast<const TransposeLayer*>(&layer);
1317 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1318 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1319 result = layerSupportObject.IsTransposeSupported(OverrideDataType(input, dataType),
1320 OverrideDataType(output, dataType),
1321 cLayer->GetParameters(),
1327 auto cLayer = PolymorphicDowncast<const TransposeConvolution2dLayer*>(&layer);
1329 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1331 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1333 const TransposeConvolution2dDescriptor& descriptor = cLayer->GetParameters();
1335 Optional<TensorInfo> biases;
1336 if (descriptor.m_BiasEnabled)
1339 biases = OverrideDataType(cLayer->m_Bias->GetTensorInfo(),
1344 const TensorInfo weights = OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType);
1346 result = layerSupportObject.IsTransposeConvolution2dSupported(input,
1357 auto cLayer = PolymorphicDowncast<const ReduceLayer*>(&layer);
1358 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1359 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1361 result = layerSupportObject.IsReduceSupported(OverrideDataType(input, dataType),
1362 OverrideDataType(output, dataType),
1363 cLayer->GetParameters(),
1369 auto cLayer = PolymorphicDowncast<const UnidirectionalSequenceLstmLayer*>(&layer);
1373 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1375 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
1377 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
1380 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1381 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
1382 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
1385 const TensorInfo& inputToForgetWeights
1386 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
1387 const TensorInfo& inputToCellWeights
1388 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
1389 const TensorInfo& inputToOutputWeights
1390 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
1391 const TensorInfo& recurrentToForgetWeights
1392 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
1393 const TensorInfo& recurrentToCellWeights
1394 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
1395 const TensorInfo& recurrentToOutputWeights
1396 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
1397 const TensorInfo& forgetGateBias
1398 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
1399 const TensorInfo& cellBias
1400 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
1401 const TensorInfo& outputGateBias
1402 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
1404 LstmInputParamsInfo paramsInfo;
1406 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
1407 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
1408 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
1409 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1410 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
1411 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1412 paramsInfo.m_ForgetGateBias = &forgetGateBias;
1413 paramsInfo.m_CellBias = &cellBias;
1414 paramsInfo.m_OutputGateBias = &outputGateBias;
1417 TensorInfo optInputToInputWeights;
1418 TensorInfo optRecurrentToInputWeights;
1419 TensorInfo optCellToInputWeights;
1420 TensorInfo optInputGateBias;
1421 TensorInfo optProjectionWeights;
1422 TensorInfo optProjectionBias;
1423 TensorInfo optCellToForgetWeights;
1424 TensorInfo optCellToOutputWeights;
1425 TensorInfo optInputLayerNormWeights;
1426 TensorInfo optForgetLayerNormWeights;
1427 TensorInfo optCellLayerNormWeights;
1428 TensorInfo optOutputLayerNormWeights;
1430 if(!descriptor.m_CifgEnabled)
1432 optInputToInputWeights =
1433 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
1434 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
1436 optRecurrentToInputWeights =
1437 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
1438 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
1440 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
1441 paramsInfo.m_InputGateBias = &optInputGateBias;
1444 if(descriptor.m_ProjectionEnabled)
1446 optProjectionWeights =
1447 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
1448 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
1449 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
1452 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
1453 paramsInfo.m_ProjectionBias = &optProjectionBias;
1457 if(descriptor.m_PeepholeEnabled)
1459 if(!descriptor.m_CifgEnabled)
1461 optCellToInputWeights =
1462 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
1464 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
1466 optCellToForgetWeights =
1467 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
1468 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
1469 optCellToOutputWeights =
1470 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
1471 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
1474 if(descriptor.m_LayerNormEnabled)
1476 if (!descriptor.m_CifgEnabled)
1478 optInputLayerNormWeights = OverrideDataType(
1479 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
1480 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
1483 optForgetLayerNormWeights = OverrideDataType(
1484 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
1485 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
1487 optCellLayerNormWeights = OverrideDataType(
1488 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
1489 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
1491 optOutputLayerNormWeights = OverrideDataType(
1492 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
1493 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
1496 result = layerSupportObject.IsUnidirectionalSequenceLstmSupported(input,
1509 ARMNN_ASSERT_MSG(
false,
"WorkloadFactory did not recognise type of layer.");
1510 reason.value() =
"Unrecognised layer type";
1521 std::string& outReasonIfUnsupported)
1523 return IsLayerConfigurationSupported(backendId, connectableLayer, dataType, outReasonIfUnsupported);
1528 std::string& outReasonIfUnsupported)
1530 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1531 return IsLayerConfigurationSupported(layer->GetBackendId(), connectableLayer, dataType, outReasonIfUnsupported);
1537 std::string& outReasonIfUnsupported,
1540 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1541 return IsLayerConfigurationSupported(layer->GetBackendId(),
1544 outReasonIfUnsupported,
1551 std::string& outReasonIfUnsupported,
1554 return IsLayerConfigurationSupported(backendId,
1557 outReasonIfUnsupported,
1569 auto activationQueueDescriptor = PolymorphicDowncast<const ActivationQueueDescriptor*>(&descriptor);
1570 return CreateActivation(*activationQueueDescriptor,
info);
1574 auto additionQueueDescriptor = PolymorphicDowncast<const AdditionQueueDescriptor*>(&descriptor);
1575 return CreateAddition(*additionQueueDescriptor,
info);
1579 auto argMinMaxQueueDescriptor = PolymorphicDowncast<const ArgMinMaxQueueDescriptor*>(&descriptor);
1580 return CreateArgMinMax(*argMinMaxQueueDescriptor,
info);
1584 auto batchNormQueueDescriptor = PolymorphicDowncast<const BatchNormalizationQueueDescriptor*>(&descriptor);
1585 return CreateBatchNormalization(*batchNormQueueDescriptor,
info);
1589 auto batchToSpaceNdQueueDescriptor
1590 = PolymorphicDowncast<const BatchToSpaceNdQueueDescriptor*>(&descriptor);
1591 return CreateBatchToSpaceNd(*batchToSpaceNdQueueDescriptor,
info);
1595 auto castQueueDescriptor = PolymorphicDowncast<const CastQueueDescriptor*>(&descriptor);
1596 return CreateCast(*castQueueDescriptor,
info);
1600 auto channelShuffleQueueDescriptor
1601 = PolymorphicDowncast<const ChannelShuffleQueueDescriptor*>(&descriptor);
1602 return CreateChannelShuffle(*channelShuffleQueueDescriptor,
info);
1606 auto comparisonQueueDescriptor = PolymorphicDowncast<const ComparisonQueueDescriptor*>(&descriptor);
1607 return CreateComparison(*comparisonQueueDescriptor,
info);
1611 auto concatQueueDescriptor = PolymorphicDowncast<const ConcatQueueDescriptor*>(&descriptor);
1612 return CreateConcat(*concatQueueDescriptor,
info);
1616 auto constantQueueDescriptor = PolymorphicDowncast<const ConstantQueueDescriptor*>(&descriptor);
1617 return CreateConstant(*constantQueueDescriptor,
info);
1621 auto convertFp16ToFp32QueueDescriptor
1622 = PolymorphicDowncast<const ConvertFp16ToFp32QueueDescriptor*>(&descriptor);
1623 return CreateConvertFp16ToFp32(*convertFp16ToFp32QueueDescriptor,
info);
1627 auto convertFp32ToFp16QueueDescriptor
1628 = PolymorphicDowncast<const ConvertFp32ToFp16QueueDescriptor*>(&descriptor);
1629 return CreateConvertFp32ToFp16(*convertFp32ToFp16QueueDescriptor,
info);
1633 auto convolution2dQueueDescriptor = PolymorphicDowncast<const Convolution2dQueueDescriptor*>(&descriptor);
1634 return CreateConvolution2d(*convolution2dQueueDescriptor,
info);
1638 auto convolution3dQueueDescriptor = PolymorphicDowncast<const Convolution3dQueueDescriptor*>(&descriptor);
1639 return CreateConvolution3d(*convolution3dQueueDescriptor,
info);
1643 auto debugQueueDescriptor = PolymorphicDowncast<const DebugQueueDescriptor*>(&descriptor);
1644 return CreateDebug(*debugQueueDescriptor,
info);
1648 auto depthToSpaceQueueDescriptor = PolymorphicDowncast<const DepthToSpaceQueueDescriptor*>(&descriptor);
1649 return CreateDepthToSpace(*depthToSpaceQueueDescriptor,
info);
1653 auto depthwiseConvolution2DQueueDescriptor
1654 = PolymorphicDowncast<const DepthwiseConvolution2dQueueDescriptor*>(&descriptor);
1655 return CreateDepthwiseConvolution2d(*depthwiseConvolution2DQueueDescriptor,
info);
1659 auto dequantizeQueueDescriptor = PolymorphicDowncast<const DequantizeQueueDescriptor*>(&descriptor);
1660 return CreateDequantize(*dequantizeQueueDescriptor,
info);
1664 auto detectionPostProcessQueueDescriptor
1665 = PolymorphicDowncast<const DetectionPostProcessQueueDescriptor*>(&descriptor);
1666 return CreateDetectionPostProcess(*detectionPostProcessQueueDescriptor,
info);
1670 auto divisionQueueDescriptor = PolymorphicDowncast<const DivisionQueueDescriptor*>(&descriptor);
1671 return CreateDivision(*divisionQueueDescriptor,
info);
1675 auto elementwiseUnaryQueueDescriptor
1676 = PolymorphicDowncast<const ElementwiseUnaryQueueDescriptor*>(&descriptor);
1677 return CreateElementwiseUnary(*elementwiseUnaryQueueDescriptor,
info);
1682 auto fakeQuantizationQueueDescriptor
1683 = PolymorphicDowncast<const FakeQuantizationQueueDescriptor*>(&descriptor);
1684 return CreateFakeQuantization(*fakeQuantizationQueueDescriptor,
info);
1688 auto fillQueueDescriptor = PolymorphicDowncast<const FillQueueDescriptor*>(&descriptor);
1689 return CreateFill(*fillQueueDescriptor,
info);
1693 auto floorQueueDescriptor = PolymorphicDowncast<const FloorQueueDescriptor*>(&descriptor);
1694 return CreateFloor(*floorQueueDescriptor,
info);
1698 auto fullyConnectedQueueDescriptor
1699 = PolymorphicDowncast<const FullyConnectedQueueDescriptor*>(&descriptor);
1700 return CreateFullyConnected(*fullyConnectedQueueDescriptor,
info);
1704 auto gatherQueueDescriptor = PolymorphicDowncast<const GatherQueueDescriptor*>(&descriptor);
1705 return CreateGather(*gatherQueueDescriptor,
info);
1709 auto inputQueueDescriptor = PolymorphicDowncast<const InputQueueDescriptor*>(&descriptor);
1710 return CreateInput(*inputQueueDescriptor,
info);
1714 auto instanceNormalizationQueueDescriptor
1715 = PolymorphicDowncast<const InstanceNormalizationQueueDescriptor*>(&descriptor);
1716 return CreateInstanceNormalization(*instanceNormalizationQueueDescriptor,
info);
1720 auto l2NormalizationQueueDescriptor
1721 = PolymorphicDowncast<const L2NormalizationQueueDescriptor*>(&descriptor);
1722 return CreateL2Normalization(*l2NormalizationQueueDescriptor,
info);
1726 auto logicalBinaryQueueDescriptor = PolymorphicDowncast<const LogicalBinaryQueueDescriptor*>(&descriptor);
1727 return CreateLogicalBinary(*logicalBinaryQueueDescriptor,
info);
1731 auto logSoftmaxQueueDescriptor = PolymorphicDowncast<const LogSoftmaxQueueDescriptor*>(&descriptor);
1732 return CreateLogSoftmax(*logSoftmaxQueueDescriptor,
info);
1736 auto lstmQueueDescriptor = PolymorphicDowncast<const LstmQueueDescriptor*>(&descriptor);
1737 return CreateLstm(*lstmQueueDescriptor,
info);
1741 auto maximumQueueDescriptor = PolymorphicDowncast<const MaximumQueueDescriptor*>(&descriptor);
1742 return CreateMaximum(*maximumQueueDescriptor,
info);
1746 auto meanQueueDescriptor = PolymorphicDowncast<const MeanQueueDescriptor*>(&descriptor);
1747 return CreateMean(*meanQueueDescriptor,
info);
1751 auto memCopyQueueDescriptor = PolymorphicDowncast<const MemCopyQueueDescriptor*>(&descriptor);
1752 return CreateMemCopy(*memCopyQueueDescriptor,
info);
1756 auto memImportQueueDescriptor = PolymorphicDowncast<const MemImportQueueDescriptor*>(&descriptor);
1757 return CreateMemImport(*memImportQueueDescriptor,
info);
1761 auto minimumQueueDescriptor = PolymorphicDowncast<const MinimumQueueDescriptor*>(&descriptor);
1762 return CreateMinimum(*minimumQueueDescriptor,
info);
1766 auto multiplicationQueueDescriptor
1767 = PolymorphicDowncast<const MultiplicationQueueDescriptor*>(&descriptor);
1768 return CreateMultiplication(*multiplicationQueueDescriptor,
info);
1772 auto normalizationQueueDescriptor = PolymorphicDowncast<const NormalizationQueueDescriptor*>(&descriptor);
1773 return CreateNormalization(*normalizationQueueDescriptor,
info);
1777 auto outputQueueDescriptor = PolymorphicDowncast<const OutputQueueDescriptor*>(&descriptor);
1778 return CreateOutput(*outputQueueDescriptor,
info);
1782 auto padQueueDescriptor = PolymorphicDowncast<const PadQueueDescriptor*>(&descriptor);
1783 return CreatePad(*padQueueDescriptor,
info);
1787 auto permuteQueueDescriptor = PolymorphicDowncast<const PermuteQueueDescriptor*>(&descriptor);
1788 return CreatePermute(*permuteQueueDescriptor,
info);
1792 auto pooling2dQueueDescriptor = PolymorphicDowncast<const Pooling2dQueueDescriptor*>(&descriptor);
1793 return CreatePooling2d(*pooling2dQueueDescriptor,
info);
1797 auto pooling3dQueueDescriptor = PolymorphicDowncast<const Pooling3dQueueDescriptor*>(&descriptor);
1798 return CreatePooling3d(*pooling3dQueueDescriptor,
info);
1802 auto preCompiledQueueDescriptor = PolymorphicDowncast<const PreCompiledQueueDescriptor*>(&descriptor);
1803 return CreatePreCompiled(*preCompiledQueueDescriptor,
info);
1807 auto preluQueueDescriptor = PolymorphicDowncast<const PreluQueueDescriptor*>(&descriptor);
1808 return CreatePrelu(*preluQueueDescriptor,
info);
1812 auto qlstmQueueDescriptor = PolymorphicDowncast<const QLstmQueueDescriptor*>(&descriptor);
1813 return CreateQLstm(*qlstmQueueDescriptor,
info);
1817 auto quantizeQueueDescriptor = PolymorphicDowncast<const QuantizeQueueDescriptor*>(&descriptor);
1818 return CreateQuantize(*quantizeQueueDescriptor,
info);
1822 auto rankQueueDescriptor = PolymorphicDowncast<const RankQueueDescriptor*>(&descriptor);
1823 return CreateRank(*rankQueueDescriptor,
info);
1827 auto reduceQueueDescriptor = PolymorphicDowncast<const ReduceQueueDescriptor*>(&descriptor);
1828 return CreateReduce(*reduceQueueDescriptor,
info);
1832 auto reshapeQueueDescriptor = PolymorphicDowncast<const ReshapeQueueDescriptor*>(&descriptor);
1833 return CreateReshape(*reshapeQueueDescriptor,
info);
1837 auto resizeQueueDescriptor = PolymorphicDowncast<const ResizeQueueDescriptor*>(&descriptor);
1838 return CreateResize(*resizeQueueDescriptor,
info);
1842 auto shapeQueueDescriptor = PolymorphicDowncast<const ShapeQueueDescriptor*>(&descriptor);
1843 return CreateShape(*shapeQueueDescriptor,
info);
1847 auto sliceQueueDescriptor = PolymorphicDowncast<const SliceQueueDescriptor*>(&descriptor);
1848 return CreateSlice(*sliceQueueDescriptor,
info);
1852 auto softmaxQueueDescriptor = PolymorphicDowncast<const SoftmaxQueueDescriptor*>(&descriptor);
1853 return CreateSoftmax(*softmaxQueueDescriptor,
info);
1857 auto spaceToBatchNdQueueDescriptor
1858 = PolymorphicDowncast<const SpaceToBatchNdQueueDescriptor*>(&descriptor);
1859 return CreateSpaceToBatchNd(*spaceToBatchNdQueueDescriptor,
info);
1863 auto spaceToDepthQueueDescriptor = PolymorphicDowncast<const SpaceToDepthQueueDescriptor*>(&descriptor);
1864 return CreateSpaceToDepth(*spaceToDepthQueueDescriptor,
info);
1868 auto splitterQueueDescriptor = PolymorphicDowncast<const SplitterQueueDescriptor*>(&descriptor);
1869 return CreateSplitter(*splitterQueueDescriptor,
info);
1873 auto stackQueueDescriptor = PolymorphicDowncast<const StackQueueDescriptor*>(&descriptor);
1874 return CreateStack(*stackQueueDescriptor,
info);
1878 auto stridedSliceQueueDescriptor = PolymorphicDowncast<const StridedSliceQueueDescriptor*>(&descriptor);
1879 return CreateStridedSlice(*stridedSliceQueueDescriptor,
info);
1883 auto subtractionQueueDescriptor = PolymorphicDowncast<const SubtractionQueueDescriptor*>(&descriptor);
1884 return CreateSubtraction(*subtractionQueueDescriptor,
info);
1888 auto transposeQueueDescriptor = PolymorphicDowncast<const TransposeQueueDescriptor*>(&descriptor);
1889 return CreateTranspose(*transposeQueueDescriptor,
info);
1893 auto transposeConvolution2dQueueDescriptor
1894 = PolymorphicDowncast<const TransposeConvolution2dQueueDescriptor*>(&descriptor);
1895 return CreateTransposeConvolution2d(*transposeConvolution2dQueueDescriptor,
info);
1899 auto unidirectionalSequenceLstmQueueDescriptor
1900 = PolymorphicDowncast<const UnidirectionalSequenceLstmQueueDescriptor*>(&descriptor);
1901 return CreateUnidirectionalSequenceLstm(*unidirectionalSequenceLstmQueueDescriptor,
info);
1912 return std::unique_ptr<IWorkload>();
1915 std::unique_ptr<IWorkload> IWorkloadFactory::CreateAddition(
const AdditionQueueDescriptor& ,
1916 const WorkloadInfo& )
const
1918 return std::unique_ptr<IWorkload>();
1921 std::unique_ptr<IWorkload> IWorkloadFactory::CreateArgMinMax(
const ArgMinMaxQueueDescriptor& ,
1922 const WorkloadInfo& )
const
1924 return std::unique_ptr<IWorkload>();
1927 std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchNormalization(
1928 const BatchNormalizationQueueDescriptor& ,
const WorkloadInfo& )
const
1930 return std::unique_ptr<IWorkload>();
1933 std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchToSpaceNd(
const BatchToSpaceNdQueueDescriptor& ,
1934 const WorkloadInfo& )
const
1936 return std::unique_ptr<IWorkload>();
1939 std::unique_ptr<IWorkload> IWorkloadFactory::CreateCast(
const CastQueueDescriptor& ,
1940 const WorkloadInfo& )
const
1942 return std::unique_ptr<IWorkload>();
1945 std::unique_ptr<IWorkload> IWorkloadFactory::CreateChannelShuffle(
const ChannelShuffleQueueDescriptor& ,
1946 const WorkloadInfo& )
const
1948 return std::unique_ptr<IWorkload>();
1951 std::unique_ptr<IWorkload> IWorkloadFactory::CreateComparison(
const ComparisonQueueDescriptor& ,
1952 const WorkloadInfo& )
const
1954 return std::unique_ptr<IWorkload>();
1957 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConcat(
const ConcatQueueDescriptor& ,
1958 const WorkloadInfo& )
const
1960 return std::unique_ptr<IWorkload>();
1963 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConstant(
const ConstantQueueDescriptor& ,
1964 const WorkloadInfo& )
const
1966 return std::unique_ptr<IWorkload>();
1969 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp16ToFp32(
const ConvertFp16ToFp32QueueDescriptor& ,
1970 const WorkloadInfo& )
const
1972 return std::unique_ptr<IWorkload>();
1975 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp32ToFp16(
const ConvertFp32ToFp16QueueDescriptor& ,
1976 const WorkloadInfo& )
const
1978 return std::unique_ptr<IWorkload>();
1981 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution2d(
const Convolution2dQueueDescriptor& ,
1982 const WorkloadInfo& )
const
1984 return std::unique_ptr<IWorkload>();
1987 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution3d(
const Convolution3dQueueDescriptor& ,
1988 const WorkloadInfo& )
const
1990 return std::unique_ptr<IWorkload>();
1993 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDebug(
const DebugQueueDescriptor& ,
1994 const WorkloadInfo& )
const
1996 return std::unique_ptr<IWorkload>();
1999 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthToSpace(
const DepthToSpaceQueueDescriptor& ,
2000 const WorkloadInfo& )
const
2002 return std::unique_ptr<IWorkload>();
2005 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthwiseConvolution2d(
2006 const DepthwiseConvolution2dQueueDescriptor& ,
const WorkloadInfo& )
const
2008 return std::unique_ptr<IWorkload>();
2011 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDequantize(
2012 const DequantizeQueueDescriptor& ,
const WorkloadInfo& )
const
2014 return std::unique_ptr<IWorkload>();
2017 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDetectionPostProcess(
2018 const DetectionPostProcessQueueDescriptor& ,
const WorkloadInfo& )
const
2020 return std::unique_ptr<IWorkload>();
2023 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDivision(
const DivisionQueueDescriptor& ,
2024 const WorkloadInfo& )
const
2026 return std::unique_ptr<IWorkload>();
2029 std::unique_ptr<IWorkload> IWorkloadFactory::CreateElementwiseUnary(
const ElementwiseUnaryQueueDescriptor& ,
2030 const WorkloadInfo& )
const
2032 return std::unique_ptr<IWorkload>();
2035 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFakeQuantization(
const FakeQuantizationQueueDescriptor& ,
2036 const WorkloadInfo& )
const
2038 return std::unique_ptr<IWorkload>();
2041 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFill(
const FillQueueDescriptor& ,
2042 const WorkloadInfo& )
const
2044 return std::unique_ptr<IWorkload>();
2047 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFloor(
const FloorQueueDescriptor& ,
2048 const WorkloadInfo& )
const
2050 return std::unique_ptr<IWorkload>();
2053 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFullyConnected(
const FullyConnectedQueueDescriptor& ,
2054 const WorkloadInfo& )
const
2056 return std::unique_ptr<IWorkload>();
2059 std::unique_ptr<IWorkload> IWorkloadFactory::CreateGather(
const GatherQueueDescriptor& ,
2060 const WorkloadInfo& )
const
2062 return std::unique_ptr<IWorkload>();
2065 std::unique_ptr<IWorkload> IWorkloadFactory::CreateInstanceNormalization(
2066 const InstanceNormalizationQueueDescriptor& ,
2067 const WorkloadInfo& )
const
2069 return std::unique_ptr<IWorkload>();
2072 std::unique_ptr<IWorkload> IWorkloadFactory::CreateL2Normalization(
const L2NormalizationQueueDescriptor& ,
2073 const WorkloadInfo& )
const
2075 return std::unique_ptr<IWorkload>();
2078 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalBinary(
const LogicalBinaryQueueDescriptor& ,
2079 const WorkloadInfo& )
const
2081 return std::unique_ptr<IWorkload>();
2084 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalUnary(
const ElementwiseUnaryQueueDescriptor& ,
2085 const WorkloadInfo& )
const
2087 return std::unique_ptr<IWorkload>();
2090 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogSoftmax(
const LogSoftmaxQueueDescriptor& ,
2091 const WorkloadInfo& )
const
2093 return std::unique_ptr<IWorkload>();
2096 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLstm(
const LstmQueueDescriptor& ,
2097 const WorkloadInfo& )
const
2099 return std::unique_ptr<IWorkload>();
2102 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMaximum(
const MaximumQueueDescriptor& ,
2103 const WorkloadInfo& )
const
2105 return std::unique_ptr<IWorkload>();
2108 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMean(
const MeanQueueDescriptor& ,
2109 const WorkloadInfo& )
const
2111 return std::unique_ptr<IWorkload>();
2114 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemCopy(
const MemCopyQueueDescriptor& ,
2115 const WorkloadInfo& )
const
2117 return std::unique_ptr<IWorkload>();
2120 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemImport(
const MemImportQueueDescriptor& ,
2121 const WorkloadInfo& )
const
2123 return std::unique_ptr<IWorkload>();
2126 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMerge(
const MergeQueueDescriptor& ,
2127 const WorkloadInfo& )
const
2129 return std::unique_ptr<IWorkload>();
2132 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMinimum(
const MinimumQueueDescriptor& ,
2133 const WorkloadInfo& )
const
2135 return std::unique_ptr<IWorkload>();
2138 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMultiplication(
const MultiplicationQueueDescriptor& ,
2139 const WorkloadInfo& )
const
2141 return std::unique_ptr<IWorkload>();
2144 std::unique_ptr<IWorkload> IWorkloadFactory::CreateNormalization(
const NormalizationQueueDescriptor& ,
2145 const WorkloadInfo& )
const
2147 return std::unique_ptr<IWorkload>();
2151 const WorkloadInfo& )
const
2153 return std::unique_ptr<IWorkload>();
2156 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePad(
const PadQueueDescriptor& ,
2157 const WorkloadInfo& )
const
2159 return std::unique_ptr<IWorkload>();
2162 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePermute(
const PermuteQueueDescriptor& ,
2163 const WorkloadInfo& )
const
2165 return std::unique_ptr<IWorkload>();
2168 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling2d(
const Pooling2dQueueDescriptor& ,
2169 const WorkloadInfo& )
const
2171 return std::unique_ptr<IWorkload>();
2174 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling3d(
const Pooling3dQueueDescriptor& ,
2175 const WorkloadInfo& )
const
2177 return std::unique_ptr<IWorkload>();
2180 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePreCompiled(
const PreCompiledQueueDescriptor& ,
2181 const WorkloadInfo& )
const
2183 return std::unique_ptr<IWorkload>();
2186 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePrelu(
const PreluQueueDescriptor &,
2187 const WorkloadInfo &)
const
2189 return std::unique_ptr<IWorkload>();
2192 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantize(
const QuantizeQueueDescriptor& ,
2193 const WorkloadInfo& )
const
2195 return std::unique_ptr<IWorkload>();
2198 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQLstm(
const QLstmQueueDescriptor& ,
2199 const WorkloadInfo& )
const
2201 return std::unique_ptr<IWorkload>();
2204 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantizedLstm(
const QuantizedLstmQueueDescriptor& ,
2205 const WorkloadInfo& )
const
2207 return std::unique_ptr<IWorkload>();
2209 std::unique_ptr<IWorkload> IWorkloadFactory::CreateRank(
const RankQueueDescriptor& ,
2210 const WorkloadInfo& )
const
2212 return std::unique_ptr<IWorkload>();
2215 std::unique_ptr<IWorkload> IWorkloadFactory::CreateReduce(
const ReduceQueueDescriptor& ,
2216 const WorkloadInfo& )
const
2218 return std::unique_ptr<IWorkload>();
2221 std::unique_ptr<IWorkload> IWorkloadFactory::CreateReshape(
const ReshapeQueueDescriptor& ,
2222 const WorkloadInfo& )
const
2224 return std::unique_ptr<IWorkload>();
2227 std::unique_ptr<IWorkload> IWorkloadFactory::CreateResize(
const ResizeQueueDescriptor& ,
2228 const WorkloadInfo& )
const
2230 return std::unique_ptr<IWorkload>();
2233 std::unique_ptr<IWorkload> IWorkloadFactory::CreateShape(
const ShapeQueueDescriptor& ,
2234 const WorkloadInfo& )
const
2236 return std::unique_ptr<IWorkload>();
2239 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSlice(
const SliceQueueDescriptor& ,
2240 const WorkloadInfo& )
const
2242 return std::unique_ptr<IWorkload>();
2245 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSoftmax(
const SoftmaxQueueDescriptor& ,
2246 const WorkloadInfo& )
const
2248 return std::unique_ptr<IWorkload>();
2251 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSplitter(
const SplitterQueueDescriptor& ,
2252 const WorkloadInfo& )
const
2254 return std::unique_ptr<IWorkload>();
2257 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToBatchNd(
const SpaceToBatchNdQueueDescriptor& ,
2258 const WorkloadInfo& )
const
2260 return std::unique_ptr<IWorkload>();
2263 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToDepth(
const SpaceToDepthQueueDescriptor& ,
2264 const WorkloadInfo& )
const
2266 return std::unique_ptr<IWorkload>();
2269 std::unique_ptr<IWorkload> IWorkloadFactory::CreateStack(
const StackQueueDescriptor& ,
2270 const WorkloadInfo& )
const
2272 return std::unique_ptr<IWorkload>();
2275 std::unique_ptr<IWorkload> IWorkloadFactory::CreateStridedSlice(
const StridedSliceQueueDescriptor& ,
2276 const WorkloadInfo& )
const
2278 return std::unique_ptr<IWorkload>();
2281 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSubtraction(
const SubtractionQueueDescriptor& ,
2282 const WorkloadInfo& )
const
2284 return std::unique_ptr<IWorkload>();
2287 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSwitch(
const SwitchQueueDescriptor& ,
2288 const WorkloadInfo& )
const
2290 return std::unique_ptr<IWorkload>();
2293 std::unique_ptr<IWorkload> IWorkloadFactory::CreateTranspose(
const TransposeQueueDescriptor& ,
2294 const WorkloadInfo& )
const
2296 return std::unique_ptr<IWorkload>();
2299 std::unique_ptr<IWorkload> IWorkloadFactory::CreateTransposeConvolution2d(
2300 const TransposeConvolution2dQueueDescriptor& ,
2301 const WorkloadInfo& )
const
2303 return std::unique_ptr<IWorkload>();
2306 std::unique_ptr<IWorkload> IWorkloadFactory::CreateUnidirectionalSequenceLstm(
2307 const UnidirectionalSequenceLstmQueueDescriptor& ,
2308 const WorkloadInfo& )
const
2310 return std::unique_ptr<IWorkload>();
2313 std::unique_ptr<IWorkload> IWorkloadFactory::CreateInput(
2315 const WorkloadInfo& )
const
2317 return std::unique_ptr<IWorkload>();