diff options
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.cpp | 18 | ||||
-rw-r--r-- | src/backends/aclCommon/ArmComputeTensorUtils.hpp | 5 | ||||
-rw-r--r-- | src/backends/cl/workloads/ClPadWorkload.cpp | 2 | ||||
-rw-r--r-- | src/backends/neon/workloads/NeonPadWorkload.cpp | 2 | ||||
-rw-r--r-- | src/backends/reference/workloads/Pad.cpp | 13 |
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) { |