diff options
author | Pablo Tello <pablo.tello@arm.com> | 2019-04-26 17:58:13 +0100 |
---|---|---|
committer | Pablo Tello <pablo.tello@arm.com> | 2019-05-13 16:51:35 +0100 |
commit | f0bd68386cc8598f702b1df2d1ba60094e6a9d97 (patch) | |
tree | 4e5a0d2f58bbd7fb095f24bee8932970d14e52a8 /src/backends | |
parent | 3f9119a115bfaaf0ad89a46d00e7b9da844aca22 (diff) | |
download | armnn-f0bd68386cc8598f702b1df2d1ba60094e6a9d97.tar.gz |
MLCE-101: Adding dilation support in conv and dconv
Added support for dilation in DepthwiseConvolution2d in the
Neon and CL backends.
Change-Id: Ie1522b498c07f80d6efcf9dc79e926c8cfa06ca5
Signed-off-by: Pablo Tello <pablo.tello@arm.com>
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/cl/ClLayerSupport.cpp | 17 | ||||
-rw-r--r-- | src/backends/cl/ClLayerSupport.hpp | 7 | ||||
-rw-r--r-- | src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp | 25 | ||||
-rw-r--r-- | src/backends/neon/NeonLayerSupport.cpp | 16 | ||||
-rw-r--r-- | src/backends/neon/NeonLayerSupport.hpp | 7 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp | 22 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.cpp | 24 | ||||
-rw-r--r-- | src/backends/reference/RefLayerSupport.hpp | 8 |
8 files changed, 116 insertions, 10 deletions
diff --git a/src/backends/cl/ClLayerSupport.cpp b/src/backends/cl/ClLayerSupport.cpp index a5c5f2bd9d..73c9e49c4f 100644 --- a/src/backends/cl/ClLayerSupport.cpp +++ b/src/backends/cl/ClLayerSupport.cpp @@ -246,6 +246,23 @@ bool ClLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input, biases); } +bool ClLayerSupport::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(ClDepthwiseConvolutionWorkloadValidate, + reasonIfUnsupported, + input, + output, + descriptor, + weights, + biases); +} + + bool ClLayerSupport::IsDivisionSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/cl/ClLayerSupport.hpp b/src/backends/cl/ClLayerSupport.hpp index 6393a11e84..e9a9e68005 100644 --- a/src/backends/cl/ClLayerSupport.hpp +++ b/src/backends/cl/ClLayerSupport.hpp @@ -61,6 +61,13 @@ public: const Optional<TensorInfo>& biases, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reason = EmptyOptional()) const override; + bool IsDivisionSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, diff --git a/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp index 1ff0978a40..e681e95d90 100644 --- a/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp +++ b/src/backends/cl/workloads/ClDepthwiseConvolutionWorkload.cpp @@ -52,13 +52,19 @@ arm_compute::Status ClDepthwiseConvolutionWorkloadValidate(const TensorInfo& inp } const arm_compute::PadStrideInfo aclPadStrideInfo = BuildArmComputePadStrideInfo(descriptor); + const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D( + descriptor.m_DilationX, + descriptor.m_DilationY); return arm_compute::CLDepthwiseConvolutionLayer::validate(&aclInputInfo, &aclWeightsInfo, optionalAclBiasesInfo, &aclOutputInfo, aclPadStrideInfo, - aclDepthMultiplier); + aclDepthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); + } ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( @@ -85,7 +91,7 @@ ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout); } - arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX, + const arm_compute::PadStrideInfo padStrideInfo(m_Data.m_Parameters.m_StrideX, m_Data.m_Parameters.m_StrideY, m_Data.m_Parameters.m_PadLeft, m_Data.m_Parameters.m_PadRight, @@ -93,6 +99,11 @@ ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( m_Data.m_Parameters.m_PadBottom, arm_compute::DimensionRoundingType::FLOOR); + const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D( + m_Data.m_Parameters.m_DilationX, + m_Data.m_Parameters.m_DilationY); + + std::string name = std::string("ClDepthwiseConvolutionWorkload"); m_Data.ValidateInputsOutputs(name, 1, 1); @@ -109,6 +120,7 @@ ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( // Get the depth multiplier const unsigned int depthMultiplier = weightInfo.GetShape()[0]; + // Check for optimisation opportunities. bool use3x3Optimisation = (weightInfo.GetShape()[2] == 3) && (weightInfo.GetShape()[3] == 3); if (use3x3Optimisation) @@ -120,7 +132,9 @@ ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( m_BiasTensor.get(), &output, padStrideInfo, - depthMultiplier); + depthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); } else { @@ -131,7 +145,10 @@ ClDepthwiseConvolutionWorkload::ClDepthwiseConvolutionWorkload( m_BiasTensor.get(), &output, padStrideInfo, - depthMultiplier); + depthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); + } BOOST_ASSERT(m_DepthwiseConvolutionLayer); diff --git a/src/backends/neon/NeonLayerSupport.cpp b/src/backends/neon/NeonLayerSupport.cpp index 898660cc91..c257dd373a 100644 --- a/src/backends/neon/NeonLayerSupport.cpp +++ b/src/backends/neon/NeonLayerSupport.cpp @@ -203,6 +203,22 @@ bool NeonLayerSupport::IsDepthwiseConvolutionSupported(const TensorInfo& input, biases); } +bool NeonLayerSupport::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reasonIfUnsupported) const +{ + FORWARD_WORKLOAD_VALIDATE_FUNC(NeonDepthwiseConvolutionWorkloadValidate, + reasonIfUnsupported, + input, + output, + descriptor, + weights, + biases); +} + bool NeonLayerSupport::IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional<std::string&> reasonIfUnsupported) const diff --git a/src/backends/neon/NeonLayerSupport.hpp b/src/backends/neon/NeonLayerSupport.hpp index 27e825afa9..a5aae0bde9 100644 --- a/src/backends/neon/NeonLayerSupport.hpp +++ b/src/backends/neon/NeonLayerSupport.hpp @@ -56,6 +56,13 @@ public: const Optional<TensorInfo>& biases, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reason = EmptyOptional()) const override; + bool IsFloorSupported(const TensorInfo& input, const TensorInfo& output, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; diff --git a/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp b/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp index c915555dd7..0b917fc530 100644 --- a/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp +++ b/src/backends/neon/workloads/NeonDepthwiseConvolutionWorkload.cpp @@ -52,14 +52,18 @@ arm_compute::Status NeonDepthwiseConvolutionWorkloadValidate(const TensorInfo& i optionalAclBiasesInfo = &aclBiasesInfo; } - const arm_compute::PadStrideInfo aclPadStrideInfo = BuildArmComputePadStrideInfo(descriptor); + arm_compute::PadStrideInfo aclPadStrideInfo = BuildArmComputePadStrideInfo(descriptor); + const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D( + descriptor.m_DilationX,descriptor.m_DilationY); return arm_compute::NEDepthwiseConvolutionLayer::validate(&aclInputInfo, &aclWeightsInfo, optionalAclBiasesInfo, &aclOutputInfo, aclPadStrideInfo, - aclDepthMultiplier); + aclDepthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); } NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( @@ -97,6 +101,10 @@ NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( m_Data.m_Parameters.m_PadBottom, arm_compute::DimensionRoundingType::FLOOR); + + const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D( + m_Data.m_Parameters.m_DilationX, m_Data.m_Parameters.m_DilationY); + m_Data.ValidateInputsOutputs("NeonDepthwiseConvolutionWorkload", 1, 1); INeonTensorHandle* inputTensorHandle = static_cast<INeonTensorHandle*>(m_Data.m_Inputs[0]); @@ -109,7 +117,7 @@ NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( input.info()->set_data_layout(aclDataLayout); output.info()->set_data_layout(aclDataLayout); - // Get the depth multiplier + // Get the depth multiplier const unsigned int depthMultiplier = weightInfo.GetShape()[0]; // Check for optimisation opportunities. @@ -123,7 +131,9 @@ NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( m_BiasTensor.get(), &output, padStrideInfo, - depthMultiplier); + depthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); } else { @@ -134,7 +144,9 @@ NeonDepthwiseConvolutionWorkload::NeonDepthwiseConvolutionWorkload( m_BiasTensor.get(), &output, padStrideInfo, - depthMultiplier); + depthMultiplier, + arm_compute::ActivationLayerInfo(), + aclDilationInfo); } BOOST_ASSERT(m_pDepthwiseConvolutionLayer); diff --git a/src/backends/reference/RefLayerSupport.cpp b/src/backends/reference/RefLayerSupport.cpp index 8eded84e09..a1d8e7de81 100644 --- a/src/backends/reference/RefLayerSupport.cpp +++ b/src/backends/reference/RefLayerSupport.cpp @@ -429,7 +429,29 @@ bool RefLayerSupport::IsDetectionPostProcessSupported(const armnn::TensorInfo& i &TrueFunc<>); } -bool RefLayerSupport::IsDivisionSupported(const TensorInfo& input0, +bool RefLayerSupport::IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reasonIfUnsupported) const +{ + if (descriptor.m_DilationY == 1 && descriptor.m_DilationY == 1) + { + return IsDepthwiseConvolutionSupported(input, output, descriptor, weights, biases, reasonIfUnsupported); + } + else + { + if (reasonIfUnsupported) + { + reasonIfUnsupported.value() = "Reference Depthwise Convolution: Dilation parameters must be 1"; + } + return false; + } +} + + + bool RefLayerSupport::IsDivisionSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, Optional<std::string&> reasonIfUnsupported) const diff --git a/src/backends/reference/RefLayerSupport.hpp b/src/backends/reference/RefLayerSupport.hpp index 53a1abf150..9b1a95cdcd 100644 --- a/src/backends/reference/RefLayerSupport.hpp +++ b/src/backends/reference/RefLayerSupport.hpp @@ -74,6 +74,14 @@ public: const DetectionPostProcessDescriptor& descriptor, Optional<std::string&> reasonIfUnsupported = EmptyOptional()) const override; + bool IsDilatedDepthwiseConvolutionSupported(const TensorInfo& input, + const TensorInfo& output, + const DepthwiseConvolution2dDescriptor& descriptor, + const TensorInfo& weights, + const Optional<TensorInfo>& biases, + Optional<std::string&> reasonIfUnsupported = + EmptyOptional()) const override; + bool IsDivisionSupported(const TensorInfo& input0, const TensorInfo& input1, const TensorInfo& output, |