diff options
author | morgolock <pablo.tello@arm.com> | 2020-03-04 14:57:46 +0000 |
---|---|---|
committer | Michele Di Giorgio <michele.digiorgio@arm.com> | 2020-03-10 18:01:33 +0000 |
commit | 6b3865ad038d60a126fe1f90df815a480527a29f (patch) | |
tree | 5f363b89bde5fc0ca98cf12d2ef82fafe1cb0bd4 /src/core/CL | |
parent | ce3a7b27f80960e88415bb6cabbb75de2239cea8 (diff) | |
download | ComputeLibrary-6b3865ad038d60a126fe1f90df815a480527a29f.tar.gz |
COMPMID-3080: Implement Hard-Swish activation in CL
Change-Id: I5ed35a5e0fba09791e4371b1a74108a1fdfed900
Signed-off-by: morgolock <pablo.tello@arm.com>
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/2848
Reviewed-by: Sang-Hoon Park <sang-hoon.park@arm.com>
Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/core/CL')
-rw-r--r-- | src/core/CL/cl_kernels/activation_float_helpers.h | 6 | ||||
-rw-r--r-- | src/core/CL/cl_kernels/activation_quant_helpers.h | 9 | ||||
-rw-r--r-- | src/core/CL/kernels/CLActivationLayerKernel.cpp | 10 |
3 files changed, 18 insertions, 7 deletions
diff --git a/src/core/CL/cl_kernels/activation_float_helpers.h b/src/core/CL/cl_kernels/activation_float_helpers.h index 0c82f83dbc..8590f25635 100644 --- a/src/core/CL/cl_kernels/activation_float_helpers.h +++ b/src/core/CL/cl_kernels/activation_float_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ARM Limited. + * Copyright (c) 2019-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -29,6 +29,10 @@ #else // GPU_ARCH == GPU_ARCH_BIFROST #define MLA(a, b, c) ((b) * (c) + (a)) #endif // GPU_ARCH == GPU_ARCH_BIFROST + +// Hard-Swish +#define hard_swish_op(DATA_TYPE, x, A_VAL, B_VAL) (x * ((min(max((x + (DATA_TYPE)3.0), (DATA_TYPE)0.0), (DATA_TYPE)6.0)) * (DATA_TYPE)0.166666667)) + // Logistic Activation #define logistic_op(DATA_TYPE, x, A_VAL, B_VAL) ((DATA_TYPE)1.0 / ((DATA_TYPE)1.0 + exp(-x))) diff --git a/src/core/CL/cl_kernels/activation_quant_helpers.h b/src/core/CL/cl_kernels/activation_quant_helpers.h index 0e4eb2b32e..7eaf082df3 100644 --- a/src/core/CL/cl_kernels/activation_quant_helpers.h +++ b/src/core/CL/cl_kernels/activation_quant_helpers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 ARM Limited. + * Copyright (c) 2019-2020 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -48,6 +48,11 @@ inline TYPE lu_brelu_op(TYPE x) { return min(max(x, (TYPE)B_VAL), (TYPE)A_VAL); } +// Hard Swish Activation +inline TYPE hard_swish_op(TYPE x) +{ + return (x * ((min(max((TYPE)(x + (TYPE)3.f), (TYPE)0.f), (TYPE)6.f)) * (TYPE)0.166666667f)); +} #define ACTIVATION_OP2(op, x) op##_op(x) #define ACTIVATION_OP(op, x) ACTIVATION_OP2(op, x) @@ -81,4 +86,4 @@ inline TYPE lu_brelu_op(TYPE x) ({ \ data = ACTIVATION_OP(act, data); \ }) -#endif /* defined(S1_VAL) && defined(S2_VAL) */
\ No newline at end of file +#endif /* defined(S1_VAL) && defined(S2_VAL) */ diff --git a/src/core/CL/kernels/CLActivationLayerKernel.cpp b/src/core/CL/kernels/CLActivationLayerKernel.cpp index 270eb78dcb..350929500b 100644 --- a/src/core/CL/kernels/CLActivationLayerKernel.cpp +++ b/src/core/CL/kernels/CLActivationLayerKernel.cpp @@ -54,7 +54,8 @@ Status validate_arguments(const ITensorInfo *input, const ITensorInfo *output, c ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, ActivationLayerInfo::ActivationFunction::LOGISTIC, - ActivationLayerInfo::ActivationFunction::TANH + ActivationLayerInfo::ActivationFunction::TANH, + ActivationLayerInfo::ActivationFunction::HARD_SWISH }; const DataType data_type = input->data_type(); const QuantizationInfo &oq_info = (output != nullptr) ? output->quantization_info() : input->quantization_info(); @@ -139,9 +140,10 @@ void CLActivationLayerKernel::configure(ICLTensor *input, ICLTensor *output, Act float a_const = act_info.a(); float b_const = act_info.b(); - const ActivationLayerInfo::ActivationFunction f_act = act_info.activation(); - const bool is_quantized = is_data_type_quantized(dt); - const bool perform_activation_in_float = (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) || (f_act == ActivationLayerInfo::ActivationFunction::TANH); + const ActivationLayerInfo::ActivationFunction f_act = act_info.activation(); + const bool is_quantized = is_data_type_quantized(dt); + const bool perform_activation_in_float = + (f_act == ActivationLayerInfo::ActivationFunction::LOGISTIC) || (f_act == ActivationLayerInfo::ActivationFunction::TANH) || (f_act == ActivationLayerInfo::ActivationFunction::HARD_SWISH); // Set build options CLBuildOptions build_opts; |