From 48cfd5f7895f13167e4e9cd974dbc1e983e04ed7 Mon Sep 17 00:00:00 2001 From: Pablo Marquez Tello Date: Fri, 9 Jun 2023 11:22:29 +0100 Subject: Refactor activation LUT computation * Moving the code out of Types.h will help with the compilation time. * Added LUT support for all other activation functions. * Resolves COMPMID-6292 Change-Id: I1b5f0b21f03237447163276b8796b2aeb3fdd45c Signed-off-by: Pablo Marquez Tello Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/9749 Tested-by: Arm Jenkins Reviewed-by: Viet-Hoa Do Benchmark: Arm Jenkins --- arm_compute/core/QuantizationInfo.h | 62 --------------------- arm_compute/core/Types.h | 107 +----------------------------------- 2 files changed, 2 insertions(+), 167 deletions(-) (limited to 'arm_compute') diff --git a/arm_compute/core/QuantizationInfo.h b/arm_compute/core/QuantizationInfo.h index 98ceec6c56..f760d7512c 100644 --- a/arm_compute/core/QuantizationInfo.h +++ b/arm_compute/core/QuantizationInfo.h @@ -399,68 +399,6 @@ inline float dequantize_qsymm8(int8_t value, const UniformQuantizationInfo &qinf return value * qinfo.scale; } -inline qasymm8_t qasymm8_hard_swish(qasymm8_t in, - const UniformQuantizationInfo &qi_in, - const UniformQuantizationInfo &qi_out) -{ - float tmp_f = dequantize_qasymm8(in, qi_in); - tmp_f = tmp_f * ((std::min(std::max((tmp_f + 3), 0.0f), 6.0f)) * 0.166666667f); - const qasymm8_t tmp = quantize_qasymm8(tmp_f, qi_out); - return tmp; -} - -inline qasymm8_signed_t qasymm8_signed_hard_swish(qasymm8_signed_t in, - const UniformQuantizationInfo &qi_in, - const UniformQuantizationInfo &qi_out) -{ - float tmp_f = dequantize_qasymm8_signed(in, qi_in); - tmp_f = tmp_f * ((std::min(std::max((tmp_f + 3), 0.0f), 6.0f)) * 0.166666667f); - const qasymm8_t tmp = quantize_qasymm8_signed(tmp_f, qi_out); - return tmp; -} - -inline qasymm8_t qasymm8_leaky_relu(qasymm8_t in, - const UniformQuantizationInfo &qi_in, - const UniformQuantizationInfo &qi_out, - float alpha) -{ - float tmp_f = dequantize_qasymm8(in, qi_in); - tmp_f = tmp_f > 0 ? tmp_f : tmp_f * alpha; - const qasymm8_t tmp = quantize_qasymm8(tmp_f, qi_out); - 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) -{ - float tmp_f = dequantize_qasymm8(in, qi_in); - tmp_f = 1.f / (1.f + std::exp(-tmp_f)); - const qasymm8_t tmp = quantize_qasymm8(tmp_f, qi_out); - return tmp; -} - -inline qasymm8_signed_t qasymm8_signed_logistic(qasymm8_signed_t in, - const UniformQuantizationInfo &qi_in, - const UniformQuantizationInfo &qi_out) -{ - float tmp_f = dequantize_qasymm8_signed(in, qi_in); - tmp_f = 1.f / (1.f + std::exp(-tmp_f)); - const qasymm8_signed_t tmp = quantize_qasymm8_signed(tmp_f, qi_out); - return tmp; -} - /** Dequantize a value given a 8-bit symmetric quantization scheme * * @param[in] value Value to dequantize diff --git a/arm_compute/core/Types.h b/arm_compute/core/Types.h index 09b77b5a11..2613d46d14 100644 --- a/arm_compute/core/Types.h +++ b/arm_compute/core/Types.h @@ -1721,66 +1721,11 @@ public: { return _lut; } - - void init_lut(DataType data_type, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) + void setLookupTable256(LookupTable256 &lut) { - if(_act == ActivationFunction::HARD_SWISH) - { - if(data_type == DataType::QASYMM8) - { - qasymm8_hard_swish_populate_table(_lut, qi_in, qi_out); - } - else - { - qasymm8_signed_hard_swish_populate_table(_lut, qi_in, qi_out); - } - } - else if(_act == ActivationFunction::LEAKY_RELU) - { - 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) - { - if(data_type == DataType::QASYMM8) - { - qasymm8_logistic_populate_table(_lut, qi_in, qi_out); - } - else - { - qasymm8_signed_logistic_populate_table(_lut, qi_in, qi_out); - } - } + _lut = std::move(lut); } #endif // __aarch64__ - - static inline bool is_lut_supported(ActivationFunction act_func, DataType data_type) - { -#ifdef __aarch64__ - switch(act_func) - { - case ActivationFunction::HARD_SWISH: - return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; - case ActivationFunction::LEAKY_RELU: - return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; - case ActivationFunction::LOGISTIC: - return data_type == DataType::QASYMM8 || data_type == DataType::QASYMM8_SIGNED; - default: - return false; - } -#else // __aarch64__ - ARM_COMPUTE_UNUSED(act_func); - ARM_COMPUTE_UNUSED(data_type); - return false; -#endif // __aarch64__ - } - private: ActivationFunction _act = { ActivationLayerInfo::ActivationFunction::IDENTITY }; float _a = {}; @@ -1789,54 +1734,6 @@ private: #ifdef __aarch64__ LookupTable256 _lut = {}; - - static inline void qasymm8_hard_swish_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) - { - for(size_t i = 0; i < lut.size(); ++i) - { - lut[i] = qasymm8_hard_swish(i, qi_in, qi_out); - } - } - - static inline void qasymm8_signed_hard_swish_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) - { - for(size_t i = 0; i < lut.size(); ++i) - { - lut[i] = qasymm8_signed_hard_swish(i, qi_in, qi_out); - } - } - - static inline void qasymm8_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_leaky_relu(i, qi_in, qi_out, alpha); - } - } - - 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) - { - lut[i] = qasymm8_logistic(i, qi_in, qi_out); - } - } - - static inline void qasymm8_signed_logistic_populate_table(LookupTable256 &lut, const UniformQuantizationInfo &qi_in, const UniformQuantizationInfo &qi_out) - { - for(size_t i = 0; i < lut.size(); ++i) - { - lut[i] = qasymm8_signed_logistic(static_cast(i), qi_in, qi_out); - } - } #endif // __aarch64__ }; -- cgit v1.2.1