aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin May <kevin.may@arm.com>2022-11-29 14:34:48 +0000
committerKevin May <kevin.may@arm.com>2022-12-01 09:38:54 +0000
commit263d709e7c71823931e2cd0831e60a3f6280eab5 (patch)
tree5aaa0e0fe60ebcf0b53e6e4adda1893f932180b5
parent1bbfaca49661bb945b199d848b48678f2b44e655 (diff)
downloadarmnn-263d709e7c71823931e2cd0831e60a3f6280eab5.tar.gz
IVGCVSW-7272 Add Exception for handling Fp16 infinity values
* Float values which cannot fit in Half are converted as inf/-inf * Add an InvalidArgumentException for infinity displaying the value and data type Signed-off-by: Kevin May <kevin.may@arm.com> Change-Id: Iaa5671374364c531e29e37fdfe40732b4fdbcfcb
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.cpp21
-rw-r--r--src/backends/aclCommon/ArmComputeTensorUtils.hpp2
2 files changed, 15 insertions, 8 deletions
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.cpp b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
index 01c071d43b..517b11ced8 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.cpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.cpp
@@ -324,24 +324,31 @@ arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsign
return arm_compute::Size2D(width, height);
}
-arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float pixelValue)
+arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float value)
{
switch (tensorInfo->data_type())
{
case arm_compute::DataType::F16:
- return arm_compute::PixelValue(static_cast<Half>(pixelValue));
+ {
+ arm_compute::PixelValue pixelValue = arm_compute::PixelValue(static_cast<Half>(value));
+ if (isinf(pixelValue.get<Half>())) {
+ throw InvalidArgumentException("Under/Overflow converting float value [" + std::to_string(value) +
+ "] to fp16: [" + std::to_string(pixelValue.get<Half>()) + "]");
+ }
+ return pixelValue;
+ }
case arm_compute::DataType::F32:
- return arm_compute::PixelValue(pixelValue);
+ return arm_compute::PixelValue(value);
case arm_compute::DataType::QASYMM8:
- return arm_compute::PixelValue(static_cast<uint8_t>(pixelValue));
+ return arm_compute::PixelValue(static_cast<uint8_t>(value));
case arm_compute::DataType::QSYMM16:
- return arm_compute::PixelValue(static_cast<int16_t>(pixelValue));
+ return arm_compute::PixelValue(static_cast<int16_t>(value));
case arm_compute::DataType::QSYMM8:
case arm_compute::DataType::QASYMM8_SIGNED:
case arm_compute::DataType::QSYMM8_PER_CHANNEL:
- return arm_compute::PixelValue(static_cast<int8_t>(pixelValue));
+ return arm_compute::PixelValue(static_cast<int8_t>(value));
case arm_compute::DataType::S32:
- return arm_compute::PixelValue(static_cast<int32_t>(pixelValue));
+ return arm_compute::PixelValue(static_cast<int32_t>(value));
default:
throw InvalidArgumentException("Unsupported DataType: [" +
std::to_string(static_cast<int>(tensorInfo->data_type())) + "]");
diff --git a/src/backends/aclCommon/ArmComputeTensorUtils.hpp b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
index ee8240f3b8..fdcd867bba 100644
--- a/src/backends/aclCommon/ArmComputeTensorUtils.hpp
+++ b/src/backends/aclCommon/ArmComputeTensorUtils.hpp
@@ -75,7 +75,7 @@ arm_compute::PermutationVector BuildArmComputeTransposeVector(const armnn::Permu
arm_compute::Size2D BuildArmComputeSize2D(const unsigned int width, const unsigned int height);
/// Gets the appropriate PixelValue for the TensorInfo DataType
-arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float pixelValue);
+arm_compute::PixelValue GetPixelValue(const arm_compute::ITensorInfo* tensorInfo, float value);
/// Computes the depth multiplier parameter for the Depthwise Conv2d ACL workload.
unsigned int ComputeDepthwiseConv2dDepthMultiplier(armnn::DataLayout layout,