From 07df3d4b85f42245abf97e1a889e1fb3ef8af359 Mon Sep 17 00:00:00 2001 From: morgolock Date: Thu, 27 Feb 2020 11:46:28 +0000 Subject: COMPMID-3079: Implement Hard-Swish in NEON. Change-Id: I019e36f65b4d821009bada9c6cdebc096d893b54 Signed-off-by: morgolock Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2802 Tested-by: Arm Jenkins Comments-Addressed: Arm Jenkins Reviewed-by: Michele Di Giorgio --- src/core/NEON/kernels/NEActivationLayerKernel.cpp | 31 ++++++++++++++++------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'src/core/NEON/kernels/NEActivationLayerKernel.cpp') diff --git a/src/core/NEON/kernels/NEActivationLayerKernel.cpp b/src/core/NEON/kernels/NEActivationLayerKernel.cpp index 44f76f6e22..a0bf9e8010 100644 --- a/src/core/NEON/kernels/NEActivationLayerKernel.cpp +++ b/src/core/NEON/kernels/NEActivationLayerKernel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017-2019 ARM Limited. + * Copyright (c) 2017-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -156,6 +156,8 @@ void NEActivationLayerKernel::configure(ITensor *input, ITensor *output, Activat { ActivationFunction::SQUARE, &NEActivationLayerKernel::activation }, { ActivationFunction::TANH, &NEActivationLayerKernel::activation }, { ActivationFunction::IDENTITY, &NEActivationLayerKernel::activation }, + { ActivationFunction::HARD_SWISH, &NEActivationLayerKernel::activation }, + }; #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC @@ -175,6 +177,8 @@ void NEActivationLayerKernel::configure(ITensor *input, ITensor *output, Activat { ActivationFunction::SQUARE, &NEActivationLayerKernel::activation }, { ActivationFunction::TANH, &NEActivationLayerKernel::activation }, { ActivationFunction::IDENTITY, &NEActivationLayerKernel::activation }, + { ActivationFunction::HARD_SWISH, &NEActivationLayerKernel::activation }, + }; #endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC*/ @@ -254,14 +258,17 @@ NEActivationLayerKernel::activation(const Window &window) Iterator input(_input, win_collapsed); Iterator output(_output, win_collapsed); - const auto epsilon = wrapper::vdup_n(static_cast(1e-24), ExactTagType{}); - const auto const_1 = wrapper::vdup_n(static_cast(1.f), ExactTagType{}); - const auto const_0 = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); - const auto va = wrapper::vdup_n(static_cast(_act_info.a()), ExactTagType{}); - const auto vb = wrapper::vdup_n(static_cast(_act_info.b()), ExactTagType{}); - const auto a = static_cast(_act_info.a()); - const auto b = static_cast(_act_info.b()); - + const auto epsilon = wrapper::vdup_n(static_cast(1e-24), ExactTagType{}); + const auto const_1 = wrapper::vdup_n(static_cast(1.f), ExactTagType{}); + const auto const_0 = wrapper::vdup_n(static_cast(0.f), ExactTagType{}); + const auto const_6 = wrapper::vdup_n(static_cast(6.f), ExactTagType{}); + const auto const_3 = wrapper::vdup_n(static_cast(3.f), ExactTagType{}); + const auto const_inv_6 = wrapper::vdup_n(static_cast(0.166666667f), ExactTagType{}); + + const auto va = wrapper::vdup_n(static_cast(_act_info.a()), ExactTagType{}); + const auto vb = wrapper::vdup_n(static_cast(_act_info.b()), ExactTagType{}); + const auto a = static_cast(_act_info.a()); + const auto b = static_cast(_act_info.b()); execute_window_loop(win_collapsed, [&](const Coordinates &) { const auto input_ptr = reinterpret_cast(input.ptr()); @@ -315,6 +322,9 @@ NEActivationLayerKernel::activation(const Window &window) case ActivationFunction::IDENTITY: tmp = vin; break; + case ActivationFunction::HARD_SWISH: + tmp = wrapper::vmul(vin, wrapper::vmul(const_inv_6, wrapper::vmin(const_6, wrapper::vmax(const_0, wrapper::vadd(vin, const_3))))); + break; default: ARM_COMPUTE_ERROR("Unsupported activation function"); } @@ -367,6 +377,9 @@ NEActivationLayerKernel::activation(const Window &window) case ActivationFunction::IDENTITY: tmp = in; break; + case ActivationFunction::HARD_SWISH: + tmp = in * ((std::min(std::max((in + 3), 0.0f), 6.0f)) * 0.166666667f); + break; default: ARM_COMPUTE_ERROR("Unsupported activation function"); } -- cgit v1.2.1