diff options
author | Sadik Armagan <sadik.armagan@arm.com> | 2019-10-10 10:43:20 +0100 |
---|---|---|
committer | Sadik Armagan <sadik.armagan@arm.com> | 2019-10-10 10:41:06 +0000 |
commit | a3600ba71978225e4d21399fb781d4850f2bb25f (patch) | |
tree | 8eb1837baa989221b2b546296e46e228f8c38fd2 | |
parent | c8724c7b9ff663538bd32ad789dbcc3e1aa88637 (diff) | |
download | armnn-a3600ba71978225e4d21399fb781d4850f2bb25f.tar.gz |
IVGCVSW-3967 Avg_Pooling2d Fails on CL NHWC FP16
* Enable fp_mixed_precision flag for the failing test case
Signed-off-by: Sadik Armagan <sadik.armagan@arm.com>
Change-Id: If13552165eb6598a84d213b82847b56a8c5f2783
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.cpp | 5 | ||||
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.hpp | 7 | ||||
-rw-r--r-- | src/backends/cl/workloads/ClPooling2dWorkload.cpp | 15 |
3 files changed, 22 insertions, 5 deletions
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp index fabe9a15bf..c7d250a706 100644 --- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp +++ b/src/backends/aclCommon/ArmComputeTensorUtils.cpp @@ -140,7 +140,8 @@ arm_compute::DataLayout ConvertDataLayout(armnn::DataLayout dataLayout) } } -arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor) +arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor, + bool fpMixedPrecision) { using arm_compute::PoolingType; using arm_compute::DimensionRoundingType; @@ -172,7 +173,7 @@ arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDes const Size2D poolSize(descriptor.m_PoolWidth, descriptor.m_PoolHeight); - return arm_compute::PoolingLayerInfo(poolingType, poolSize, padStrideInfo, excludePadding); + return arm_compute::PoolingLayerInfo(poolingType, poolSize, padStrideInfo, excludePadding, fpMixedPrecision); } arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(const NormalizationDescriptor& descriptor) diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.hpp b/src/backends/aclCommon/ArmComputeTensorUtils.hpp index 34565fe425..c30de19557 100644 --- a/src/backends/aclCommon/ArmComputeTensorUtils.hpp +++ b/src/backends/aclCommon/ArmComputeTensorUtils.hpp @@ -48,8 +48,11 @@ arm_compute::TensorInfo BuildArmComputeTensorInfo(const armnn::TensorInfo& tenso /// armnn::DataLayout. arm_compute::DataLayout ConvertDataLayout(armnn::DataLayout dataLayout); -/// Utility function used to setup an arm_compute::PoolingLayerInfo object from an armnn::Pooling2dDescriptor. -arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor); +/// Utility function used to setup an arm_compute::PoolingLayerInfo object from given +/// armnn::Pooling2dDescriptor +/// bool fpMixedPrecision +arm_compute::PoolingLayerInfo BuildArmComputePoolingLayerInfo(const Pooling2dDescriptor& descriptor, + bool fpMixedPrecision = false); /// Utility function to setup an arm_compute::NormalizationLayerInfo object from an armnn::NormalizationDescriptor. arm_compute::NormalizationLayerInfo BuildArmComputeNormalizationLayerInfo(const NormalizationDescriptor& desc); diff --git a/src/backends/cl/workloads/ClPooling2dWorkload.cpp b/src/backends/cl/workloads/ClPooling2dWorkload.cpp index 607bc58f38..bf899977d6 100644 --- a/src/backends/cl/workloads/ClPooling2dWorkload.cpp +++ b/src/backends/cl/workloads/ClPooling2dWorkload.cpp @@ -40,7 +40,20 @@ ClPooling2dWorkload::ClPooling2dWorkload( input.info()->set_data_layout(aclDataLayout); output.info()->set_data_layout(aclDataLayout); - arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(m_Data.m_Parameters); + // flag to use wider accumulators (32 bit instead of 16 for FP16) to improve accuracy + // enable fp_mixed_precision for the the FP16 cases that + // accumulation reaches a limit beyond which there is no more increment of the value + bool fpMixedPrecision = false; + if (input.info()->data_type() == arm_compute::DataType::F16 + && m_Data.m_Parameters.m_PoolType == PoolingAlgorithm::Average + && m_Data.m_Parameters.m_PoolWidth >= 100 + && input.info()->dimension(3) >= 5 + && input.info()->dimension(2) * input.info()->dimension(1) >= 3000) + { + fpMixedPrecision = true; + } + + arm_compute::PoolingLayerInfo layerInfo = BuildArmComputePoolingLayerInfo(m_Data.m_Parameters, fpMixedPrecision); // Run the layer. m_PoolingLayer.configure(&input, &output, layerInfo); |