From d2191150736dde66d79eb97e0c8ee506eef3c8fc Mon Sep 17 00:00:00 2001 From: Gunes Bayir Date: Tue, 19 Mar 2024 22:10:04 +0000 Subject: Make Cpu/Gpu/Ref scalar/vectoral S32 division consistent - Neon(TM) implementation converts integers to float and performs the division because there is no vector integer division instructions. However, leftover loop still uses integer division, which makes results inconsistent depending on where we are in the tensor. - SVE path does it in integer domain. - OpenCL(TM) does it similar to Neon(TM) vector path. - Reference implementation does it in integer domain. These differences cause intermittent mismatches. This patch ensures all follow the same logic. On the other hand, the provided Neon(TM) implementation is faster than the Fp32 converted version. Resolves: COMPMID-6925 Change-Id: Ia12606d57f40a7d331b9b698f87fd4321496b275 Signed-off-by: Gunes Bayir Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/11316 Tested-by: Arm Jenkins Reviewed-by: Pablo Marquez Tello Comments-Addressed: Arm Jenkins Benchmark: Arm Jenkins --- tests/validation/NEON/ElementwiseDivision.cpp | 6 +++--- tests/validation/reference/ElementwiseOperations.cpp | 11 +---------- 2 files changed, 4 insertions(+), 13 deletions(-) (limited to 'tests') diff --git a/tests/validation/NEON/ElementwiseDivision.cpp b/tests/validation/NEON/ElementwiseDivision.cpp index 5f0224c91d..95db4ad5fd 100644 --- a/tests/validation/NEON/ElementwiseDivision.cpp +++ b/tests/validation/NEON/ElementwiseDivision.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2021 Arm Limited. + * Copyright (c) 2019-2021, 2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -43,7 +43,7 @@ namespace validation namespace { RelativeTolerance tolerance_fp32(0.000001f); -AbsoluteTolerance tolerance_zero_s32(1); // Tolerance for S32 division +AbsoluteTolerance tolerance_zero_s32(0); // Tolerance for S32 division /** Input data sets **/ const auto ElementwiseDivisionS32Dataset = combine(combine(framework::dataset::make("DataType", DataType::S32), @@ -177,7 +177,7 @@ TEST_SUITE_END() // S32 TEST_SUITE_END() // Integer TEST_SUITE_END() // ElementwiseDivision -TEST_SUITE_END() // Neon +TEST_SUITE_END() // NEON } // namespace validation } // namespace test } // namespace arm_compute diff --git a/tests/validation/reference/ElementwiseOperations.cpp b/tests/validation/reference/ElementwiseOperations.cpp index f22c84e153..edbbab8600 100644 --- a/tests/validation/reference/ElementwiseOperations.cpp +++ b/tests/validation/reference/ElementwiseOperations.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018-2020 Arm Limited. + * Copyright (c) 2018-2020, 2024 Arm Limited. * * SPDX-License-Identifier: MIT * @@ -74,15 +74,6 @@ T arithm_op(ArithmeticOperation op, T src1, T src2, ConvertPolicy convert_policy case ArithmeticOperation::DIV: { val = (static_cast(src1) / static_cast(src2)); - if(std::is_integral::value) - { - // Implement flooring division - val = (src2 == 0) ? 0 : val; - if(static_cast(src1) % static_cast(src2) != 0 && ((src1 < 0) != (src2 < 0))) - { - --val; - } - } break; } case ArithmeticOperation::POWER: -- cgit v1.2.1