diff options
author | Kevin May <kevin.may@arm.com> | 2022-11-29 14:34:48 +0000 |
---|---|---|
committer | Kevin May <kevin.may@arm.com> | 2022-12-01 09:38:54 +0000 |
commit | 263d709e7c71823931e2cd0831e60a3f6280eab5 (patch) | |
tree | 5aaa0e0fe60ebcf0b53e6e4adda1893f932180b5 /src/backends | |
parent | 1bbfaca49661bb945b199d848b48678f2b44e655 (diff) | |
download | armnn-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
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.cpp | 21 | ||||
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.hpp | 2 |
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, |