blob: 213dbc1f5ef77c170758db52120fff3697ce623d [file] [log] [blame]
Sanghoon Lee70f82912017-08-24 14:21:24 +01001/*
Michalis Spyroua3c9a3b2020-12-08 21:02:16 +00002 * Copyright (c) 2017-2021 Arm Limited.
Sanghoon Lee70f82912017-08-24 14:21:24 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Georgios Pinitas5a594532018-12-03 14:30:05 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Sanghoon Lee70f82912017-08-24 14:21:24 +010022 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEArithmeticAddition.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
28#include "tests/NEON/Accessor.h"
29#include "tests/PaddingCalculator.h"
30#include "tests/datasets/ConvertPolicyDataset.h"
31#include "tests/datasets/ShapeDatasets.h"
32#include "tests/framework/Asserts.h"
33#include "tests/framework/Macros.h"
34#include "tests/framework/datasets/Datasets.h"
35#include "tests/validation/Validation.h"
Georgios Pinitascbf39c62018-09-10 15:07:45 +010036#include "tests/validation/fixtures/ArithmeticOperationsFixture.h"
Sanghoon Lee70f82912017-08-24 14:21:24 +010037
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
Georgios Pinitasbdcdc392021-04-22 16:42:03 +010046#if !defined(__aarch64__) || defined(ENABLE_SVE)
Manuel Bottini65383e22019-06-24 14:25:32 +010047constexpr AbsoluteTolerance<float> tolerance_quant(1); /**< Tolerance value for comparing reference's output against implementation's output for quantized data types */
Georgios Pinitasbdcdc392021-04-22 16:42:03 +010048#else // !defined(__aarch64__) || defined(ENABLE_SVE)
Michalis Spyroua3c9a3b2020-12-08 21:02:16 +000049constexpr AbsoluteTolerance<float> tolerance_quant(0);
Georgios Pinitasbdcdc392021-04-22 16:42:03 +010050#endif // !defined(__aarch64__) || defined(ENABLE_SVE)
Sanghoon Lee70f82912017-08-24 14:21:24 +010051} // namespace
52
53TEST_SUITE(NEON)
54TEST_SUITE(ArithmeticAddition)
55
56template <typename T>
57using NEArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
58
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000059// *INDENT-OFF*
60// clang-format off
61DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Georgios Pinitasda816752021-07-02 09:22:14 +010062 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
Georgios Pinitas5a594532018-12-03 14:30:05 +000063 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Unsupported broadcast
64 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
65 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),// Mismatching shapes
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000066 }),
Georgios Pinitasda816752021-07-02 09:22:14 +010067 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
Georgios Pinitas5a594532018-12-03 14:30:05 +000068 TensorInfo(TensorShape(1U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000069 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
70 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000071 })),
Georgios Pinitasda816752021-07-02 09:22:14 +010072 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
Georgios Pinitas5a594532018-12-03 14:30:05 +000073 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000074 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
75 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000076 })),
Georgios Pinitasda816752021-07-02 09:22:14 +010077 framework::dataset::make("Expected", { true, false, false, false})),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000078 input1_info, input2_info, output_info, expected)
79{
Georgios Pinitas5a594532018-12-03 14:30:05 +000080 Status s = NEArithmeticAddition::validate(&input1_info.clone()->set_is_resizable(false),
81 &input2_info.clone()->set_is_resizable(false),
82 &output_info.clone()->set_is_resizable(false),
83 ConvertPolicy::WRAP);
84 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000085}
86// clang-format on
87// *INDENT-ON*
88
Michele Di Giorgio3be0b8c2020-06-18 15:28:54 +010089TEST_CASE(NoPaddingAdded, framework::DatasetMode::PRECOMMIT)
90{
91 // NEArithmeticAddition doesn't use padding, so make sure this is the case.
92 Tensor input1 = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32);
93 Tensor input2 = create_tensor<Tensor>(TensorShape(15U, 1U), DataType::F32);
94 Tensor output = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32);
95
96 NEArithmeticAddition add;
97 add.configure(&input1, &input2, &output, ConvertPolicy::WRAP);
98
99 // Validate padding is zero
100 validate(input1.info()->padding(), PaddingSize());
101 validate(input2.info()->padding(), PaddingSize());
102 validate(output.info()->padding(), PaddingSize());
103}
104
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000105TEST_SUITE(Integer)
Sanghoon Lee70f82912017-08-24 14:21:24 +0100106TEST_SUITE(U8)
Georgios Pinitasda816752021-07-02 09:22:14 +0100107FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::U8)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000108 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100109{
110 // Validate output
111 validate(Accessor(_target), _reference);
112}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000113TEST_SUITE_END() // U8
Sanghoon Lee70f82912017-08-24 14:21:24 +0100114
115TEST_SUITE(S16)
Georgios Pinitasda816752021-07-02 09:22:14 +0100116FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::S16)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000117 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100118{
119 // Validate output
120 validate(Accessor(_target), _reference);
121}
122
Georgios Pinitasda816752021-07-02 09:22:14 +0100123FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), framework::dataset::make("DataType", DataType::S16)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000124 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100125{
126 // Validate output
127 validate(Accessor(_target), _reference);
128}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000129TEST_SUITE_END() // S16
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100130
131TEST_SUITE(S32)
Georgios Pinitasda816752021-07-02 09:22:14 +0100132FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int32_t>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::S32)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000133 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100134{
135 // Validate output
136 validate(Accessor(_target), _reference);
137}
138TEST_SUITE_END() // S32
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000139TEST_SUITE_END() // Integer
Sanghoon Lee70f82912017-08-24 14:21:24 +0100140
Sanghoon Lee70f82912017-08-24 14:21:24 +0100141TEST_SUITE(Float)
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000142#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +0100143TEST_SUITE(F16)
Georgios Pinitasda816752021-07-02 09:22:14 +0100144FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::F16)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000145 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100146{
147 // Validate output
148 validate(Accessor(_target), _reference);
149}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000150TEST_SUITE_END() // F16
151#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +0100152
153TEST_SUITE(F32)
Georgios Pinitasda816752021-07-02 09:22:14 +0100154FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::F32)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000155 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100156{
157 // Validate output
158 validate(Accessor(_target), _reference);
159}
160
Georgios Pinitasda816752021-07-02 09:22:14 +0100161FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), framework::dataset::make("DataType", DataType::F32)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000162 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100163{
164 // Validate output
165 validate(Accessor(_target), _reference);
166}
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000167
168template <typename T>
169using NEArithmeticAdditionBroadcastFixture = ArithmeticAdditionBroadcastValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
170
Michele Di Giorgio19023832020-06-17 16:08:10 +0000171FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapesBroadcast(),
Georgios Pinitasda816752021-07-02 09:22:14 +0100172 framework::dataset::make("DataType", DataType::F32)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000173 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000174{
175 // Validate output
176 validate(Accessor(_target), _reference);
177}
178
Michele Di Giorgio19023832020-06-17 16:08:10 +0000179FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapesBroadcast(),
Georgios Pinitasda816752021-07-02 09:22:14 +0100180 framework::dataset::make("DataType", DataType::F32)),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000181 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000182{
183 // Validate output
184 validate(Accessor(_target), _reference);
185}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000186TEST_SUITE_END() // F32
187TEST_SUITE_END() // Float
Sanghoon Lee70f82912017-08-24 14:21:24 +0100188
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000189template <typename T>
190using NEArithmeticAdditionQuantizedFixture = ArithmeticAdditionValidationQuantizedFixture<Tensor, Accessor, NEArithmeticAddition, T>;
191
Michalis Spyrou2232a202020-07-13 15:15:33 +0100192template <typename T>
193using NEArithmeticAdditionQuantizedBroadcastFixture = ArithmeticAdditionValidationQuantizedBroadcastFixture<Tensor, Accessor, NEArithmeticAddition, T>;
194
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000195TEST_SUITE(Quantized)
196TEST_SUITE(QASYMM8)
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000197FIXTURE_DATA_TEST_CASE(RunSmall,
198 NEArithmeticAdditionQuantizedFixture<uint8_t>,
199 framework::DatasetMode::PRECOMMIT,
Georgios Pinitasda816752021-07-02 09:22:14 +0100200 combine(combine(combine(combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::QASYMM8)),
Manuel Bottini6a2b6e82019-02-25 13:50:11 +0000201 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100202 framework::dataset::make("Src0QInfo", { QuantizationInfo(5.f / 255.f, 20) })),
203 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 255.f, 10) })),
204 framework::dataset::make("OutQInfo", { QuantizationInfo(1.f / 255.f, 5) })))
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000205{
206 // Validate output
Manuel Bottini65383e22019-06-24 14:25:32 +0100207 validate(Accessor(_target), _reference, tolerance_quant);
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000208}
209TEST_SUITE_END() // QASYMM8
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000210
211TEST_SUITE(QASYMM8_SIGNED)
212FIXTURE_DATA_TEST_CASE(RunSmall,
213 NEArithmeticAdditionQuantizedFixture<int8_t>,
214 framework::DatasetMode::ALL,
Georgios Pinitasda816752021-07-02 09:22:14 +0100215 combine(combine(combine(combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000216 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
217 framework::dataset::make("Src0QInfo", { QuantizationInfo(0.5f, 20) })),
218 framework::dataset::make("Src1QInfo", { QuantizationInfo(0.5f, 10) })),
219 framework::dataset::make("OutQInfo", { QuantizationInfo(0.5f, 5) })))
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100220{
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000221 // Validate output
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000222 validate(Accessor(_target), _reference, tolerance_quant);
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100223}
Michalis Spyrou2232a202020-07-13 15:15:33 +0100224
225FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionQuantizedBroadcastFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(
Georgios Pinitasda816752021-07-02 09:22:14 +0100226 datasets::SmallShapesBroadcast(), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
Michalis Spyrou2232a202020-07-13 15:15:33 +0100227 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
228 framework::dataset::make("Src0QInfo", { QuantizationInfo(0.5f, 20) })),
229 framework::dataset::make("Src1QInfo", { QuantizationInfo(0.5f, 10) })),
230 framework::dataset::make("OutQInfo", { QuantizationInfo(0.5f, 5) })))
231{
232 // Validate output
Michalis Spyrou2232a202020-07-13 15:15:33 +0100233 validate(Accessor(_target), _reference, tolerance_quant);
Michalis Spyrou2232a202020-07-13 15:15:33 +0100234}
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000235TEST_SUITE_END() // QASYMM8_SIGNED
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100236
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000237TEST_SUITE(QSYMM16)
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100238FIXTURE_DATA_TEST_CASE(RunSmall,
239 NEArithmeticAdditionQuantizedFixture<int16_t>,
240 framework::DatasetMode::PRECOMMIT,
Georgios Pinitasda816752021-07-02 09:22:14 +0100241 combine(combine(combine(combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", DataType::QSYMM16)),
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100242 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
243 framework::dataset::make("Src0QInfo", { QuantizationInfo(1.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
244 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
245 framework::dataset::make("OutQInfo", { QuantizationInfo(5.f / 32768.f, 0) })))
246{
247 // Validate output
Manuel Bottini65383e22019-06-24 14:25:32 +0100248 validate(Accessor(_target), _reference, tolerance_quant);
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100249}
250TEST_SUITE_END() // QSYMM16
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000251TEST_SUITE_END() // Quantized
252
253TEST_SUITE_END() // ArithmeticAddition
Sheri Zhangac6499a2021-02-10 15:32:38 +0000254TEST_SUITE_END() // Neon
Sanghoon Lee70f82912017-08-24 14:21:24 +0100255} // namespace validation
256} // namespace test
257} // namespace arm_compute