From 9c8f9a9beca2c158429152bf8a537dfe77a88342 Mon Sep 17 00:00:00 2001 From: Pablo Marquez Tello Date: Thu, 8 Jun 2023 12:00:29 +0100 Subject: Added int8 support in LeakyRelu/LUT kernel. * Resolves COMPMID-6292 Change-Id: I15a0ad1c298ff53dd111fda76ef70872aaadac3b Signed-off-by: Pablo Marquez Tello Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9740 Comments-Addressed: Arm Jenkins Reviewed-by: Jakub Sujak Tested-by: Arm Jenkins Benchmark: Arm Jenkins --- arm_compute/core/QuantizationInfo.h | 13 ++++++++++++- arm_compute/core/Types.h | 19 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) (limited to 'arm_compute/core') diff --git a/arm_compute/core/QuantizationInfo.h b/arm_compute/core/QuantizationInfo.h index ddf1342e32..98ceec6c56 100644 --- a/arm_compute/core/QuantizationInfo.h +++ b/arm_compute/core/QuantizationInfo.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2022 Arm Limited. + * Copyright (c) 2019-2023 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -430,6 +430,17 @@ inline qasymm8_t qasymm8_leaky_relu(qasymm8_t in, return tmp; } +inline qasymm8_signed_t qasymm8_signed_leaky_relu(qasymm8_signed_t in, + const UniformQuantizationInfo &qi_in, + const UniformQuantizationInfo &qi_out, + float alpha) +{ + float tmp_f = dequantize_qasymm8_signed(in, qi_in); + tmp_f = tmp_f > 0 ? tmp_f : tmp_f * alpha; + const qasymm8_t tmp = quantize_qasymm8_signed(tmp_f, qi_out); + return tmp; +} + inline qasymm8_t qasymm8_logistic(qasymm8_t in, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) diff --git a/arm_compute/core/Types.h b/arm_compute/core/Types.h index fd45bbaa1e..09b77b5a11 100644 --- a/arm_compute/core/Types.h +++ b/arm_compute/core/Types.h @@ -1737,7 +1737,14 @@ public: } else if(_act == ActivationFunction::LEAKY_RELU) { - qasymm8_leaky_relu_populate_table(_lut, qi_in, qi_out, _a); + if(data_type == DataType::QASYMM8) + { + qasymm8_leaky_relu_populate_table(_lut, qi_in, qi_out, _a); + } + else + { + qasymm8_signed_leaky_relu_populate_table(_lut, qi_in, qi_out, _a); + } } else if(_act == ActivationFunction::LOGISTIC) { @@ -1761,7 +1768,7 @@ public: case ActivationFunction::HARD_SWISH: return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; case ActivationFunction::LEAKY_RELU: - return data_type == DataType::QASYMM8; + return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; case ActivationFunction::LOGISTIC: return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; default: @@ -1807,6 +1814,14 @@ private: } } + static inline void qasymm8_signed_leaky_relu_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out, float alpha) + { + for(size_t i = 0; i < lut.size(); ++i) + { + lut[i] = qasymm8_signed_leaky_relu(i, qi_in, qi_out, alpha); + } + } + static inline void qasymm8_logistic_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) { for(size_t i = 0; i < lut.size(); ++i) -- cgit v1.2.1