From 0eed305680ade0c48d07f592c4c4a8aaaad077b7 Mon Sep 17 00:00:00 2001 From: Gunes Bayir Date: Sun, 4 Sep 2022 21:00:10 +0100 Subject: =?UTF-8?q?Optimize=20FP32/16=20Bilinear=20Scale=20Kernel=20for=20?= =?UTF-8?q?Neon=E2=84=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch removes index and weight pre-computations where it's not used and reduces some calculations inside the inner-most loop of Scale. Resolves: COMPMID-5452 Change-Id: Ie149b1b76a90a8cb659ada0f97aef78caf69932f Signed-off-by: Gunes Bayir Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/8220 Benchmark: Arm Jenkins Tested-by: Arm Jenkins Reviewed-by: Gian Marco Iodice Comments-Addressed: Arm Jenkins --- src/core/utils/ScaleUtils.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'src/core/utils/ScaleUtils.cpp') diff --git a/src/core/utils/ScaleUtils.cpp b/src/core/utils/ScaleUtils.cpp index d46ca0ea8e..82c6405e89 100644 --- a/src/core/utils/ScaleUtils.cpp +++ b/src/core/utils/ScaleUtils.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Arm Limited. + * Copyright (c) 2020, 2022 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -21,8 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ + #include "src/core/utils/ScaleUtils.h" -#include "arm_compute/core/Helpers.h" +#include "src/common/cpuinfo/CpuIsaInfo.h" + +#include "arm_compute/core/CPP/CPPTypes.h" +#include "arm_compute/core/TensorInfo.h" float arm_compute::scale_utils::calculate_resize_ratio(size_t input_size, size_t output_size, bool align_corners) { @@ -34,4 +38,14 @@ float arm_compute::scale_utils::calculate_resize_ratio(size_t input_size, size_t ARM_COMPUTE_ERROR_ON(out == 0); return static_cast(in) / static_cast(out); +} + +bool arm_compute::scale_utils::is_precomputation_required(DataLayout data_layout, DataType data_type, InterpolationPolicy policy) +{ + // whether to precompute indices & weights + // The Neon™ kernels (which are preferred over SVE when policy is BILINEAR) do not use + // precomputed index and weights when data type is FP32/16. + // If policy is nearest_neighbor for SVE, then precompute because it's being used + // To be revised in COMPMID-5453/5454 + return data_layout != DataLayout::NHWC || (data_type != DataType::F32 && data_type != DataType::F16) || (CPUInfo::get().get_isa().sve == true && policy == InterpolationPolicy::NEAREST_NEIGHBOR); } \ No newline at end of file -- cgit v1.2.1