22 #include <boost/iterator/transform_iterator.hpp> 33 const TensorInfo OverrideDataType(
const TensorInfo& info, Optional<DataType> type)
40 return TensorInfo(info.GetShape(), type.value(), info.GetQuantizationScale(), info.GetQuantizationOffset());
48 std::string& outReasonIfUnsupported)
52 const Layer& layer = *(PolymorphicDowncast<const Layer*>(&connectableLayer));
55 if (!backendRegistry.IsBackendRegistered(backendId))
58 ss << connectableLayer.
GetName() <<
" is not supported on " << backendId
59 <<
" because this backend is not registered.";
61 outReasonIfUnsupported = ss.str();
65 auto backendFactory = backendRegistry.GetFactory(backendId);
66 auto backendObject = backendFactory();
67 auto layerSupportObject = backendObject->GetLayerSupport();
73 auto cLayer = PolymorphicDowncast<const ActivationLayer*>(&layer);
76 result = layerSupportObject->IsActivationSupported(
77 OverrideDataType(input, dataType),
78 OverrideDataType(output, dataType),
79 cLayer->GetParameters(),
88 result = layerSupportObject->IsAdditionSupported(
89 OverrideDataType(input0, dataType),
90 OverrideDataType(input1, dataType),
91 OverrideDataType(output, dataType),
97 auto cLayer = PolymorphicDowncast<const ArgMinMaxLayer*>(&layer);
102 result = layerSupportObject->IsArgMinMaxSupported(
103 OverrideDataType(input, dataType),
111 auto cLayer = PolymorphicDowncast<const BatchNormalizationLayer*>(&layer);
114 const TensorInfo& mean = cLayer->m_Mean->GetTensorInfo();
115 const TensorInfo& var = cLayer->m_Variance->GetTensorInfo();
116 const TensorInfo& beta = cLayer->m_Beta->GetTensorInfo();
117 const TensorInfo& gamma = cLayer->m_Gamma->GetTensorInfo();
118 result = layerSupportObject->IsBatchNormalizationSupported(
119 OverrideDataType(input, dataType),
120 OverrideDataType(output, dataType),
121 OverrideDataType(mean, dataType),
122 OverrideDataType(var, dataType),
123 OverrideDataType(beta, dataType),
124 OverrideDataType(gamma, dataType),
125 cLayer->GetParameters(),
133 auto cLayer = PolymorphicDowncast<const BatchToSpaceNdLayer*>(&layer);
135 result = layerSupportObject->IsBatchToSpaceNdSupported(OverrideDataType(input, dataType),
136 OverrideDataType(output, dataType),
137 cLayer->GetParameters(),
143 auto cLayer = PolymorphicDowncast<const ComparisonLayer*>(&layer);
149 result = layerSupportObject->IsComparisonSupported(OverrideDataType(input0, dataType),
150 OverrideDataType(input1, dataType),
152 cLayer->GetParameters(),
159 result = layerSupportObject->IsConstantSupported(OverrideDataType(output, dataType), reason);
166 result = layerSupportObject->IsConvertBf16ToFp32Supported(input, output, reason);
173 result = layerSupportObject->IsConvertFp16ToFp32Supported(input, output, reason);
180 result = layerSupportObject->IsConvertFp32ToBf16Supported(input, output, reason);
187 result = layerSupportObject->IsConvertFp32ToFp16Supported(input, output, reason);
192 auto cLayer = PolymorphicDowncast<const Convolution2dLayer*>(&layer);
203 if (descriptor.m_BiasEnabled)
209 result = layerSupportObject->IsConvolution2dSupported(
213 OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType),
223 result = layerSupportObject->IsDebugSupported(OverrideDataType(input, dataType),
224 OverrideDataType(output, dataType),
230 auto cLayer = PolymorphicDowncast<const DepthToSpaceLayer*>(&layer);
235 result = layerSupportObject->IsDepthToSpaceSupported(OverrideDataType(input, dataType),
236 OverrideDataType(output, dataType),
237 cLayer->GetParameters(),
243 auto cLayer = PolymorphicDowncast<const DepthwiseConvolution2dLayer*>(&layer);
253 if (descriptor.m_BiasEnabled)
259 result = layerSupportObject->IsDepthwiseConvolutionSupported(
263 OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType),
273 result = layerSupportObject->IsDequantizeSupported(input,
274 OverrideDataType(output, dataType),
280 auto cLayer = PolymorphicDowncast<const DetectionPostProcessLayer*>(&layer);
291 result = layerSupportObject->IsDetectionPostProcessSupported(boxEncodings,
304 auto cLayer = PolymorphicDowncast<const ElementwiseUnaryLayer*>(&layer);
309 result = layerSupportObject->IsElementwiseUnarySupported(OverrideDataType(input, dataType),
310 OverrideDataType(output, dataType),
311 cLayer->GetParameters(),
317 auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer);
319 result = layerSupportObject->IsFakeQuantizationSupported(OverrideDataType(input, dataType),
320 cLayer->GetParameters(),
328 result = layerSupportObject->IsFloorSupported(OverrideDataType(input, dataType),
329 OverrideDataType(output, dataType),
335 auto cLayer = PolymorphicDowncast<const FullyConnectedLayer*>(&layer);
352 biasInfoPtr = &biasInfo;
357 switch(input.GetDataType())
361 biasInfoPtr = &dummyBFloat16Bias;
366 biasInfoPtr = &dummyFloat16Bias;
371 biasInfoPtr = &dummyFloat32Bias;
379 biasInfoPtr = &dummyQA8Bias;
389 result = layerSupportObject->IsFullyConnectedSupported(
390 OverrideDataType(input, dataType),
391 OverrideDataType(output, dataType),
392 OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType),
403 result = layerSupportObject->IsGatherSupported(OverrideDataType(input0, dataType),
405 OverrideDataType(output, dataType),
412 result = layerSupportObject->IsInputSupported(OverrideDataType(input, dataType), reason);
417 auto cLayer = PolymorphicDowncast<const InstanceNormalizationLayer*>(&layer);
423 result = layerSupportObject->IsInstanceNormalizationSupported(
424 OverrideDataType(input, dataType),
425 OverrideDataType(output, dataType),
432 auto cLayer = PolymorphicDowncast<const L2NormalizationLayer*>(&layer);
438 result = layerSupportObject->IsL2NormalizationSupported(
439 OverrideDataType(input, dataType),
440 OverrideDataType(output, dataType),
447 auto cLayer = PolymorphicDowncast<const LogSoftmaxLayer*>(&layer);
452 result = layerSupportObject->IsLogSoftmaxSupported(OverrideDataType(input, dataType),
453 OverrideDataType(output, dataType),
454 cLayer->GetParameters(),
460 auto cLayer = PolymorphicDowncast<const LstmLayer*>(&layer);
478 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
480 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
482 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
484 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
486 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
488 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
490 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
492 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
494 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
499 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
500 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
501 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
502 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
503 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
504 paramsInfo.m_ForgetGateBias = &forgetGateBias;
505 paramsInfo.m_CellBias = &cellBias;
506 paramsInfo.m_OutputGateBias = &outputGateBias;
523 if(!descriptor.m_CifgEnabled)
525 optInputToInputWeights =
526 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
527 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
529 optRecurrentToInputWeights =
530 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
531 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
533 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
534 paramsInfo.m_InputGateBias = &optInputGateBias;
537 if(descriptor.m_ProjectionEnabled)
539 optProjectionWeights =
540 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
541 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
542 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
545 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
546 paramsInfo.m_ProjectionBias = &optProjectionBias;
550 if(descriptor.m_PeepholeEnabled)
552 if(!descriptor.m_CifgEnabled)
554 optCellToInputWeights =
555 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
557 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
559 optCellToForgetWeights =
560 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
561 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
562 optCellToOutputWeights =
563 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
564 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
567 if(descriptor.m_LayerNormEnabled)
569 if (!descriptor.m_CifgEnabled)
571 optInputLayerNormWeights = OverrideDataType(
572 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
573 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
576 optForgetLayerNormWeights = OverrideDataType(
577 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
578 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
580 optCellLayerNormWeights = OverrideDataType(
581 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
582 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
584 optOutputLayerNormWeights = OverrideDataType(
585 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
586 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
589 result = layerSupportObject->IsLstmSupported(
608 result = layerSupportObject->IsMaximumSupported(OverrideDataType(input0, dataType),
609 OverrideDataType(input1, dataType),
610 OverrideDataType(output, dataType),
619 result = layerSupportObject->IsMemCopySupported(OverrideDataType(input, dataType),
620 OverrideDataType(output, dataType),
629 result = layerSupportObject->IsMemImportSupported(OverrideDataType(input, dataType),
630 OverrideDataType(output, dataType),
640 result = layerSupportObject->IsMergeSupported(OverrideDataType(input0, dataType),
641 OverrideDataType(input1, dataType),
642 OverrideDataType(output, dataType),
648 auto cLayer = PolymorphicDowncast<const ConcatLayer*>(&layer);
651 auto getTensorInfo = [&dataType](
const InputSlot& slot)
653 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
655 auto beginI = boost::make_transform_iterator(layer.
GetInputSlots().begin(), getTensorInfo);
656 auto endI = boost::make_transform_iterator(layer.
GetInputSlots().end(), getTensorInfo);
657 std::vector<TensorInfo> inputs(beginI, endI);
663 auto beginPtr = boost::make_transform_iterator(inputs.begin(), getTensorInfoPtr);
664 auto endPtr = boost::make_transform_iterator(inputs.end(), getTensorInfoPtr);
665 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
669 result = layerSupportObject->IsConcatSupported(inputPtrs, output, cLayer->GetParameters(), reason);
679 result = layerSupportObject->IsMultiplicationSupported(
680 OverrideDataType(input0, dataType),
681 OverrideDataType(input1, dataType),
682 OverrideDataType(output, dataType),
688 auto cLayer = PolymorphicDowncast<const NormalizationLayer*>(&layer);
691 result = layerSupportObject->IsNormalizationSupported(OverrideDataType(input, dataType),
692 OverrideDataType(output, dataType),
693 cLayer->GetParameters(),
700 result = layerSupportObject->IsOutputSupported(OverrideDataType(output, dataType), reason);
705 auto cLayer = PolymorphicDowncast<const PermuteLayer*>(&layer);
708 result = layerSupportObject->IsPermuteSupported(OverrideDataType(input, dataType),
709 OverrideDataType(output, dataType),
710 cLayer->GetParameters(),
716 auto cLayer = PolymorphicDowncast<const PadLayer*>(&layer);
719 result = layerSupportObject->IsPadSupported(
720 OverrideDataType(input, dataType),
721 OverrideDataType(output, dataType),
722 cLayer->GetParameters(),
728 auto cLayer = PolymorphicDowncast<const Pooling2dLayer*>(&layer);
731 result = layerSupportObject->IsPooling2dSupported(OverrideDataType(input, dataType),
732 OverrideDataType(output, dataType),
733 cLayer->GetParameters(),
739 auto cLayer = PolymorphicDowncast<const PreCompiledLayer*>(&layer);
741 result = layerSupportObject->IsPreCompiledSupported(OverrideDataType(input, dataType),
742 cLayer->GetParameters(),
750 result = layerSupportObject->IsQuantizeSupported(input, output, reason);
755 auto cLayer = PolymorphicDowncast<const QLstmLayer*>(&layer);
773 paramsInfo.
m_InputToCellWeights = &cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo();
777 &cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo();
779 &cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo();
781 &cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo();
783 paramsInfo.
m_ForgetGateBias = &cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo();
784 paramsInfo.
m_CellBias = &cLayer->m_BasicParameters.m_CellBias->GetTensorInfo();
785 paramsInfo.
m_OutputGateBias = &cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo();
787 if(!descriptor.m_CifgEnabled)
791 &cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo();
792 paramsInfo.
m_InputGateBias = &cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo();
795 if(descriptor.m_ProjectionEnabled)
797 paramsInfo.
m_ProjectionWeights = &cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo();
800 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
802 paramsInfo.
m_ProjectionBias = &cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo();
806 if(descriptor.m_PeepholeEnabled)
808 if (!descriptor.m_CifgEnabled)
811 &cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo();
815 &cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo();
816 paramsInfo.
m_CellToOutputWeights = &cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo();
819 if(descriptor.m_LayerNormEnabled)
821 if (!descriptor.m_CifgEnabled)
824 &cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo();
828 &cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo();
830 &cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo();
832 &cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo();
835 result = layerSupportObject->IsQLstmSupported(input,
848 auto cLayer = PolymorphicDowncast<const QuantizedLstmLayer*>(&layer);
863 &cLayer->m_QuantizedLstmParameters.m_InputToInputWeights->GetTensorInfo();
865 &cLayer->m_QuantizedLstmParameters.m_InputToForgetWeights->GetTensorInfo();
867 &cLayer->m_QuantizedLstmParameters.m_InputToCellWeights->GetTensorInfo();
869 &cLayer->m_QuantizedLstmParameters.m_InputToOutputWeights->GetTensorInfo();
872 &cLayer->m_QuantizedLstmParameters.m_RecurrentToInputWeights->GetTensorInfo();
874 &cLayer->m_QuantizedLstmParameters.m_RecurrentToForgetWeights->GetTensorInfo();
876 &cLayer->m_QuantizedLstmParameters.m_RecurrentToCellWeights->GetTensorInfo();
878 &cLayer->m_QuantizedLstmParameters.m_RecurrentToOutputWeights->GetTensorInfo();
881 &cLayer->m_QuantizedLstmParameters.m_InputGateBias->GetTensorInfo();
883 &cLayer->m_QuantizedLstmParameters.m_ForgetGateBias->GetTensorInfo();
885 &cLayer->m_QuantizedLstmParameters.m_CellBias->GetTensorInfo();
887 &cLayer->m_QuantizedLstmParameters.m_OutputGateBias->GetTensorInfo();;
889 result = layerSupportObject->IsQuantizedLstmSupported(input,
903 result = layerSupportObject->IsDivisionSupported(
904 OverrideDataType(input0, dataType),
905 OverrideDataType(input1, dataType),
906 OverrideDataType(output, dataType),
912 auto cLayer = PolymorphicDowncast<const ReshapeLayer*>(&layer);
915 result = layerSupportObject->IsReshapeSupported(OverrideDataType(input, dataType),
916 OverrideDataType(output, dataType),
917 cLayer->GetParameters(),
923 auto cLayer = PolymorphicDowncast<const ResizeLayer*>(&layer);
926 result = layerSupportObject->IsResizeSupported(OverrideDataType(input, dataType),
927 OverrideDataType(output, dataType),
928 cLayer->GetParameters(),
934 auto cLayer = PolymorphicDowncast<const SliceLayer*>(&layer);
939 result = layerSupportObject->IsSliceSupported(OverrideDataType(input, dataType),
940 OverrideDataType(output, dataType),
941 cLayer->GetParameters(),
947 auto cLayer = PolymorphicDowncast<const SoftmaxLayer*>(&layer);
950 result = layerSupportObject->IsSoftmaxSupported(OverrideDataType(input, dataType),
951 OverrideDataType(output, dataType),
952 cLayer->GetParameters(),
958 auto cLayer = PolymorphicDowncast<const SpaceToBatchNdLayer*>(&layer);
961 result = layerSupportObject->IsSpaceToBatchNdSupported(OverrideDataType(input, dataType),
962 OverrideDataType(output, dataType),
963 cLayer->GetParameters(),
969 auto cLayer = PolymorphicDowncast<const SpaceToDepthLayer*>(&layer);
974 result = layerSupportObject->IsSpaceToDepthSupported(OverrideDataType(input, dataType),
975 OverrideDataType(output, dataType),
976 cLayer->GetParameters(),
982 auto cLayer = PolymorphicDowncast<const SplitterLayer*>(&layer);
986 auto getTensorInfo = [&dataType](
const OutputSlot& slot)
988 return OverrideDataType(slot.GetTensorInfo(), dataType);
990 auto beginI = boost::make_transform_iterator(layer.
GetOutputSlots().begin(), getTensorInfo);
991 auto endI = boost::make_transform_iterator(layer.
GetOutputSlots().end(), getTensorInfo);
992 std::vector<TensorInfo> outputs(beginI, endI);
994 const std::vector<std::reference_wrapper<TensorInfo>> outputPtrs(outputs.begin(), outputs.end());
996 result = layerSupportObject->IsSplitterSupported(OverrideDataType(input, dataType),
998 cLayer->GetParameters(),
1004 auto cLayer = PolymorphicDowncast<const StackLayer*>(&layer);
1007 auto getTensorInfo = [&dataType](
const InputSlot& slot)
1009 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1011 auto beginI = boost::make_transform_iterator(layer.
GetInputSlots().begin(), getTensorInfo);
1012 auto endI = boost::make_transform_iterator(layer.
GetInputSlots().end(), getTensorInfo);
1013 std::vector<TensorInfo> inputs(beginI, endI);
1019 auto beginPtr = boost::make_transform_iterator(inputs.begin(), getTensorInfoPtr);
1020 auto endPtr = boost::make_transform_iterator(inputs.end(), getTensorInfoPtr);
1021 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
1025 result = layerSupportObject->IsStackSupported(inputPtrs, output, cLayer->GetParameters(), reason);
1031 auto cLayer = PolymorphicDowncast<const StandInLayer*>(&layer);
1034 auto getTensorInfoIn = [&dataType](
const InputSlot& slot)
1036 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1038 auto getTensorInfoOut = [&dataType](
const OutputSlot& slot)
1040 return OverrideDataType(slot.GetTensorInfo(), dataType);
1042 auto beginI = boost::make_transform_iterator(layer.
GetInputSlots().begin(), getTensorInfoIn);
1043 auto endI = boost::make_transform_iterator(layer.
GetInputSlots().end(), getTensorInfoIn);
1044 std::vector<TensorInfo> inputs(beginI, endI);
1046 auto beginO = boost::make_transform_iterator(layer.
GetOutputSlots().begin(), getTensorInfoOut);
1047 auto endO = boost::make_transform_iterator(layer.
GetOutputSlots().end(), getTensorInfoOut);
1048 std::vector<TensorInfo> outputs(beginO, endO);
1055 auto beginPtrI = boost::make_transform_iterator(inputs.begin(), getTensorInfoPtr);
1056 auto endPtrI = boost::make_transform_iterator(inputs.end(), getTensorInfoPtr);
1057 std::vector<const TensorInfo*> inputPtrs(beginPtrI, endPtrI);
1059 auto beginPtrO = boost::make_transform_iterator(outputs.begin(), getTensorInfoPtr);
1060 auto endPtrO = boost::make_transform_iterator(outputs.end(), getTensorInfoPtr);
1061 std::vector<const TensorInfo*> outputPtrs(beginPtrO, endPtrO);
1064 result = layerSupportObject->IsStandInSupported(inputPtrs,
1066 cLayer->GetParameters(),
1072 auto cLayer = PolymorphicDowncast<const StridedSliceLayer*>(&layer);
1075 result = layerSupportObject->IsStridedSliceSupported(OverrideDataType(input, dataType),
1076 OverrideDataType(output, dataType),
1077 cLayer->GetParameters(),
1086 result = layerSupportObject->IsSubtractionSupported(
1087 OverrideDataType(input0, dataType),
1088 OverrideDataType(input1, dataType),
1089 OverrideDataType(output, dataType),
1099 result = layerSupportObject->IsSwitchSupported(OverrideDataType(input0, dataType),
1100 OverrideDataType(input1, dataType),
1101 OverrideDataType(output0, dataType),
1102 OverrideDataType(output1, dataType),
1108 auto cLayer = PolymorphicDowncast<const MeanLayer*>(&layer);
1111 result = layerSupportObject->IsMeanSupported(
1112 OverrideDataType(input, dataType),
1113 OverrideDataType(output, dataType),
1114 cLayer->GetParameters(),
1123 result = layerSupportObject->IsMinimumSupported(OverrideDataType(input0, dataType),
1124 OverrideDataType(input1, dataType),
1125 OverrideDataType(output, dataType),
1134 result = layerSupportObject->IsPreluSupported(OverrideDataType(input, dataType),
1135 OverrideDataType(alpha, dataType),
1136 OverrideDataType(output, dataType),
1142 auto cLayer = PolymorphicDowncast<const TransposeLayer*>(&layer);
1145 result = layerSupportObject->IsTransposeSupported(OverrideDataType(input, dataType),
1146 OverrideDataType(output, dataType),
1147 cLayer->GetParameters(),
1153 auto cLayer = PolymorphicDowncast<const TransposeConvolution2dLayer*>(&layer);
1162 if (descriptor.m_BiasEnabled)
1165 biases = OverrideDataType(cLayer->m_Bias->GetTensorInfo(),
1170 const TensorInfo weights = OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType);
1172 result = layerSupportObject->IsTransposeConvolution2dSupported(input,
1183 ARMNN_ASSERT_MSG(
false,
"WorkloadFactory did not recognise type of layer.");
1184 reason.
value() =
"Unrecognised layer type";
1194 std::string& outReasonIfUnsupported)
1196 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1197 return IsLayerSupported(layer->GetBackendId(), connectableLayer, dataType, outReasonIfUnsupported);
1204 return std::unique_ptr<IWorkload>();
1210 return std::unique_ptr<IWorkload>();
1216 return std::unique_ptr<IWorkload>();
1222 return std::unique_ptr<IWorkload>();
1228 return std::unique_ptr<IWorkload>();
1234 return std::unique_ptr<IWorkload>();
1240 return std::unique_ptr<IWorkload>();
1246 return std::unique_ptr<IWorkload>();
1252 return std::unique_ptr<IWorkload>();
1258 return std::unique_ptr<IWorkload>();
1264 return std::unique_ptr<IWorkload>();
1270 return std::unique_ptr<IWorkload>();
1276 return std::unique_ptr<IWorkload>();
1282 return std::unique_ptr<IWorkload>();
1288 return std::unique_ptr<IWorkload>();
1294 return std::unique_ptr<IWorkload>();
1300 return std::unique_ptr<IWorkload>();
1306 return std::unique_ptr<IWorkload>();
1312 return std::unique_ptr<IWorkload>();
1318 return std::unique_ptr<IWorkload>();
1324 return std::unique_ptr<IWorkload>();
1330 return std::unique_ptr<IWorkload>();
1336 return std::unique_ptr<IWorkload>();
1342 return std::unique_ptr<IWorkload>();
1348 return std::unique_ptr<IWorkload>();
1354 return std::unique_ptr<IWorkload>();
1360 return std::unique_ptr<IWorkload>();
1367 return std::unique_ptr<IWorkload>();
1373 return std::unique_ptr<IWorkload>();
1379 return std::unique_ptr<IWorkload>();
1385 return std::unique_ptr<IWorkload>();
1391 return std::unique_ptr<IWorkload>();
1397 return std::unique_ptr<IWorkload>();
1403 return std::unique_ptr<IWorkload>();
1409 return std::unique_ptr<IWorkload>();
1415 return std::unique_ptr<IWorkload>();
1421 return std::unique_ptr<IWorkload>();
1427 return std::unique_ptr<IWorkload>();
1433 return std::unique_ptr<IWorkload>();
1439 return std::unique_ptr<IWorkload>();
1445 return std::unique_ptr<IWorkload>();
1451 return std::unique_ptr<IWorkload>();
1457 return std::unique_ptr<IWorkload>();
1463 return std::unique_ptr<IWorkload>();
1469 return std::unique_ptr<IWorkload>();
1475 return std::unique_ptr<IWorkload>();
1481 return std::unique_ptr<IWorkload>();
1487 return std::unique_ptr<IWorkload>();
1493 return std::unique_ptr<IWorkload>();
1499 return std::unique_ptr<IWorkload>();
1505 return std::unique_ptr<IWorkload>();
1511 return std::unique_ptr<IWorkload>();
1517 return std::unique_ptr<IWorkload>();
1523 return std::unique_ptr<IWorkload>();
1529 return std::unique_ptr<IWorkload>();
1535 return std::unique_ptr<IWorkload>();
1541 return std::unique_ptr<IWorkload>();
1547 return std::unique_ptr<IWorkload>();
1553 return std::unique_ptr<IWorkload>();
1559 return std::unique_ptr<IWorkload>();
1565 return std::unique_ptr<IWorkload>();
1571 return std::unique_ptr<IWorkload>();
1577 return std::unique_ptr<IWorkload>();
1584 return std::unique_ptr<IWorkload>();
virtual std::unique_ptr< IWorkload > CreateSplitter(const SplitterQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateBatchNormalization(const BatchNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMemCopy(const MemCopyQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateL2Normalization(const L2NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const
Interface for a layer that is connectable to other layers via InputSlots and OutputSlots.
virtual std::unique_ptr< IWorkload > CreateBatchToSpaceNd(const BatchToSpaceNdQueueDescriptor &descriptor, const WorkloadInfo &Info) const
virtual std::unique_ptr< IWorkload > CreateMultiplication(const MultiplicationQueueDescriptor &descriptor, const WorkloadInfo &info) const
A TransposeConvolution2dDescriptor for the TransposeConvolution2dLayer.
virtual std::unique_ptr< IWorkload > CreateInstanceNormalization(const InstanceNormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateGreater(const GreaterQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateArgMinMax(const ArgMinMaxQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMerger(const MergerQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateLogSoftmax(const LogSoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateResizeBilinear(const ResizeBilinearQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateStridedSlice(const StridedSliceQueueDescriptor &descriptor, const WorkloadInfo &Info) const
A Convolution2dDescriptor for the Convolution2dLayer.
virtual std::unique_ptr< IWorkload > CreateStack(const StackQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateLstm(const LstmQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateFakeQuantization(const FakeQuantizationQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateQuantizedLstm(const QuantizedLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateQLstm(const QLstmQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateConstant(const ConstantQueueDescriptor &descriptor, const WorkloadInfo &info) const
BackendRegistry & BackendRegistryInstance()
virtual std::unique_ptr< IWorkload > CreateElementwiseUnary(const ElementwiseUnaryQueueDescriptor &descriptor, const WorkloadInfo &Info) const
std::vector< float > boxEncodings({ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f })
virtual std::unique_ptr< IWorkload > CreateAbs(const AbsQueueDescriptor &descriptor, const WorkloadInfo &info) const
Copyright (c) 2020 ARM Limited.
const std::vector< InputSlot > & GetInputSlots() const
virtual std::unique_ptr< IWorkload > CreateActivation(const ActivationQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateRsqrt(const RsqrtQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateTranspose(const TransposeQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateDivision(const DivisionQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateConvertFp32ToBf16(const ConvertFp32ToBf16QueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMaximum(const MaximumQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateConcat(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMerge(const MergeQueueDescriptor &descriptor, const WorkloadInfo &info) const
const InputSlot & GetInputSlot(unsigned int index) const override
Get a const input slot handle by slot index.
armnn::Optional< armnn::DataType > GetBiasTypeFromWeightsType(armnn::Optional< armnn::DataType > weightsType)
virtual std::unique_ptr< IWorkload > CreateConvertBf16ToFp32(const ConvertBf16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateEqual(const EqualQueueDescriptor &descriptor, const WorkloadInfo &Info) const
virtual std::unique_ptr< IWorkload > CreateDetectionPostProcess(const DetectionPostProcessQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateSpaceToBatchNd(const SpaceToBatchNdQueueDescriptor &descriptor, const WorkloadInfo &info) const
An LstmDescriptor for the LstmLayer.
virtual std::unique_ptr< IWorkload > CreateResize(const ResizeQueueDescriptor &descriptor, const WorkloadInfo &info) const
#define ARMNN_ASSERT_MSG(COND, MSG)
A L2NormalizationDescriptor for the L2NormalizationLayer.
An ArgMinMaxDescriptor for ArgMinMaxLayer.
virtual std::unique_ptr< IWorkload > CreateQuantize(const QuantizeQueueDescriptor &descriptor, const WorkloadInfo &Info) const
A FullyConnectedDescriptor for the FullyConnectedLayer.
bool m_BiasEnabled
Enable/disable bias.
virtual std::unique_ptr< IWorkload > CreateSwitch(const SwitchQueueDescriptor &descriptor, const WorkloadInfo &Info) const
virtual std::unique_ptr< IWorkload > CreatePad(const PadQueueDescriptor &descriptor, const WorkloadInfo &Info) const
#define ARMNN_ASSERT(COND)
A QLstmDescriptor for the QLstmLayer.
static bool IsLayerSupported(const BackendId &backendId, const IConnectableLayer &layer, Optional< DataType > dataType, std::string &outReasonIfUnsupported)
virtual std::unique_ptr< IWorkload > CreateNormalization(const NormalizationQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreatePermute(const PermuteQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateComparison(const ComparisonQueueDescriptor &descriptor, const WorkloadInfo &Info) const
const std::vector< OutputSlot > & GetOutputSlots() const
virtual std::unique_ptr< IWorkload > CreatePooling2d(const Pooling2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateGather(const GatherQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateConvertFp32ToFp16(const ConvertFp32ToFp16QueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMinimum(const MinimumQueueDescriptor &descriptor, const WorkloadInfo &info) const
std::vector< float > scores({ 0.0f, 0.9f, 0.8f, 0.0f, 0.75f, 0.72f, 0.0f, 0.6f, 0.5f, 0.0f, 0.93f, 0.95f, 0.0f, 0.5f, 0.4f, 0.0f, 0.3f, 0.2f })
virtual std::unique_ptr< IWorkload > CreateDepthToSpace(const DepthToSpaceQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateAddition(const AdditionQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateTransposeConvolution2d(const TransposeConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const
virtual std::unique_ptr< IWorkload > CreateOutput(const OutputQueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerType GetType() const
const OutputSlot & GetOutputSlot(unsigned int index=0) const override
Get the const output slot handle by slot index.
virtual const TensorInfo & GetTensorInfo() const =0
virtual std::unique_ptr< IWorkload > CreateSoftmax(const SoftmaxQueueDescriptor &descriptor, const WorkloadInfo &info) const
Contains information about inputs and outputs to a layer.
virtual const char * GetName() const =0
Returns the name of the layer.
virtual std::unique_ptr< IWorkload > CreateFullyConnected(const FullyConnectedQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateDepthwiseConvolution2d(const DepthwiseConvolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateFloor(const FloorQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateMemImport(const MemImportQueueDescriptor &descriptor, const WorkloadInfo &info) const
An InstanceNormalizationDescriptor for InstanceNormalizationLayer.
virtual std::unique_ptr< IWorkload > CreateSubtraction(const SubtractionQueueDescriptor &descriptor, const WorkloadInfo &info) const
const TensorInfo & GetTensorInfo() const override
virtual std::unique_ptr< IWorkload > CreatePreCompiled(const PreCompiledQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreateConvertFp16ToFp32(const ConvertFp16ToFp32QueueDescriptor &descriptor, const WorkloadInfo &info) const
A DepthwiseConvolution2dDescriptor for the DepthwiseConvolution2dLayer.
virtual std::unique_ptr< IWorkload > CreateConvolution2d(const Convolution2dQueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< IWorkload > CreatePrelu(const PreluQueueDescriptor &descriptor, const WorkloadInfo &info) const
std::vector< float > anchors({ 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 0.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 10.5f, 1.0f, 1.0f, 0.5f, 100.5f, 1.0f, 1.0f })
virtual std::unique_ptr< IWorkload > CreateDequantize(const DequantizeQueueDescriptor &descriptor, const WorkloadInfo &info) const