From bab8fa9a11cf3bfef4b72fb757b81575b6fd75f0 Mon Sep 17 00:00:00 2001 From: Ryan OShea Date: Wed, 9 Mar 2022 10:29:02 +0000 Subject: IVGCVSW-6174 Add Cl Pooling3d Workload * Add IsSupported for Pooling3d * Add CreateWorkload case for Pooling3d * Create new ClPooling3dWorkload header and source files * Add Pooling3d workload to ClWorkloads.hpp * Add tests for Pooling3d workload * Add Pooling3d build function to ArmComputeTensorUtils Change-Id: Ia270b0fe809a171ed73af14376de8708b346d500 Signed-off-by: Ryan OShea --- src/backends/aclCommon/ArmComputeTensorUtils.cpp | 56 +++++++++++++++++++----- src/backends/aclCommon/ArmComputeTensorUtils.hpp | 6 +++ 2 files changed, 50 insertions(+), 12 deletions(-) (limited to 'src/backends/aclCommon') diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp index 2dc6d2a2b2..e476eb38a1 100644 --- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp +++ b/src/backends/aclCommon/ArmComputeTensorUtils.cpp @@ -187,17 +187,10 @@ arm_compute::DataLayout ConvertDataLayout(armnn::DataLayout dataLayout) arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor, bool fpMixedPrecision) { - using arm_compute::PoolingType; - using arm_compute::DimensionRoundingType; - using arm_compute::PadStrideInfo; - using arm_compute::PoolingLayerInfo; - using arm_compute::Size2D; - using arm_compute::DataLayout; - // Resolve ARM Compute layer parameters. - const PoolingType poolingType = ConvertPoolingAlgorithmToAclPoolingType(descriptor.m_PoolType); + const arm_compute::PoolingType poolingType = ConvertPoolingAlgorithmToAclPoolingType(descriptor.m_PoolType); - const DataLayout dataLayout = ConvertDataLayout(descriptor.m_DataLayout); + const arm_compute::DataLayout dataLayout = ConvertDataLayout(descriptor.m_DataLayout); bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0); //use specific constructor if global pooling @@ -206,9 +199,9 @@ arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDes return arm_compute::PoolingLayerInfo(poolingType, dataLayout); } - const DimensionRoundingType rounding = ConvertOutputShapeRoundingToAclDimensionRoundingType( + const arm_compute::DimensionRoundingType rounding = ConvertOutputShapeRoundingToAclDimensionRoundingType( descriptor.m_OutputShapeRounding); - const PadStrideInfo padStrideInfo(descriptor.m_StrideX, + const arm_compute::PadStrideInfo padStrideInfo(descriptor.m_StrideX, descriptor.m_StrideY, descriptor.m_PadLeft, descriptor.m_PadRight, @@ -218,12 +211,51 @@ arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDes const bool excludePadding = (descriptor.m_PaddingMethod == PaddingMethod::Exclude); - const Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight); + const arm_compute::Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight); return arm_compute::PoolingLayerInfo(poolingType, poolSize, dataLayout, padStrideInfo, excludePadding, fpMixedPrecision); } +arm_compute::Pooling3dLayerInfo BuildArmComputePooling3dLayerInfo(const Pooling3dDescriptor& descriptor, + bool fpMixedPrecision) +{ + const arm_compute::PoolingType poolingType = ConvertPoolingAlgorithmToAclPoolingType(descriptor.m_PoolType); + + bool isGlobalPooling = (descriptor.m_StrideX==0 && descriptor.m_StrideY==0 && descriptor.m_StrideZ==0); + //use specific constructor if global pooling + if(isGlobalPooling) + { + return arm_compute::Pooling3dLayerInfo(poolingType); + } + + const arm_compute::Size3D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight, descriptor.m_PoolDepth); + + const arm_compute::Size3D stride(descriptor.m_StrideX, + descriptor.m_StrideY, + descriptor.m_StrideZ); + + const arm_compute::Padding3D padding(descriptor.m_PadLeft, + descriptor.m_PadRight, + descriptor.m_PadTop, + descriptor.m_PadBottom, + descriptor.m_PadFront, + descriptor.m_PadBack); + + const bool excludePadding = (descriptor.m_PaddingMethod == PaddingMethod::Exclude); + + const arm_compute::DimensionRoundingType rounding = ConvertOutputShapeRoundingToAclDimensionRoundingType( + descriptor.m_OutputShapeRounding); + + return arm_compute::Pooling3dLayerInfo(poolingType, + poolSize, + stride, + padding, + excludePadding, + fpMixedPrecision, + rounding); +} + arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(const NormalizationDescriptor& descriptor) { const arm_compute::NormType normType = diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.hpp b/src/backends/aclCommon/ArmComputeTensorUtils.hpp index ba6ef6a3fe..31992b93c6 100644 --- a/src/backends/aclCommon/ArmComputeTensorUtils.hpp +++ b/src/backends/aclCommon/ArmComputeTensorUtils.hpp @@ -56,6 +56,12 @@ arm_compute::DataLayout ConvertDataLayout(armnn::DataLayout dataLayout); arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor, bool fpMixedPrecision = false); +/// Utility function used to setup an arm_compute::Pooling3dLayerInfo object from given +/// armnn::Pooling3dDescriptor +/// bool fpMixedPrecision +arm_compute::Pooling3dLayerInfo BuildArmComputePooling3dLayerInfo(const Pooling3dDescriptor& descriptor, + bool fpMixedPrecision = false); + /// Utility function to setup an arm_compute::NormalizationLayerInfo object from an armnn::NormalizationDescriptor. arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(const NormalizationDescriptor& desc); -- cgit v1.2.1