Added int8 support in LeakyRelu/LUT kernel.
* Resolves COMPMID-6292
Change-Id: I15a0ad1c298ff53dd111fda76ef70872aaadac3b
Signed-off-by: Pablo Marquez Tello <pablo.tello@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9740
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Jakub Sujak <jakub.sujak@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Benchmark: Arm Jenkins <bsgcomp@arm.com>
diff --git a/arm_compute/core/QuantizationInfo.h b/arm_compute/core/QuantizationInfo.h
index ddf1342..98ceec6 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 @@
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 fd45bba..09b77b5 100644
--- a/arm_compute/core/Types.h
+++ b/arm_compute/core/Types.h
@@ -1737,7 +1737,14 @@
}
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 @@
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 @@
}
}
+ 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)