26 using LayerList = std::list<Layer*>;
27 using Iterator = LayerList::const_iterator;
29 const TensorInfo OverrideDataType(
const TensorInfo& info, Optional<DataType> type)
36 return TensorInfo(
info.GetShape(),
38 info.GetQuantizationScale(),
39 info.GetQuantizationOffset(),
52 switch(weightsType.
value())
64 ARMNN_ASSERT_MSG(
false,
"GetBiasTypeFromWeightsType(): Unsupported data type.");
70 bool IWorkloadFactory::IsLayerConfigurationSupported(
const BackendId& backendId,
71 const IConnectableLayer& connectableLayer,
72 Optional<DataType> dataType,
73 std::string& outReasonIfUnsupported,
76 Optional<std::string&> reason = outReasonIfUnsupported;
78 const Layer& layer = *(PolymorphicDowncast<const Layer*>(&connectableLayer));
81 if (!backendRegistry.IsBackendRegistered(backendId))
84 ss << connectableLayer.GetName() <<
" is not supported on " << backendId
85 <<
" because this backend is not registered.";
87 outReasonIfUnsupported = ss.str();
91 auto backendFactory = backendRegistry.GetFactory(backendId);
92 auto backendObject = backendFactory();
93 auto layerSupport = backendObject->GetLayerSupport(modelOptions);
94 auto layerSupportObject = LayerSupportHandle(layerSupport, 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(),
113 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
114 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
116 result = layerSupportObject.IsAdditionSupported(
117 OverrideDataType(input0, dataType),
118 OverrideDataType(input1, dataType),
119 OverrideDataType(output, dataType),
126 auto cLayer = PolymorphicDowncast<const ArgMinMaxLayer*>(&layer);
127 const ArgMinMaxDescriptor& descriptor = cLayer->GetParameters();
129 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
130 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
131 result = layerSupportObject.IsArgMinMaxSupported(
132 OverrideDataType(input, dataType),
140 auto cLayer = PolymorphicDowncast<const BatchMatMulLayer*>(&layer);
141 const BatchMatMulDescriptor& descriptor = cLayer->GetParameters();
143 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
144 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
145 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
146 result = layerSupportObject.IsBatchMatMulSupported(
147 OverrideDataType(input0, dataType),
148 OverrideDataType(input1, dataType),
149 OverrideDataType(output, dataType),
156 auto cLayer = PolymorphicDowncast<const BatchNormalizationLayer*>(&layer);
157 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
158 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
159 const TensorInfo& mean = cLayer->m_Mean->GetTensorInfo();
160 const TensorInfo& var = cLayer->m_Variance->GetTensorInfo();
161 const TensorInfo& beta = cLayer->m_Beta->GetTensorInfo();
162 const TensorInfo& gamma = cLayer->m_Gamma->GetTensorInfo();
163 result = layerSupportObject.IsBatchNormalizationSupported(
164 OverrideDataType(input, dataType),
165 OverrideDataType(output, dataType),
166 OverrideDataType(mean, dataType),
167 OverrideDataType(var, dataType),
168 OverrideDataType(beta, dataType),
169 OverrideDataType(gamma, dataType),
170 cLayer->GetParameters(),
176 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
177 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
178 auto cLayer = PolymorphicDowncast<const BatchToSpaceNdLayer*>(&layer);
180 result = layerSupportObject.IsBatchToSpaceNdSupported(OverrideDataType(input, dataType),
181 OverrideDataType(output, dataType),
182 cLayer->GetParameters(),
188 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
189 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
191 result = layerSupportObject.IsCastSupported(OverrideDataType(input, dataType),
192 OverrideDataType(output, dataType),
198 auto cLayer = PolymorphicDowncast<const ChannelShuffleLayer*>(&layer);
200 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
201 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
203 const ChannelShuffleDescriptor descriptor = cLayer->GetParameters();
205 result = layerSupportObject.IsChannelShuffleSupported(OverrideDataType(input, dataType),
206 OverrideDataType(output, dataType),
213 auto cLayer = PolymorphicDowncast<const ComparisonLayer*>(&layer);
215 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
216 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
217 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
219 result = layerSupportObject.IsComparisonSupported(OverrideDataType(input0, dataType),
220 OverrideDataType(input1, dataType),
222 cLayer->GetParameters(),
228 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
229 result = layerSupportObject.IsConstantSupported(OverrideDataType(output, dataType), reason);
234 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
235 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
236 result = layerSupportObject.IsConvertFp16ToFp32Supported(input, output, reason);
241 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
242 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
243 result = layerSupportObject.IsConvertFp32ToFp16Supported(input, output, reason);
248 auto cLayer = PolymorphicDowncast<const Convolution2dLayer*>(&layer);
250 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
252 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
254 "Convolution2dLayer: Weights should be connected as a Constant Layer.");
255 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
258 const Convolution2dDescriptor& descriptor = cLayer->GetParameters();
261 Optional<TensorInfo> biases;
262 if (descriptor.m_BiasEnabled)
265 "Convolution2dLayer: Bias should be connected as a Constant Layer.");
266 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
270 result = layerSupportObject.IsConvolution2dSupported(
281 auto cLayer = PolymorphicDowncast<const Convolution3dLayer*>(&layer);
283 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
285 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
288 "Convolution3dLayer: Weights should be connected as a Constant Layer.");
289 const TensorInfo weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
292 const Convolution3dDescriptor& descriptor = cLayer->GetParameters();
295 Optional<TensorInfo> biases;
296 if (descriptor.m_BiasEnabled)
298 biases = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
302 result = layerSupportObject.IsConvolution3dSupported(
313 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
314 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
316 result = layerSupportObject.IsDebugSupported(OverrideDataType(input, dataType),
317 OverrideDataType(output, dataType),
323 auto cLayer = PolymorphicDowncast<const DepthToSpaceLayer*>(&layer);
325 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
326 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
328 result = layerSupportObject.IsDepthToSpaceSupported(OverrideDataType(input, dataType),
329 OverrideDataType(output, dataType),
330 cLayer->GetParameters(),
336 auto cLayer = PolymorphicDowncast<const DepthwiseConvolution2dLayer*>(&layer);
337 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
339 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
340 const TensorInfo& weights = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
343 ARMNN_ASSERT(cLayer->GetInputSlot(1).GetConnection() !=
nullptr);
345 const DepthwiseConvolution2dDescriptor& descriptor = cLayer->GetParameters();
348 Optional<TensorInfo> biases;
349 if (descriptor.m_BiasEnabled)
351 biases = OverrideDataType(cLayer->GetInputSlot(2).GetConnection()->GetTensorInfo(),
355 result = layerSupportObject.IsDepthwiseConvolutionSupported(input,
365 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
366 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
368 result = layerSupportObject.IsDequantizeSupported(input,
369 OverrideDataType(output, dataType),
375 auto cLayer = PolymorphicDowncast<const DetectionPostProcessLayer*>(&layer);
376 const TensorInfo& boxEncodings = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
377 const TensorInfo& scores = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
378 const TensorInfo& anchors = cLayer->m_Anchors->GetTensorInfo();
380 const TensorInfo& detectionBoxes = layer.GetOutputSlot(0).GetTensorInfo();
381 const TensorInfo& detectionClasses = layer.GetOutputSlot(1).GetTensorInfo();
382 const TensorInfo& detectionScores = layer.GetOutputSlot(2).GetTensorInfo();
383 const TensorInfo& numDetections = layer.GetOutputSlot(3).GetTensorInfo();
385 const DetectionPostProcessDescriptor& descriptor = cLayer->GetParameters();
386 result = layerSupportObject.IsDetectionPostProcessSupported(boxEncodings,
399 auto cLayer = PolymorphicDowncast<const ElementwiseBinaryLayer*>(&layer);
401 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
402 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
403 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
404 std::vector<TensorInfo> infos = { OverrideDataType(input0, dataType),
405 OverrideDataType(input1, dataType),
406 OverrideDataType(output, dataType) };
409 cLayer->GetParameters(),
417 auto cLayer = PolymorphicDowncast<const ElementwiseUnaryLayer*>(&layer);
419 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
420 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
422 result = layerSupportObject.IsElementwiseUnarySupported(OverrideDataType(input, dataType),
423 OverrideDataType(output, dataType),
424 cLayer->GetParameters(),
430 auto cLayer = PolymorphicDowncast<const FillLayer*>(&layer);
431 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
432 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
433 const FillDescriptor& descriptor = cLayer->GetParameters();
435 result = layerSupportObject.IsFillSupported(
436 OverrideDataType(input, dataType),
437 OverrideDataType(output, dataType),
444 auto cLayer = PolymorphicDowncast<const FakeQuantizationLayer*>(&layer);
445 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
446 result = layerSupportObject.IsFakeQuantizationSupported(OverrideDataType(input, dataType),
447 cLayer->GetParameters(),
453 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
454 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
455 result = layerSupportObject.IsFloorSupported(OverrideDataType(input, dataType),
456 OverrideDataType(output, dataType),
462 auto cLayer = PolymorphicDowncast<const FullyConnectedLayer*>(&layer);
463 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
464 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
466 const FullyConnectedDescriptor& descriptor = cLayer->GetParameters();
467 TensorInfo weightsInfo;
468 const TensorInfo* weightsInfoPtr =
nullptr;
470 weightsInfo = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(), dataType);
471 weightsInfoPtr = &weightsInfo;
474 const TensorInfo* biasInfoPtr =
nullptr;
475 static const TensorInfo dummyBFloat16Bias(TensorShape({1,1,1,1}),
DataType::BFloat16);
476 static const TensorInfo dummyFloat16Bias(TensorShape({1,1,1,1}),
DataType::Float16);
477 static const TensorInfo dummyFloat32Bias(TensorShape({1,1,1,1}),
DataType::Float32);
480 if (descriptor.m_BiasEnabled)
482 biasInfo = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(), dataType);
483 biasInfoPtr = &biasInfo;
488 switch(input.GetDataType())
492 biasInfoPtr = &dummyBFloat16Bias;
497 biasInfoPtr = &dummyFloat16Bias;
502 biasInfoPtr = &dummyFloat32Bias;
510 biasInfoPtr = &dummyQA8Bias;
519 result = layerSupportObject.IsFullyConnectedSupported(
520 OverrideDataType(input, dataType),
521 OverrideDataType(output, dataType),
530 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
531 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
532 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
533 auto cLayer = PolymorphicDowncast<const GatherLayer*>(&layer);
534 const GatherDescriptor& descriptor = cLayer->GetParameters();
535 result = layerSupportObject.IsGatherSupported(OverrideDataType(input0, dataType),
537 OverrideDataType(output, dataType),
544 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
545 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
546 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
547 result = layerSupportObject.IsGatherNdSupported(OverrideDataType(input0, dataType),
549 OverrideDataType(output, dataType),
555 const TensorInfo& input = layer.GetOutputSlot(0).GetTensorInfo();
556 result = layerSupportObject.IsInputSupported(OverrideDataType(input, dataType), reason);
561 auto cLayer = PolymorphicDowncast<const InstanceNormalizationLayer*>(&layer);
562 const InstanceNormalizationDescriptor& descriptor = cLayer->GetParameters();
564 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
565 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
567 result = layerSupportObject.IsInstanceNormalizationSupported(
568 OverrideDataType(input, dataType),
569 OverrideDataType(output, dataType),
576 auto cLayer = PolymorphicDowncast<const L2NormalizationLayer*>(&layer);
577 const L2NormalizationDescriptor& descriptor = cLayer->GetParameters();
579 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
580 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
582 result = layerSupportObject.IsL2NormalizationSupported(
583 OverrideDataType(input, dataType),
584 OverrideDataType(output, dataType),
591 auto cLayer = PolymorphicDowncast<const LogicalBinaryLayer*>(&layer);
593 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
594 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
595 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
597 result = layerSupportObject.IsLogicalBinarySupported(input0,
600 cLayer->GetParameters(),
606 auto cLayer = PolymorphicDowncast<const LogSoftmaxLayer*>(&layer);
608 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
609 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
611 result = layerSupportObject.IsLogSoftmaxSupported(OverrideDataType(input, dataType),
612 OverrideDataType(output, dataType),
613 cLayer->GetParameters(),
619 auto cLayer = PolymorphicDowncast<const LstmLayer*>(&layer);
620 const LstmDescriptor& descriptor = cLayer->GetParameters();
623 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
625 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
627 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
630 const TensorInfo& scratchBuffer = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
631 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
632 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
633 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(3).GetTensorInfo(), dataType);
636 const TensorInfo& inputToForgetWeights
637 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
638 const TensorInfo& inputToCellWeights
639 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
640 const TensorInfo& inputToOutputWeights
641 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
642 const TensorInfo& recurrentToForgetWeights
643 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
644 const TensorInfo& recurrentToCellWeights
645 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
646 const TensorInfo& recurrentToOutputWeights
647 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
648 const TensorInfo& forgetGateBias
649 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
650 const TensorInfo& cellBias
651 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
652 const TensorInfo& outputGateBias
653 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
655 LstmInputParamsInfo paramsInfo;
657 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
658 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
659 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
660 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
661 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
662 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
663 paramsInfo.m_ForgetGateBias = &forgetGateBias;
664 paramsInfo.m_CellBias = &cellBias;
665 paramsInfo.m_OutputGateBias = &outputGateBias;
669 TensorInfo optInputToInputWeights;
670 TensorInfo optRecurrentToInputWeights;
671 TensorInfo optCellToInputWeights;
672 TensorInfo optInputGateBias;
673 TensorInfo optProjectionWeights;
674 TensorInfo optProjectionBias;
675 TensorInfo optCellToForgetWeights;
676 TensorInfo optCellToOutputWeights;
677 TensorInfo optInputLayerNormWeights;
678 TensorInfo optForgetLayerNormWeights;
679 TensorInfo optCellLayerNormWeights;
680 TensorInfo optOutputLayerNormWeights;
682 if(!descriptor.m_CifgEnabled)
684 optInputToInputWeights =
685 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
686 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
688 optRecurrentToInputWeights =
689 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
690 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
692 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
693 paramsInfo.m_InputGateBias = &optInputGateBias;
696 if(descriptor.m_ProjectionEnabled)
698 optProjectionWeights =
699 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
700 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
701 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
704 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
705 paramsInfo.m_ProjectionBias = &optProjectionBias;
709 if(descriptor.m_PeepholeEnabled)
711 if(!descriptor.m_CifgEnabled)
713 optCellToInputWeights =
714 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
716 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
718 optCellToForgetWeights =
719 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
720 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
721 optCellToOutputWeights =
722 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
723 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
726 if(descriptor.m_LayerNormEnabled)
728 if (!descriptor.m_CifgEnabled)
730 optInputLayerNormWeights = OverrideDataType(
731 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
732 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
735 optForgetLayerNormWeights = OverrideDataType(
736 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
737 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
739 optCellLayerNormWeights = OverrideDataType(
740 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
741 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
743 optOutputLayerNormWeights = OverrideDataType(
744 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
745 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
748 result = layerSupportObject.IsLstmSupported(
764 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
765 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
766 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
768 result = layerSupportObject.IsMaximumSupported(OverrideDataType(input0, dataType),
769 OverrideDataType(input1, dataType),
770 OverrideDataType(output, dataType),
777 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
778 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
780 result = layerSupportObject.IsMemCopySupported(OverrideDataType(input, dataType),
781 OverrideDataType(output, dataType),
787 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
788 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
790 result = layerSupportObject.IsMemImportSupported(OverrideDataType(input, dataType),
791 OverrideDataType(output, dataType),
797 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
798 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
799 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
801 result = layerSupportObject.IsMergeSupported(OverrideDataType(input0, dataType),
802 OverrideDataType(input1, dataType),
803 OverrideDataType(output, dataType),
809 auto cLayer = PolymorphicDowncast<const ConcatLayer*>(&layer);
812 auto getTensorInfo = [&dataType](
const InputSlot& slot)
814 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
819 std::vector<TensorInfo> inputs(beginI, endI);
821 auto getTensorInfoPtr = [](
const TensorInfo&
info)
828 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
830 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
832 result = layerSupportObject.IsConcatSupported(inputPtrs, output, cLayer->GetParameters(), reason);
840 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
841 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
842 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
843 result = layerSupportObject.IsMultiplicationSupported(
844 OverrideDataType(input0, dataType),
845 OverrideDataType(input1, dataType),
846 OverrideDataType(output, dataType),
853 auto cLayer = PolymorphicDowncast<const NormalizationLayer*>(&layer);
854 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
855 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
856 result = layerSupportObject.IsNormalizationSupported(OverrideDataType(input, dataType),
857 OverrideDataType(output, dataType),
858 cLayer->GetParameters(),
864 const TensorInfo& output = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
865 result = layerSupportObject.IsOutputSupported(OverrideDataType(output, dataType), reason);
870 auto cLayer = PolymorphicDowncast<const PermuteLayer*>(&layer);
871 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
872 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
873 result = layerSupportObject.IsPermuteSupported(OverrideDataType(input, dataType),
874 OverrideDataType(output, dataType),
875 cLayer->GetParameters(),
881 auto cLayer = PolymorphicDowncast<const PadLayer*>(&layer);
882 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
883 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
884 result = layerSupportObject.IsPadSupported(
885 OverrideDataType(input, dataType),
886 OverrideDataType(output, dataType),
887 cLayer->GetParameters(),
893 auto cLayer = PolymorphicDowncast<const Pooling2dLayer*>(&layer);
894 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
895 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
896 result = layerSupportObject.IsPooling2dSupported(OverrideDataType(input, dataType),
897 OverrideDataType(output, dataType),
898 cLayer->GetParameters(),
904 auto cLayer = PolymorphicDowncast<const Pooling3dLayer*>(&layer);
905 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
906 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
907 result = layerSupportObject.IsPooling3dSupported(OverrideDataType(input, dataType),
908 OverrideDataType(output, dataType),
909 cLayer->GetParameters(),
915 auto cLayer = PolymorphicDowncast<const PreCompiledLayer*>(&layer);
916 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
917 result = layerSupportObject.IsPreCompiledSupported(OverrideDataType(input, dataType),
918 cLayer->GetParameters(),
924 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
925 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
926 result = layerSupportObject.IsQuantizeSupported(input, output, reason);
931 auto cLayer = PolymorphicDowncast<const QLstmLayer*>(&layer);
932 const QLstmDescriptor& descriptor = cLayer->GetParameters();
935 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
936 const TensorInfo& previousOutputIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
937 const TensorInfo& previousCellStateIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
940 const TensorInfo& outputStateOut = layer.GetOutputSlot(0).GetTensorInfo();
941 const TensorInfo& cellStateOut = layer.GetOutputSlot(1).GetTensorInfo();
942 const TensorInfo& output = layer.GetOutputSlot(2).GetTensorInfo();
945 LstmInputParamsInfo paramsInfo;
948 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToForgetWeights.get() !=
nullptr);
949 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToCellWeights.get() !=
nullptr);
950 ARMNN_ASSERT(cLayer->m_BasicParameters.m_InputToOutputWeights.get() !=
nullptr);
951 paramsInfo.m_InputToForgetWeights = &cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo();
952 paramsInfo.m_InputToCellWeights = &cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo();
953 paramsInfo.m_InputToOutputWeights = &cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo();
955 paramsInfo.m_RecurrentToForgetWeights =
956 &cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo();
957 paramsInfo.m_RecurrentToCellWeights =
958 &cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo();
959 paramsInfo.m_RecurrentToOutputWeights =
960 &cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo();
962 paramsInfo.m_ForgetGateBias = &cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo();
963 paramsInfo.m_CellBias = &cLayer->m_BasicParameters.m_CellBias->GetTensorInfo();
964 paramsInfo.m_OutputGateBias = &cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo();
966 if(!descriptor.m_CifgEnabled)
968 paramsInfo.m_InputToInputWeights = &cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo();
969 paramsInfo.m_RecurrentToInputWeights =
970 &cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo();
971 paramsInfo.m_InputGateBias = &cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo();
974 if(descriptor.m_ProjectionEnabled)
976 paramsInfo.m_ProjectionWeights = &cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo();
979 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
981 paramsInfo.m_ProjectionBias = &cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo();
985 if(descriptor.m_PeepholeEnabled)
987 if (!descriptor.m_CifgEnabled)
989 paramsInfo.m_CellToInputWeights =
990 &cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo();
993 paramsInfo.m_CellToForgetWeights =
994 &cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo();
995 paramsInfo.m_CellToOutputWeights = &cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo();
998 if(descriptor.m_LayerNormEnabled)
1000 if (!descriptor.m_CifgEnabled)
1002 paramsInfo.m_InputLayerNormWeights =
1003 &cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo();
1006 paramsInfo.m_ForgetLayerNormWeights =
1007 &cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo();
1008 paramsInfo.m_CellLayerNormWeights =
1009 &cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo();
1010 paramsInfo.m_OutputLayerNormWeights =
1011 &cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo();
1014 result = layerSupportObject.IsQLstmSupported(input,
1016 previousCellStateIn,
1027 auto cLayer = PolymorphicDowncast<const QuantizedLstmLayer*>(&layer);
1030 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1031 const TensorInfo& previousCellStateIn = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1032 const TensorInfo& previousOutputIn = layer.GetInputSlot(2).GetConnection()->GetTensorInfo();
1035 const TensorInfo& cellStateOut = layer.GetOutputSlot(0).GetTensorInfo();
1036 const TensorInfo& output = layer.GetOutputSlot(1).GetTensorInfo();
1039 QuantizedLstmInputParamsInfo paramsInfo;
1041 paramsInfo.m_InputToInputWeights =
1042 &cLayer->m_QuantizedLstmParameters.m_InputToInputWeights->GetTensorInfo();
1043 paramsInfo.m_InputToForgetWeights =
1044 &cLayer->m_QuantizedLstmParameters.m_InputToForgetWeights->GetTensorInfo();
1045 paramsInfo.m_InputToCellWeights =
1046 &cLayer->m_QuantizedLstmParameters.m_InputToCellWeights->GetTensorInfo();
1047 paramsInfo.m_InputToOutputWeights =
1048 &cLayer->m_QuantizedLstmParameters.m_InputToOutputWeights->GetTensorInfo();
1050 paramsInfo.m_RecurrentToInputWeights =
1051 &cLayer->m_QuantizedLstmParameters.m_RecurrentToInputWeights->GetTensorInfo();
1052 paramsInfo.m_RecurrentToForgetWeights =
1053 &cLayer->m_QuantizedLstmParameters.m_RecurrentToForgetWeights->GetTensorInfo();
1054 paramsInfo.m_RecurrentToCellWeights =
1055 &cLayer->m_QuantizedLstmParameters.m_RecurrentToCellWeights->GetTensorInfo();
1056 paramsInfo.m_RecurrentToOutputWeights =
1057 &cLayer->m_QuantizedLstmParameters.m_RecurrentToOutputWeights->GetTensorInfo();
1059 paramsInfo.m_InputGateBias =
1060 &cLayer->m_QuantizedLstmParameters.m_InputGateBias->GetTensorInfo();
1061 paramsInfo.m_ForgetGateBias =
1062 &cLayer->m_QuantizedLstmParameters.m_ForgetGateBias->GetTensorInfo();
1063 paramsInfo.m_CellBias =
1064 &cLayer->m_QuantizedLstmParameters.m_CellBias->GetTensorInfo();
1065 paramsInfo.m_OutputGateBias =
1066 &cLayer->m_QuantizedLstmParameters.m_OutputGateBias->GetTensorInfo();;
1068 result = layerSupportObject.IsQuantizedLstmSupported(input,
1069 previousCellStateIn,
1080 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1081 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1082 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1083 result = layerSupportObject.IsDivisionSupported(
1084 OverrideDataType(input0, dataType),
1085 OverrideDataType(input1, dataType),
1086 OverrideDataType(output, dataType),
1093 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1094 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1095 result = layerSupportObject.IsRankSupported(OverrideDataType(input, dataType),
1096 OverrideDataType(output, dataType),
1102 auto cLayer = PolymorphicDowncast<const ReshapeLayer*>(&layer);
1103 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1104 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1105 result = layerSupportObject.IsReshapeSupported(OverrideDataType(input, dataType),
1106 OverrideDataType(output, dataType),
1107 cLayer->GetParameters(),
1113 auto cLayer = PolymorphicDowncast<const ResizeLayer*>(&layer);
1114 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1115 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1116 result = layerSupportObject.IsResizeSupported(OverrideDataType(input, dataType),
1117 OverrideDataType(output, dataType),
1118 cLayer->GetParameters(),
1124 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1125 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1127 result = layerSupportObject.IsShapeSupported(OverrideDataType(input, dataType),
1128 OverrideDataType(output, dataType),
1134 auto cLayer = PolymorphicDowncast<const SliceLayer*>(&layer);
1136 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1137 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1139 result = layerSupportObject.IsSliceSupported(OverrideDataType(input, dataType),
1140 OverrideDataType(output, dataType),
1141 cLayer->GetParameters(),
1147 auto cLayer = PolymorphicDowncast<const SoftmaxLayer*>(&layer);
1148 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1149 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1150 result = layerSupportObject.IsSoftmaxSupported(OverrideDataType(input, dataType),
1151 OverrideDataType(output, dataType),
1152 cLayer->GetParameters(),
1158 auto cLayer = PolymorphicDowncast<const SpaceToBatchNdLayer*>(&layer);
1159 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1160 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1161 result = layerSupportObject.IsSpaceToBatchNdSupported(OverrideDataType(input, dataType),
1162 OverrideDataType(output, dataType),
1163 cLayer->GetParameters(),
1169 auto cLayer = PolymorphicDowncast<const SpaceToDepthLayer*>(&layer);
1171 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1172 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1174 result = layerSupportObject.IsSpaceToDepthSupported(OverrideDataType(input, dataType),
1175 OverrideDataType(output, dataType),
1176 cLayer->GetParameters(),
1182 auto cLayer = PolymorphicDowncast<const SplitterLayer*>(&layer);
1183 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1186 auto getTensorInfo = [&dataType](
const OutputSlot& slot)
1188 return OverrideDataType(slot.GetTensorInfo(), dataType);
1192 std::vector<TensorInfo> outputs(beginI, endI);
1194 const std::vector<std::reference_wrapper<TensorInfo>> outputPtrs(outputs.begin(), outputs.end());
1196 result = layerSupportObject.IsSplitterSupported(OverrideDataType(input, dataType),
1198 cLayer->GetParameters(),
1204 auto cLayer = PolymorphicDowncast<const StackLayer*>(&layer);
1207 auto getTensorInfo = [&dataType](
const InputSlot& slot)
1209 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1213 std::vector<TensorInfo> inputs(beginI, endI);
1215 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1221 std::vector<const TensorInfo*> inputPtrs(beginPtr, endPtr);
1223 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1225 result = layerSupportObject.IsStackSupported(inputPtrs, output, cLayer->GetParameters(), reason);
1231 auto cLayer = PolymorphicDowncast<const StandInLayer*>(&layer);
1234 auto getTensorInfoIn = [&dataType](
const InputSlot& slot)
1236 return OverrideDataType(slot.GetConnectedOutputSlot()->GetTensorInfo(), dataType);
1238 auto getTensorInfoOut = [&dataType](
const OutputSlot& slot)
1240 return OverrideDataType(slot.GetTensorInfo(), dataType);
1244 std::vector<TensorInfo> inputs(beginI, endI);
1248 std::vector<TensorInfo> outputs(beginO, endO);
1251 auto getTensorInfoPtr = [](
const TensorInfo&
info)
1257 std::vector<const TensorInfo*> inputPtrs(beginPtrI, endPtrI);
1261 std::vector<const TensorInfo*> outputPtrs(beginPtrO, endPtrO);
1264 result = layerSupportObject.IsStandInSupported(inputPtrs,
1266 cLayer->GetParameters(),
1272 auto cLayer = PolymorphicDowncast<const StridedSliceLayer*>(&layer);
1273 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1274 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1275 result = layerSupportObject.IsStridedSliceSupported(OverrideDataType(input, dataType),
1276 OverrideDataType(output, dataType),
1277 cLayer->GetParameters(),
1284 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1285 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1286 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1287 result = layerSupportObject.IsSubtractionSupported(
1288 OverrideDataType(input0, dataType),
1289 OverrideDataType(input1, dataType),
1290 OverrideDataType(output, dataType),
1297 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1298 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1299 const TensorInfo& output0 = layer.GetOutputSlot(0).GetTensorInfo();
1300 const TensorInfo& output1 = layer.GetOutputSlot(1).GetTensorInfo();
1301 result = layerSupportObject.IsSwitchSupported(OverrideDataType(input0, dataType),
1302 OverrideDataType(input1, dataType),
1303 OverrideDataType(output0, dataType),
1304 OverrideDataType(output1, dataType),
1310 auto cLayer = PolymorphicDowncast<const MeanLayer*>(&layer);
1311 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1312 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1313 result = layerSupportObject.IsMeanSupported(
1314 OverrideDataType(input, dataType),
1315 OverrideDataType(output, dataType),
1316 cLayer->GetParameters(),
1323 const TensorInfo& input0 = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1324 const TensorInfo& input1 = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1325 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1326 result = layerSupportObject.IsMinimumSupported(OverrideDataType(input0, dataType),
1327 OverrideDataType(input1, dataType),
1328 OverrideDataType(output, dataType),
1335 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1336 const TensorInfo& alpha = layer.GetInputSlot(1).GetConnection()->GetTensorInfo();
1337 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1338 result = layerSupportObject.IsPreluSupported(OverrideDataType(input, dataType),
1339 OverrideDataType(alpha, dataType),
1340 OverrideDataType(output, dataType),
1346 auto cLayer = PolymorphicDowncast<const TransposeLayer*>(&layer);
1347 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1348 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1349 result = layerSupportObject.IsTransposeSupported(OverrideDataType(input, dataType),
1350 OverrideDataType(output, dataType),
1351 cLayer->GetParameters(),
1357 auto cLayer = PolymorphicDowncast<const TransposeConvolution2dLayer*>(&layer);
1359 const TensorInfo input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1361 const TensorInfo output = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1363 const TransposeConvolution2dDescriptor& descriptor = cLayer->GetParameters();
1365 Optional<TensorInfo> biases;
1366 if (descriptor.m_BiasEnabled)
1369 biases = OverrideDataType(cLayer->m_Bias->GetTensorInfo(),
1374 const TensorInfo weights = OverrideDataType(cLayer->m_Weight->GetTensorInfo(), dataType);
1376 result = layerSupportObject.IsTransposeConvolution2dSupported(input,
1387 auto cLayer = PolymorphicDowncast<const ReduceLayer*>(&layer);
1388 const TensorInfo& input = layer.GetInputSlot(0).GetConnection()->GetTensorInfo();
1389 const TensorInfo& output = layer.GetOutputSlot(0).GetTensorInfo();
1391 result = layerSupportObject.IsReduceSupported(OverrideDataType(input, dataType),
1392 OverrideDataType(output, dataType),
1393 cLayer->GetParameters(),
1399 auto cLayer = PolymorphicDowncast<const UnidirectionalSequenceLstmLayer*>(&layer);
1403 const TensorInfo& input = OverrideDataType(layer.GetInputSlot(0).GetConnection()->GetTensorInfo(),
1405 const TensorInfo& outputStateIn = OverrideDataType(layer.GetInputSlot(1).GetConnection()->GetTensorInfo(),
1407 const TensorInfo& cellStateIn = OverrideDataType(layer.GetInputSlot(2).GetConnection()->GetTensorInfo(),
1410 const TensorInfo& outputStateOut = OverrideDataType(layer.GetOutputSlot(0).GetTensorInfo(), dataType);
1411 const TensorInfo& cellStateOut = OverrideDataType(layer.GetOutputSlot(1).GetTensorInfo(), dataType);
1412 const TensorInfo& output = OverrideDataType(layer.GetOutputSlot(2).GetTensorInfo(), dataType);
1415 const TensorInfo& inputToForgetWeights
1416 = OverrideDataType(cLayer->m_BasicParameters.m_InputToForgetWeights->GetTensorInfo(), dataType);
1417 const TensorInfo& inputToCellWeights
1418 = OverrideDataType(cLayer->m_BasicParameters.m_InputToCellWeights->GetTensorInfo(), dataType);
1419 const TensorInfo& inputToOutputWeights
1420 = OverrideDataType(cLayer->m_BasicParameters.m_InputToOutputWeights->GetTensorInfo(), dataType);
1421 const TensorInfo& recurrentToForgetWeights
1422 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToForgetWeights->GetTensorInfo(), dataType);
1423 const TensorInfo& recurrentToCellWeights
1424 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToCellWeights->GetTensorInfo(), dataType);
1425 const TensorInfo& recurrentToOutputWeights
1426 = OverrideDataType(cLayer->m_BasicParameters.m_RecurrentToOutputWeights->GetTensorInfo(), dataType);
1427 const TensorInfo& forgetGateBias
1428 = OverrideDataType(cLayer->m_BasicParameters.m_ForgetGateBias->GetTensorInfo(), dataType);
1429 const TensorInfo& cellBias
1430 = OverrideDataType(cLayer->m_BasicParameters.m_CellBias->GetTensorInfo(), dataType);
1431 const TensorInfo& outputGateBias
1432 = OverrideDataType(cLayer->m_BasicParameters.m_OutputGateBias->GetTensorInfo(), dataType);
1434 LstmInputParamsInfo paramsInfo;
1436 paramsInfo.m_InputToForgetWeights = &inputToForgetWeights;
1437 paramsInfo.m_InputToCellWeights = &inputToCellWeights;
1438 paramsInfo.m_InputToOutputWeights = &inputToOutputWeights;
1439 paramsInfo.m_RecurrentToForgetWeights = &recurrentToForgetWeights;
1440 paramsInfo.m_RecurrentToCellWeights = &recurrentToCellWeights;
1441 paramsInfo.m_RecurrentToOutputWeights = &recurrentToOutputWeights;
1442 paramsInfo.m_ForgetGateBias = &forgetGateBias;
1443 paramsInfo.m_CellBias = &cellBias;
1444 paramsInfo.m_OutputGateBias = &outputGateBias;
1447 TensorInfo optInputToInputWeights;
1448 TensorInfo optRecurrentToInputWeights;
1449 TensorInfo optCellToInputWeights;
1450 TensorInfo optInputGateBias;
1451 TensorInfo optProjectionWeights;
1452 TensorInfo optProjectionBias;
1453 TensorInfo optCellToForgetWeights;
1454 TensorInfo optCellToOutputWeights;
1455 TensorInfo optInputLayerNormWeights;
1456 TensorInfo optForgetLayerNormWeights;
1457 TensorInfo optCellLayerNormWeights;
1458 TensorInfo optOutputLayerNormWeights;
1460 if(!descriptor.m_CifgEnabled)
1462 optInputToInputWeights =
1463 OverrideDataType(cLayer->m_CifgParameters.m_InputToInputWeights->GetTensorInfo(), dataType);
1464 paramsInfo.m_InputToInputWeights = &optInputToInputWeights;
1466 optRecurrentToInputWeights =
1467 OverrideDataType(cLayer->m_CifgParameters.m_RecurrentToInputWeights->GetTensorInfo(), dataType);
1468 paramsInfo.m_RecurrentToInputWeights = &optRecurrentToInputWeights;
1470 OverrideDataType(cLayer->m_CifgParameters.m_InputGateBias->GetTensorInfo(), dataType);
1471 paramsInfo.m_InputGateBias = &optInputGateBias;
1474 if(descriptor.m_ProjectionEnabled)
1476 optProjectionWeights =
1477 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionWeights->GetTensorInfo(), dataType);
1478 paramsInfo.m_ProjectionWeights = &optProjectionWeights;
1479 if (cLayer->m_ProjectionParameters.m_ProjectionBias !=
nullptr)
1482 OverrideDataType(cLayer->m_ProjectionParameters.m_ProjectionBias->GetTensorInfo(), dataType);
1483 paramsInfo.m_ProjectionBias = &optProjectionBias;
1487 if(descriptor.m_PeepholeEnabled)
1489 if(!descriptor.m_CifgEnabled)
1491 optCellToInputWeights =
1492 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToInputWeights->GetTensorInfo(),
1494 paramsInfo.m_CellToInputWeights = &optCellToInputWeights;
1496 optCellToForgetWeights =
1497 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToForgetWeights->GetTensorInfo(), dataType);
1498 paramsInfo.m_CellToForgetWeights = &optCellToForgetWeights;
1499 optCellToOutputWeights =
1500 OverrideDataType(cLayer->m_PeepholeParameters.m_CellToOutputWeights->GetTensorInfo(), dataType);
1501 paramsInfo.m_CellToOutputWeights = &optCellToOutputWeights;
1504 if(descriptor.m_LayerNormEnabled)
1506 if (!descriptor.m_CifgEnabled)
1508 optInputLayerNormWeights = OverrideDataType(
1509 cLayer->m_LayerNormParameters.m_InputLayerNormWeights->GetTensorInfo(), dataType);
1510 paramsInfo.m_InputLayerNormWeights = &optInputLayerNormWeights;
1513 optForgetLayerNormWeights = OverrideDataType(
1514 cLayer->m_LayerNormParameters.m_ForgetLayerNormWeights->GetTensorInfo(), dataType);
1515 paramsInfo.m_ForgetLayerNormWeights = &optForgetLayerNormWeights;
1517 optCellLayerNormWeights = OverrideDataType(
1518 cLayer->m_LayerNormParameters.m_CellLayerNormWeights->GetTensorInfo(), dataType);
1519 paramsInfo.m_CellLayerNormWeights = &optCellLayerNormWeights;
1521 optOutputLayerNormWeights = OverrideDataType(
1522 cLayer->m_LayerNormParameters.m_OutputLayerNormWeights->GetTensorInfo(), dataType);
1523 paramsInfo.m_OutputLayerNormWeights = &optOutputLayerNormWeights;
1526 result = layerSupportObject.IsUnidirectionalSequenceLstmSupported(input,
1539 ARMNN_ASSERT_MSG(
false,
"WorkloadFactory did not recognise type of layer.");
1540 reason.value() =
"Unrecognised layer type";
1551 std::string& outReasonIfUnsupported)
1553 return IsLayerConfigurationSupported(backendId, connectableLayer, dataType, outReasonIfUnsupported);
1558 std::string& outReasonIfUnsupported)
1560 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1561 return IsLayerConfigurationSupported(layer->GetBackendId(), connectableLayer, dataType, outReasonIfUnsupported);
1566 std::string& outReasonIfUnsupported,
1569 auto layer = PolymorphicDowncast<const Layer*>(&connectableLayer);
1570 return IsLayerConfigurationSupported(layer->GetBackendId(),
1573 outReasonIfUnsupported,
1580 std::string& outReasonIfUnsupported,
1583 return IsLayerConfigurationSupported(backendId,
1586 outReasonIfUnsupported,
1598 auto activationQueueDescriptor = PolymorphicDowncast<const ActivationQueueDescriptor*>(&descriptor);
1599 return CreateActivation(*activationQueueDescriptor,
info);
1603 auto additionQueueDescriptor = PolymorphicDowncast<const AdditionQueueDescriptor*>(&descriptor);
1604 return CreateAddition(*additionQueueDescriptor,
info);
1608 auto argMinMaxQueueDescriptor = PolymorphicDowncast<const ArgMinMaxQueueDescriptor*>(&descriptor);
1609 return CreateArgMinMax(*argMinMaxQueueDescriptor,
info);
1613 auto batchNormQueueDescriptor = PolymorphicDowncast<const BatchNormalizationQueueDescriptor*>(&descriptor);
1614 return CreateBatchNormalization(*batchNormQueueDescriptor,
info);
1618 auto batchToSpaceNdQueueDescriptor
1619 = PolymorphicDowncast<const BatchToSpaceNdQueueDescriptor*>(&descriptor);
1620 return CreateBatchToSpaceNd(*batchToSpaceNdQueueDescriptor,
info);
1624 auto castQueueDescriptor = PolymorphicDowncast<const CastQueueDescriptor*>(&descriptor);
1625 return CreateCast(*castQueueDescriptor,
info);
1629 auto channelShuffleQueueDescriptor
1630 = PolymorphicDowncast<const ChannelShuffleQueueDescriptor*>(&descriptor);
1631 return CreateChannelShuffle(*channelShuffleQueueDescriptor,
info);
1635 auto comparisonQueueDescriptor = PolymorphicDowncast<const ComparisonQueueDescriptor*>(&descriptor);
1636 return CreateComparison(*comparisonQueueDescriptor,
info);
1640 auto concatQueueDescriptor = PolymorphicDowncast<const ConcatQueueDescriptor*>(&descriptor);
1641 return CreateConcat(*concatQueueDescriptor,
info);
1645 auto constantQueueDescriptor = PolymorphicDowncast<const ConstantQueueDescriptor*>(&descriptor);
1646 return CreateConstant(*constantQueueDescriptor,
info);
1650 auto convertFp16ToFp32QueueDescriptor
1651 = PolymorphicDowncast<const ConvertFp16ToFp32QueueDescriptor*>(&descriptor);
1652 return CreateConvertFp16ToFp32(*convertFp16ToFp32QueueDescriptor,
info);
1656 auto convertFp32ToFp16QueueDescriptor
1657 = PolymorphicDowncast<const ConvertFp32ToFp16QueueDescriptor*>(&descriptor);
1658 return CreateConvertFp32ToFp16(*convertFp32ToFp16QueueDescriptor,
info);
1662 auto convolution2dQueueDescriptor = PolymorphicDowncast<const Convolution2dQueueDescriptor*>(&descriptor);
1663 return CreateConvolution2d(*convolution2dQueueDescriptor,
info);
1667 auto convolution3dQueueDescriptor = PolymorphicDowncast<const Convolution3dQueueDescriptor*>(&descriptor);
1668 return CreateConvolution3d(*convolution3dQueueDescriptor,
info);
1672 auto debugQueueDescriptor = PolymorphicDowncast<const DebugQueueDescriptor*>(&descriptor);
1673 return CreateDebug(*debugQueueDescriptor,
info);
1677 auto depthToSpaceQueueDescriptor = PolymorphicDowncast<const DepthToSpaceQueueDescriptor*>(&descriptor);
1678 return CreateDepthToSpace(*depthToSpaceQueueDescriptor,
info);
1682 auto depthwiseConvolution2DQueueDescriptor
1683 = PolymorphicDowncast<const DepthwiseConvolution2dQueueDescriptor*>(&descriptor);
1684 return CreateDepthwiseConvolution2d(*depthwiseConvolution2DQueueDescriptor,
info);
1688 auto dequantizeQueueDescriptor = PolymorphicDowncast<const DequantizeQueueDescriptor*>(&descriptor);
1689 return CreateDequantize(*dequantizeQueueDescriptor,
info);
1693 auto detectionPostProcessQueueDescriptor
1694 = PolymorphicDowncast<const DetectionPostProcessQueueDescriptor*>(&descriptor);
1695 return CreateDetectionPostProcess(*detectionPostProcessQueueDescriptor,
info);
1699 auto divisionQueueDescriptor = PolymorphicDowncast<const DivisionQueueDescriptor*>(&descriptor);
1700 return CreateDivision(*divisionQueueDescriptor,
info);
1704 auto queueDescriptor = PolymorphicDowncast<const ElementwiseBinaryQueueDescriptor*>(&descriptor);
1709 auto elementwiseUnaryQueueDescriptor
1710 = PolymorphicDowncast<const ElementwiseUnaryQueueDescriptor*>(&descriptor);
1711 return CreateElementwiseUnary(*elementwiseUnaryQueueDescriptor,
info);
1716 auto fakeQuantizationQueueDescriptor
1717 = PolymorphicDowncast<const FakeQuantizationQueueDescriptor*>(&descriptor);
1718 return CreateFakeQuantization(*fakeQuantizationQueueDescriptor,
info);
1722 auto fillQueueDescriptor = PolymorphicDowncast<const FillQueueDescriptor*>(&descriptor);
1723 return CreateFill(*fillQueueDescriptor,
info);
1727 auto floorQueueDescriptor = PolymorphicDowncast<const FloorQueueDescriptor*>(&descriptor);
1728 return CreateFloor(*floorQueueDescriptor,
info);
1732 auto fullyConnectedQueueDescriptor
1733 = PolymorphicDowncast<const FullyConnectedQueueDescriptor*>(&descriptor);
1734 return CreateFullyConnected(*fullyConnectedQueueDescriptor,
info);
1738 auto gatherQueueDescriptor = PolymorphicDowncast<const GatherQueueDescriptor*>(&descriptor);
1739 return CreateGather(*gatherQueueDescriptor,
info);
1743 auto inputQueueDescriptor = PolymorphicDowncast<const InputQueueDescriptor*>(&descriptor);
1744 return CreateInput(*inputQueueDescriptor,
info);
1748 auto instanceNormalizationQueueDescriptor
1749 = PolymorphicDowncast<const InstanceNormalizationQueueDescriptor*>(&descriptor);
1750 return CreateInstanceNormalization(*instanceNormalizationQueueDescriptor,
info);
1754 auto l2NormalizationQueueDescriptor
1755 = PolymorphicDowncast<const L2NormalizationQueueDescriptor*>(&descriptor);
1756 return CreateL2Normalization(*l2NormalizationQueueDescriptor,
info);
1760 auto logicalBinaryQueueDescriptor = PolymorphicDowncast<const LogicalBinaryQueueDescriptor*>(&descriptor);
1761 return CreateLogicalBinary(*logicalBinaryQueueDescriptor,
info);
1765 auto logSoftmaxQueueDescriptor = PolymorphicDowncast<const LogSoftmaxQueueDescriptor*>(&descriptor);
1766 return CreateLogSoftmax(*logSoftmaxQueueDescriptor,
info);
1770 auto lstmQueueDescriptor = PolymorphicDowncast<const LstmQueueDescriptor*>(&descriptor);
1771 return CreateLstm(*lstmQueueDescriptor,
info);
1775 auto maximumQueueDescriptor = PolymorphicDowncast<const MaximumQueueDescriptor*>(&descriptor);
1776 return CreateMaximum(*maximumQueueDescriptor,
info);
1780 auto meanQueueDescriptor = PolymorphicDowncast<const MeanQueueDescriptor*>(&descriptor);
1781 return CreateMean(*meanQueueDescriptor,
info);
1785 auto memCopyQueueDescriptor = PolymorphicDowncast<const MemCopyQueueDescriptor*>(&descriptor);
1786 return CreateMemCopy(*memCopyQueueDescriptor,
info);
1790 auto memImportQueueDescriptor = PolymorphicDowncast<const MemImportQueueDescriptor*>(&descriptor);
1791 return CreateMemImport(*memImportQueueDescriptor,
info);
1795 auto minimumQueueDescriptor = PolymorphicDowncast<const MinimumQueueDescriptor*>(&descriptor);
1796 return CreateMinimum(*minimumQueueDescriptor,
info);
1800 auto multiplicationQueueDescriptor
1801 = PolymorphicDowncast<const MultiplicationQueueDescriptor*>(&descriptor);
1802 return CreateMultiplication(*multiplicationQueueDescriptor,
info);
1806 auto normalizationQueueDescriptor = PolymorphicDowncast<const NormalizationQueueDescriptor*>(&descriptor);
1807 return CreateNormalization(*normalizationQueueDescriptor,
info);
1811 auto outputQueueDescriptor = PolymorphicDowncast<const OutputQueueDescriptor*>(&descriptor);
1812 return CreateOutput(*outputQueueDescriptor,
info);
1816 auto padQueueDescriptor = PolymorphicDowncast<const PadQueueDescriptor*>(&descriptor);
1817 return CreatePad(*padQueueDescriptor,
info);
1821 auto permuteQueueDescriptor = PolymorphicDowncast<const PermuteQueueDescriptor*>(&descriptor);
1822 return CreatePermute(*permuteQueueDescriptor,
info);
1826 auto pooling2dQueueDescriptor = PolymorphicDowncast<const Pooling2dQueueDescriptor*>(&descriptor);
1827 return CreatePooling2d(*pooling2dQueueDescriptor,
info);
1831 auto pooling3dQueueDescriptor = PolymorphicDowncast<const Pooling3dQueueDescriptor*>(&descriptor);
1832 return CreatePooling3d(*pooling3dQueueDescriptor,
info);
1836 auto preCompiledQueueDescriptor = PolymorphicDowncast<const PreCompiledQueueDescriptor*>(&descriptor);
1837 return CreatePreCompiled(*preCompiledQueueDescriptor,
info);
1841 auto preluQueueDescriptor = PolymorphicDowncast<const PreluQueueDescriptor*>(&descriptor);
1842 return CreatePrelu(*preluQueueDescriptor,
info);
1846 auto qlstmQueueDescriptor = PolymorphicDowncast<const QLstmQueueDescriptor*>(&descriptor);
1847 return CreateQLstm(*qlstmQueueDescriptor,
info);
1851 auto quantizeQueueDescriptor = PolymorphicDowncast<const QuantizeQueueDescriptor*>(&descriptor);
1852 return CreateQuantize(*quantizeQueueDescriptor,
info);
1856 auto rankQueueDescriptor = PolymorphicDowncast<const RankQueueDescriptor*>(&descriptor);
1857 return CreateRank(*rankQueueDescriptor,
info);
1861 auto reduceQueueDescriptor = PolymorphicDowncast<const ReduceQueueDescriptor*>(&descriptor);
1862 return CreateReduce(*reduceQueueDescriptor,
info);
1866 auto reshapeQueueDescriptor = PolymorphicDowncast<const ReshapeQueueDescriptor*>(&descriptor);
1867 return CreateReshape(*reshapeQueueDescriptor,
info);
1871 auto resizeQueueDescriptor = PolymorphicDowncast<const ResizeQueueDescriptor*>(&descriptor);
1872 return CreateResize(*resizeQueueDescriptor,
info);
1876 auto shapeQueueDescriptor = PolymorphicDowncast<const ShapeQueueDescriptor*>(&descriptor);
1877 return CreateShape(*shapeQueueDescriptor,
info);
1881 auto sliceQueueDescriptor = PolymorphicDowncast<const SliceQueueDescriptor*>(&descriptor);
1882 return CreateSlice(*sliceQueueDescriptor,
info);
1886 auto softmaxQueueDescriptor = PolymorphicDowncast<const SoftmaxQueueDescriptor*>(&descriptor);
1887 return CreateSoftmax(*softmaxQueueDescriptor,
info);
1891 auto spaceToBatchNdQueueDescriptor
1892 = PolymorphicDowncast<const SpaceToBatchNdQueueDescriptor*>(&descriptor);
1893 return CreateSpaceToBatchNd(*spaceToBatchNdQueueDescriptor,
info);
1897 auto spaceToDepthQueueDescriptor = PolymorphicDowncast<const SpaceToDepthQueueDescriptor*>(&descriptor);
1898 return CreateSpaceToDepth(*spaceToDepthQueueDescriptor,
info);
1902 auto splitterQueueDescriptor = PolymorphicDowncast<const SplitterQueueDescriptor*>(&descriptor);
1903 return CreateSplitter(*splitterQueueDescriptor,
info);
1907 auto stackQueueDescriptor = PolymorphicDowncast<const StackQueueDescriptor*>(&descriptor);
1908 return CreateStack(*stackQueueDescriptor,
info);
1912 auto stridedSliceQueueDescriptor = PolymorphicDowncast<const StridedSliceQueueDescriptor*>(&descriptor);
1913 return CreateStridedSlice(*stridedSliceQueueDescriptor,
info);
1917 auto subtractionQueueDescriptor = PolymorphicDowncast<const SubtractionQueueDescriptor*>(&descriptor);
1918 return CreateSubtraction(*subtractionQueueDescriptor,
info);
1922 auto transposeQueueDescriptor = PolymorphicDowncast<const TransposeQueueDescriptor*>(&descriptor);
1923 return CreateTranspose(*transposeQueueDescriptor,
info);
1927 auto transposeConvolution2dQueueDescriptor
1928 = PolymorphicDowncast<const TransposeConvolution2dQueueDescriptor*>(&descriptor);
1929 return CreateTransposeConvolution2d(*transposeConvolution2dQueueDescriptor,
info);
1933 auto unidirectionalSequenceLstmQueueDescriptor
1934 = PolymorphicDowncast<const UnidirectionalSequenceLstmQueueDescriptor*>(&descriptor);
1935 return CreateUnidirectionalSequenceLstm(*unidirectionalSequenceLstmQueueDescriptor,
info);
1946 return std::unique_ptr<IWorkload>();
1949 std::unique_ptr<IWorkload> IWorkloadFactory::CreateAddition(
const AdditionQueueDescriptor& ,
1950 const WorkloadInfo& )
const
1952 return std::unique_ptr<IWorkload>();
1955 std::unique_ptr<IWorkload> IWorkloadFactory::CreateArgMinMax(
const ArgMinMaxQueueDescriptor& ,
1956 const WorkloadInfo& )
const
1958 return std::unique_ptr<IWorkload>();
1961 std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchNormalization(
1962 const BatchNormalizationQueueDescriptor& ,
const WorkloadInfo& )
const
1964 return std::unique_ptr<IWorkload>();
1967 std::unique_ptr<IWorkload> IWorkloadFactory::CreateBatchToSpaceNd(
const BatchToSpaceNdQueueDescriptor& ,
1968 const WorkloadInfo& )
const
1970 return std::unique_ptr<IWorkload>();
1973 std::unique_ptr<IWorkload> IWorkloadFactory::CreateCast(
const CastQueueDescriptor& ,
1974 const WorkloadInfo& )
const
1976 return std::unique_ptr<IWorkload>();
1979 std::unique_ptr<IWorkload> IWorkloadFactory::CreateChannelShuffle(
const ChannelShuffleQueueDescriptor& ,
1980 const WorkloadInfo& )
const
1982 return std::unique_ptr<IWorkload>();
1985 std::unique_ptr<IWorkload> IWorkloadFactory::CreateComparison(
const ComparisonQueueDescriptor& ,
1986 const WorkloadInfo& )
const
1988 return std::unique_ptr<IWorkload>();
1991 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConcat(
const ConcatQueueDescriptor& ,
1992 const WorkloadInfo& )
const
1994 return std::unique_ptr<IWorkload>();
1997 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConstant(
const ConstantQueueDescriptor& ,
1998 const WorkloadInfo& )
const
2000 return std::unique_ptr<IWorkload>();
2003 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp16ToFp32(
const ConvertFp16ToFp32QueueDescriptor& ,
2004 const WorkloadInfo& )
const
2006 return std::unique_ptr<IWorkload>();
2009 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvertFp32ToFp16(
const ConvertFp32ToFp16QueueDescriptor& ,
2010 const WorkloadInfo& )
const
2012 return std::unique_ptr<IWorkload>();
2015 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution2d(
const Convolution2dQueueDescriptor& ,
2016 const WorkloadInfo& )
const
2018 return std::unique_ptr<IWorkload>();
2021 std::unique_ptr<IWorkload> IWorkloadFactory::CreateConvolution3d(
const Convolution3dQueueDescriptor& ,
2022 const WorkloadInfo& )
const
2024 return std::unique_ptr<IWorkload>();
2027 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDebug(
const DebugQueueDescriptor& ,
2028 const WorkloadInfo& )
const
2030 return std::unique_ptr<IWorkload>();
2033 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthToSpace(
const DepthToSpaceQueueDescriptor& ,
2034 const WorkloadInfo& )
const
2036 return std::unique_ptr<IWorkload>();
2039 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDepthwiseConvolution2d(
2040 const DepthwiseConvolution2dQueueDescriptor& ,
const WorkloadInfo& )
const
2042 return std::unique_ptr<IWorkload>();
2045 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDequantize(
2046 const DequantizeQueueDescriptor& ,
const WorkloadInfo& )
const
2048 return std::unique_ptr<IWorkload>();
2051 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDetectionPostProcess(
2052 const DetectionPostProcessQueueDescriptor& ,
const WorkloadInfo& )
const
2054 return std::unique_ptr<IWorkload>();
2057 std::unique_ptr<IWorkload> IWorkloadFactory::CreateDivision(
const DivisionQueueDescriptor& ,
2058 const WorkloadInfo& )
const
2060 return std::unique_ptr<IWorkload>();
2063 std::unique_ptr<IWorkload> IWorkloadFactory::CreateElementwiseUnary(
const ElementwiseUnaryQueueDescriptor& ,
2064 const WorkloadInfo& )
const
2066 return std::unique_ptr<IWorkload>();
2069 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFakeQuantization(
const FakeQuantizationQueueDescriptor& ,
2070 const WorkloadInfo& )
const
2072 return std::unique_ptr<IWorkload>();
2075 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFill(
const FillQueueDescriptor& ,
2076 const WorkloadInfo& )
const
2078 return std::unique_ptr<IWorkload>();
2081 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFloor(
const FloorQueueDescriptor& ,
2082 const WorkloadInfo& )
const
2084 return std::unique_ptr<IWorkload>();
2087 std::unique_ptr<IWorkload> IWorkloadFactory::CreateFullyConnected(
const FullyConnectedQueueDescriptor& ,
2088 const WorkloadInfo& )
const
2090 return std::unique_ptr<IWorkload>();
2093 std::unique_ptr<IWorkload> IWorkloadFactory::CreateGather(
const GatherQueueDescriptor& ,
2094 const WorkloadInfo& )
const
2096 return std::unique_ptr<IWorkload>();
2099 std::unique_ptr<IWorkload> IWorkloadFactory::CreateInstanceNormalization(
2100 const InstanceNormalizationQueueDescriptor& ,
2101 const WorkloadInfo& )
const
2103 return std::unique_ptr<IWorkload>();
2106 std::unique_ptr<IWorkload> IWorkloadFactory::CreateL2Normalization(
const L2NormalizationQueueDescriptor& ,
2107 const WorkloadInfo& )
const
2109 return std::unique_ptr<IWorkload>();
2112 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalBinary(
const LogicalBinaryQueueDescriptor& ,
2113 const WorkloadInfo& )
const
2115 return std::unique_ptr<IWorkload>();
2118 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogicalUnary(
const ElementwiseUnaryQueueDescriptor& ,
2119 const WorkloadInfo& )
const
2121 return std::unique_ptr<IWorkload>();
2124 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLogSoftmax(
const LogSoftmaxQueueDescriptor& ,
2125 const WorkloadInfo& )
const
2127 return std::unique_ptr<IWorkload>();
2130 std::unique_ptr<IWorkload> IWorkloadFactory::CreateLstm(
const LstmQueueDescriptor& ,
2131 const WorkloadInfo& )
const
2133 return std::unique_ptr<IWorkload>();
2136 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMaximum(
const MaximumQueueDescriptor& ,
2137 const WorkloadInfo& )
const
2139 return std::unique_ptr<IWorkload>();
2142 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMean(
const MeanQueueDescriptor& ,
2143 const WorkloadInfo& )
const
2145 return std::unique_ptr<IWorkload>();
2148 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemCopy(
const MemCopyQueueDescriptor& ,
2149 const WorkloadInfo& )
const
2151 return std::unique_ptr<IWorkload>();
2154 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMemImport(
const MemImportQueueDescriptor& ,
2155 const WorkloadInfo& )
const
2157 return std::unique_ptr<IWorkload>();
2160 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMerge(
const MergeQueueDescriptor& ,
2161 const WorkloadInfo& )
const
2163 return std::unique_ptr<IWorkload>();
2166 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMinimum(
const MinimumQueueDescriptor& ,
2167 const WorkloadInfo& )
const
2169 return std::unique_ptr<IWorkload>();
2172 std::unique_ptr<IWorkload> IWorkloadFactory::CreateMultiplication(
const MultiplicationQueueDescriptor& ,
2173 const WorkloadInfo& )
const
2175 return std::unique_ptr<IWorkload>();
2178 std::unique_ptr<IWorkload> IWorkloadFactory::CreateNormalization(
const NormalizationQueueDescriptor& ,
2179 const WorkloadInfo& )
const
2181 return std::unique_ptr<IWorkload>();
2185 const WorkloadInfo& )
const
2187 return std::unique_ptr<IWorkload>();
2190 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePad(
const PadQueueDescriptor& ,
2191 const WorkloadInfo& )
const
2193 return std::unique_ptr<IWorkload>();
2196 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePermute(
const PermuteQueueDescriptor& ,
2197 const WorkloadInfo& )
const
2199 return std::unique_ptr<IWorkload>();
2202 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling2d(
const Pooling2dQueueDescriptor& ,
2203 const WorkloadInfo& )
const
2205 return std::unique_ptr<IWorkload>();
2208 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePooling3d(
const Pooling3dQueueDescriptor& ,
2209 const WorkloadInfo& )
const
2211 return std::unique_ptr<IWorkload>();
2214 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePreCompiled(
const PreCompiledQueueDescriptor& ,
2215 const WorkloadInfo& )
const
2217 return std::unique_ptr<IWorkload>();
2220 std::unique_ptr<IWorkload> IWorkloadFactory::CreatePrelu(
const PreluQueueDescriptor &,
2221 const WorkloadInfo &)
const
2223 return std::unique_ptr<IWorkload>();
2226 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantize(
const QuantizeQueueDescriptor& ,
2227 const WorkloadInfo& )
const
2229 return std::unique_ptr<IWorkload>();
2232 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQLstm(
const QLstmQueueDescriptor& ,
2233 const WorkloadInfo& )
const
2235 return std::unique_ptr<IWorkload>();
2238 std::unique_ptr<IWorkload> IWorkloadFactory::CreateQuantizedLstm(
const QuantizedLstmQueueDescriptor& ,
2239 const WorkloadInfo& )
const
2241 return std::unique_ptr<IWorkload>();
2243 std::unique_ptr<IWorkload> IWorkloadFactory::CreateRank(
const RankQueueDescriptor& ,
2244 const WorkloadInfo& )
const
2246 return std::unique_ptr<IWorkload>();
2249 std::unique_ptr<IWorkload> IWorkloadFactory::CreateReduce(
const ReduceQueueDescriptor& ,
2250 const WorkloadInfo& )
const
2252 return std::unique_ptr<IWorkload>();
2255 std::unique_ptr<IWorkload> IWorkloadFactory::CreateReshape(
const ReshapeQueueDescriptor& ,
2256 const WorkloadInfo& )
const
2258 return std::unique_ptr<IWorkload>();
2261 std::unique_ptr<IWorkload> IWorkloadFactory::CreateResize(
const ResizeQueueDescriptor& ,
2262 const WorkloadInfo& )
const
2264 return std::unique_ptr<IWorkload>();
2267 std::unique_ptr<IWorkload> IWorkloadFactory::CreateShape(
const ShapeQueueDescriptor& ,
2268 const WorkloadInfo& )
const
2270 return std::unique_ptr<IWorkload>();
2273 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSlice(
const SliceQueueDescriptor& ,
2274 const WorkloadInfo& )
const
2276 return std::unique_ptr<IWorkload>();
2279 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSoftmax(
const SoftmaxQueueDescriptor& ,
2280 const WorkloadInfo& )
const
2282 return std::unique_ptr<IWorkload>();
2285 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSplitter(
const SplitterQueueDescriptor& ,
2286 const WorkloadInfo& )
const
2288 return std::unique_ptr<IWorkload>();
2291 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToBatchNd(
const SpaceToBatchNdQueueDescriptor& ,
2292 const WorkloadInfo& )
const
2294 return std::unique_ptr<IWorkload>();
2297 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSpaceToDepth(
const SpaceToDepthQueueDescriptor& ,
2298 const WorkloadInfo& )
const
2300 return std::unique_ptr<IWorkload>();
2303 std::unique_ptr<IWorkload> IWorkloadFactory::CreateStack(
const StackQueueDescriptor& ,
2304 const WorkloadInfo& )
const
2306 return std::unique_ptr<IWorkload>();
2309 std::unique_ptr<IWorkload> IWorkloadFactory::CreateStridedSlice(
const StridedSliceQueueDescriptor& ,
2310 const WorkloadInfo& )
const
2312 return std::unique_ptr<IWorkload>();
2315 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSubtraction(
const SubtractionQueueDescriptor& ,
2316 const WorkloadInfo& )
const
2318 return std::unique_ptr<IWorkload>();
2321 std::unique_ptr<IWorkload> IWorkloadFactory::CreateSwitch(
const SwitchQueueDescriptor& ,
2322 const WorkloadInfo& )
const
2324 return std::unique_ptr<IWorkload>();
2327 std::unique_ptr<IWorkload> IWorkloadFactory::CreateTranspose(
const TransposeQueueDescriptor& ,
2328 const WorkloadInfo& )
const
2330 return std::unique_ptr<IWorkload>();
2333 std::unique_ptr<IWorkload> IWorkloadFactory::CreateTransposeConvolution2d(
2334 const TransposeConvolution2dQueueDescriptor& ,
2335 const WorkloadInfo& )
const
2337 return std::unique_ptr<IWorkload>();
2340 std::unique_ptr<IWorkload> IWorkloadFactory::CreateUnidirectionalSequenceLstm(
2341 const UnidirectionalSequenceLstmQueueDescriptor& ,
2342 const WorkloadInfo& )
const
2344 return std::unique_ptr<IWorkload>();
2347 std::unique_ptr<IWorkload> IWorkloadFactory::CreateInput(
2349 const WorkloadInfo& )
const
2351 return std::unique_ptr<IWorkload>();