aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Kelly <mike.kelly@arm.com>2019-07-25 08:39:31 +0100
committerMike Kelly <mike.kelly@arm.com>2019-07-25 08:39:31 +0100
commit0a08ec6e5764d7906d196df5fe2979ad0d28d10a (patch)
tree68974b4cae8bbef85b0199225c01346034dcb06e
parentd73cecba2fb3525453d102603f6f27a9636754b5 (diff)
downloadarmnn-0a08ec6e5764d7906d196df5fe2979ad0d28d10a.tar.gz
IVGCVSW-3521 CpuAcc V1.2 pad Failures
* Pad value for QASYMM8 is no longer stored in quantized form. Signed-off-by: Mike Kelly <mike.kelly@arm.com> Change-Id: I048e1d233353c0560ae03a7cc1ed5199295352bc
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.cpp18
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.hpp5
-rw-r--r--src/backends/cl/workloads/ClPadWorkload.cpp2
-rw-r--r--src/backends/neon/workloads/NeonPadWorkload.cpp2
-rw-r--r--src/backends/reference/workloads/Pad.cpp13
5 files changed, 26 insertions, 14 deletions
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
index e69232c5a1..fabe9a15bf 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
@@ -210,5 +210,23 @@ arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsign
return arm_compute::Size2D(width, height);
}
+arm_compute::PixelValue GetPixelValue(arm_compute::ITensor& input, float pixelValue)
+{
+ switch (input.info()->data_type())
+ {
+ case arm_compute::DataType::QASYMM8:
+ return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
+ case arm_compute::DataType::QSYMM16:
+ return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
+ case arm_compute::DataType::F16:
+ return arm_compute::PixelValue(static_cast<Half>(pixelValue));
+ case arm_compute::DataType::F32:
+ return arm_compute::PixelValue(pixelValue);
+ default:
+ throw InvalidArgumentException("Unsupported DataType: [" +
+ std::to_string(static_cast<int>(input.info()->data_type())) + "]");
+ }
+}
+
} // namespace armcomputetensorutils
} // namespace armnn
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.hpp b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
index fa455b746b..c9587a7990 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.hpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
@@ -12,6 +12,8 @@
#include <arm_compute/core/Types.h>
#include <arm_compute/core/Size2D.h>
+#include <Half.hpp>
+
#include <boost/cast.hpp>
namespace armnn
@@ -58,6 +60,9 @@ arm_compute::PermutationVector BuildArmComputePermutationVector(const armnn::Per
/// Utility function used to setup an arm_compute::Size2D object from width and height values.
arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsigned int height);
+/// Gets the appropriate PixelValue for the input DataType
+arm_compute::PixelValue GetPixelValue(arm_compute::ITensor& input, float pixelValue);
+
/// Utility function used to setup an arm_compute::PadStrideInfo object from an armnn layer descriptor.
template <typename Descriptor>
arm_compute::PadStrideInfo BuildArmComputePadStrideInfo(const Descriptor &descriptor)
diff --git a/src/backends/cl/workloads/ClPadWorkload.cpp b/src/backends/cl/workloads/ClPadWorkload.cpp
index 1c072baf58..8a8c34a212 100644
--- a/src/backends/cl/workloads/ClPadWorkload.cpp
+++ b/src/backends/cl/workloads/ClPadWorkload.cpp
@@ -31,7 +31,7 @@ ClPadWorkload::ClPadWorkload(const PadQueueDescriptor& descriptor, const Workloa
arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
- arm_compute::PixelValue pixelValue = descriptor.m_Parameters.m_PadValue;
+ arm_compute::PixelValue pixelValue = GetPixelValue(input, descriptor.m_Parameters.m_PadValue);
m_Layer.configure(&input, &output, padList, pixelValue);
}
diff --git a/src/backends/neon/workloads/NeonPadWorkload.cpp b/src/backends/neon/workloads/NeonPadWorkload.cpp
index 6bc11766f1..19cdefc8ac 100644
--- a/src/backends/neon/workloads/NeonPadWorkload.cpp
+++ b/src/backends/neon/workloads/NeonPadWorkload.cpp
@@ -32,7 +32,7 @@ NeonPadWorkload::NeonPadWorkload(const PadQueueDescriptor& descriptor, const Wor
arm_compute::PaddingList padList = static_cast<arm_compute::PaddingList>(reversed_PadList);
- arm_compute::PixelValue pixelValue = descriptor.m_Parameters.m_PadValue;
+ arm_compute::PixelValue pixelValue = GetPixelValue(input, descriptor.m_Parameters.m_PadValue);
auto layer = std::make_unique<arm_compute::NEPadLayer>();
layer->configure(&input, &output, padList, pixelValue);
diff --git a/src/backends/reference/workloads/Pad.cpp b/src/backends/reference/workloads/Pad.cpp
index 41435f47d2..5773cac6a8 100644
--- a/src/backends/reference/workloads/Pad.cpp
+++ b/src/backends/reference/workloads/Pad.cpp
@@ -19,17 +19,6 @@ namespace armnn
{
template <typename T>
-T ConvertToDataType(const float& value,
- const armnn::TensorInfo& tensorInfo)
-{
- std::vector<T> output(1);
- std::unique_ptr<armnn::Encoder<float>> pEncoder = armnn::MakeEncoder<float>(tensorInfo, output.data());
- armnn::Encoder<float>& rEncoder = *pEncoder;
- rEncoder.Set(value);
- return output[0];
-}
-
-template <typename T>
void Pad(const TensorInfo& inputInfo,
const TensorInfo& outputInfo,
std::vector<std::pair<unsigned int, unsigned int>> m_padList,
@@ -60,7 +49,7 @@ void Pad(const TensorInfo& inputInfo,
unsigned int outputHeight = 0;
unsigned int outputWidth = 0;
- T convertedPadValue = ConvertToDataType<T>(padValue, inputInfo);
+ T convertedPadValue = static_cast<T>(padValue);
for (unsigned int i = 0; i < numOutputElements; ++i)
{