aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSadik Armagan <sadik.armagan@arm.com>2019-10-10 10:43:20 +0100
committerSadik Armagan <sadik.armagan@arm.com>2019-10-10 10:41:06 +0000
commita3600ba71978225e4d21399fb781d4850f2bb25f (patch)
tree8eb1837baa989221b2b546296e46e228f8c38fd2
parentc8724c7b9ff663538bd32ad789dbcc3e1aa88637 (diff)
downloadarmnn-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.cpp5
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.hpp7
-rw-r--r--src/backends/cl/workloads/ClPooling2dWorkload.cpp15
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);