From ad9171701e6032b3ddf3573f85780bae30c512c6 Mon Sep 17 00:00:00 2001 From: Cathal Corbett Date: Wed, 9 Feb 2022 23:21:35 +0000 Subject: IVGCVSW-6267 Add support of Unidirectional Sequence Lstm fp32/fp16 to Cl !ComputeLibrary:7150 Signed-off-by: Cathal Corbett Change-Id: I01690e6555978d93c41d09bbe5378683bc925f61 --- src/backends/neon/NeonLayerSupport.cpp | 176 ++++++++++++++++----------------- 1 file changed, 88 insertions(+), 88 deletions(-) (limited to 'src/backends/neon/NeonLayerSupport.cpp') diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 8901e47a0a..e2098a310f 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -182,6 +182,13 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, infos[1], *(PolymorphicDowncast(&descriptor)), reasonIfUnsupported); + case LayerType::Cast: + return IsCastSupported(infos[0], infos[1], reasonIfUnsupported); + case LayerType::ChannelShuffle: + return IsChannelShuffleSupported(infos[0], + infos[1], + *(PolymorphicDowncast(&descriptor)), + reasonIfUnsupported); case LayerType::Comparison: return IsComparisonSupported(infos[0], infos[1], @@ -238,6 +245,34 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, reasonIfUnsupported); } } + case LayerType::Convolution3d: + { + if (infos.size() != 4) + { + throw InvalidArgumentException("Invalid number of Convolution3d TensorInfos. " + "TensorInfos should be of format: {input, output, weights, biases}."); + } + + auto desc = *(PolymorphicDowncast(&descriptor)); + if (infos[3] == TensorInfo()) + { + return IsConvolution3dSupported(infos[0], + infos[1], + desc, + infos[2], + EmptyOptional(), + reasonIfUnsupported); + } + else + { + return IsConvolution3dSupported(infos[0], + infos[1], + desc, + infos[2], + infos[3], + reasonIfUnsupported); + } + } case LayerType::DepthToSpace: return IsDepthToSpaceSupported(infos[0], infos[1], @@ -273,6 +308,19 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, } case LayerType::Dequantize: return IsDequantizeSupported(infos[0], infos[1], reasonIfUnsupported); + case LayerType::DetectionPostProcess: + { + auto desc = *(PolymorphicDowncast(&descriptor)); + return LayerSupportBase::IsDetectionPostProcessSupported(infos[0], + infos[1], + infos[2], + infos[3], + infos[4], + infos[5], + infos[6], + desc, + reasonIfUnsupported); + } case LayerType::Division: return IsDivisionSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); case LayerType::ElementwiseUnary: @@ -335,27 +383,8 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, *(PolymorphicDowncast(&descriptor)), lstmParamsInfo.value(), reasonIfUnsupported); - case LayerType::QLstm: - return IsQLstmSupported(infos[0], - infos[1], - infos[2], - infos[3], - infos[4], - infos[5], - *(PolymorphicDowncast(&descriptor)), - lstmParamsInfo.value(), - reasonIfUnsupported); - case LayerType::UnidirectionalSequenceLstm: - return IsUnidirectionalSequenceLstmSupported(infos[0], - infos[1], - infos[2], - infos[3], - infos[4], - infos[5], - *(PolymorphicDowncast(&descriptor)), - lstmParamsInfo.value(), - reasonIfUnsupported); + case LayerType::Map: + return true; case LayerType::Maximum: return IsMaximumSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); case LayerType::Mean: @@ -363,6 +392,15 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, infos[1], *(PolymorphicDowncast(&descriptor)), reasonIfUnsupported); + case LayerType::MemCopy: + return LayerSupportBase::IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported); + case LayerType::MemImport: + return LayerSupportBase::IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported); + case LayerType::Merge: + return LayerSupportBase::IsMergeSupported(infos[0], + infos[1], + infos[2], + reasonIfUnsupported); case LayerType::Minimum: return IsMinimumSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); case LayerType::Multiplication: @@ -391,6 +429,16 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, reasonIfUnsupported); case LayerType::Prelu: return IsPreluSupported(infos[0], infos[1], infos[2], reasonIfUnsupported); + case LayerType::QLstm: + return IsQLstmSupported(infos[0], + infos[1], + infos[2], + infos[3], + infos[4], + infos[5], + *(PolymorphicDowncast(&descriptor)), + lstmParamsInfo.value(), + reasonIfUnsupported); case LayerType::Quantize: return IsQuantizeSupported(infos[0], infos[1], reasonIfUnsupported); case LayerType::QuantizedLstm: @@ -401,6 +449,8 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, infos[4], quantizedLstmParamsInfo.value(), reasonIfUnsupported); + case LayerType::Rank: + return true; case LayerType::Reshape: return IsReshapeSupported(infos[0], infos[1], @@ -416,6 +466,10 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, infos[1], *(PolymorphicDowncast(&descriptor)), reasonIfUnsupported); + case LayerType::Shape: + return LayerSupportBase::IsShapeSupported(infos[0], + infos[1], + reasonIfUnsupported); case LayerType::Slice: return IsSliceSupported(infos[0], infos[1], @@ -500,77 +554,23 @@ bool NeonLayerSupport::IsLayerSupported(const LayerType& type, reasonIfUnsupported); } } - case LayerType::Cast: - return IsCastSupported(infos[0], infos[1], reasonIfUnsupported); - case LayerType::ChannelShuffle: - return IsChannelShuffleSupported(infos[0], - infos[1], - *(PolymorphicDowncast(&descriptor)), - reasonIfUnsupported); - case LayerType::Convolution3d: - { - if (infos.size() != 4) - { - throw InvalidArgumentException("Invalid number of Convolution3d TensorInfos. " - "TensorInfos should be of format: {input, output, weights, biases}."); - } - - auto desc = *(PolymorphicDowncast(&descriptor)); - if (infos[3] == TensorInfo()) - { - return IsConvolution3dSupported(infos[0], - infos[1], - desc, - infos[2], - EmptyOptional(), - reasonIfUnsupported); - } - else - { - return IsConvolution3dSupported(infos[0], - infos[1], - desc, - infos[2], - infos[3], - reasonIfUnsupported); - } - } - case LayerType::MemCopy: - return LayerSupportBase::IsMemCopySupported(infos[0], infos[1], reasonIfUnsupported); - case LayerType::MemImport: - return LayerSupportBase::IsMemImportSupported(infos[0], infos[1], reasonIfUnsupported); - case LayerType::DetectionPostProcess: - { - auto desc = *(PolymorphicDowncast(&descriptor)); - return LayerSupportBase::IsDetectionPostProcessSupported(infos[0], - infos[1], - infos[2], - infos[3], - infos[4], - infos[5], - infos[6], - desc, - reasonIfUnsupported); - } - case LayerType::Map: - return true; + case LayerType::UnidirectionalSequenceLstm: + return IsUnidirectionalSequenceLstmSupported(infos[0], + infos[1], + infos[2], + infos[3], + infos[4], + infos[5], + *(PolymorphicDowncast(&descriptor)), + lstmParamsInfo.value(), + reasonIfUnsupported); case LayerType::Unmap: return true; - case LayerType::Merge: - return LayerSupportBase::IsMergeSupported(infos[0], - infos[1], - infos[2], - reasonIfUnsupported); - case LayerType::Rank: - return true; - case LayerType::Shape: - return LayerSupportBase::IsShapeSupported(infos[0], - infos[1], - reasonIfUnsupported); default: // layers not supported in neon by default: - // debug, fakequantization, precompiled, standin, - // switch, unidirectionalsequencelstm, pooling3d + // debug, fakequantization, precompiled, + // standin, switch, pooling3d return false; } } -- cgit v1.2.1