blob: 98341805ed3e2601df63657ec16bb0325c2b135f [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{
Michalis Spyroua3c9a3b2020-12-08 21:02:16 +000046#if !defined(__aarch64__) || defined(__ARM_FEATURE_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 */
Michalis Spyroua3c9a3b2020-12-08 21:02:16 +000048#else // !defined(__aarch64__) || defined(__ARM_FEATURE_SVE)
49constexpr AbsoluteTolerance<float> tolerance_quant(0);
50#endif // !defined(__aarch64__) || defined(__ARM_FEATURE_SVE)
Georgios Pinitasa84faff2018-12-05 18:17:24 +000051
Sanghoon Lee70f82912017-08-24 14:21:24 +010052/** Input data sets **/
53const auto ArithmeticAdditionU8Dataset = combine(combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8)), framework::dataset::make("DataType",
54 DataType::U8));
55const auto ArithmeticAdditionS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::U8, DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
56 framework::dataset::make("DataType", DataType::S16));
Michele Di Giorgio11c562c2020-06-10 16:34:50 +010057const auto ArithmeticAdditionS32Dataset = combine(combine(framework::dataset::make("DataType", { DataType::S32 }), framework::dataset::make("DataType", DataType::S32)),
58 framework::dataset::make("DataType", DataType::S32));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000059#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +010060const auto ArithmeticAdditionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
61 framework::dataset::make("DataType", DataType::F16));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000062#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +010063const auto ArithmeticAdditionFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
64 framework::dataset::make("DataType", DataType::F32));
Georgios Pinitasa84faff2018-12-05 18:17:24 +000065const auto ArithmeticAdditionQASYMM8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::QASYMM8)),
66 framework::dataset::make("DataType", DataType::QASYMM8));
Michalis Spyroubc4d7c22019-12-03 15:11:09 +000067const auto ArithmeticAdditionQASYMM8SIGNEDDataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8_SIGNED), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
Michele Di Giorgio11c562c2020-06-10 16:34:50 +010068 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED));
Manuel Bottini3689fcd2019-06-14 17:18:12 +010069const auto ArithmeticAdditionQSYMM16Dataset = combine(combine(framework::dataset::make("DataType", DataType::QSYMM16), framework::dataset::make("DataType", DataType::QSYMM16)),
70 framework::dataset::make("DataType", DataType::QSYMM16));
Sanghoon Lee70f82912017-08-24 14:21:24 +010071} // namespace
72
73TEST_SUITE(NEON)
74TEST_SUITE(ArithmeticAddition)
75
76template <typename T>
77using NEArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
78
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000079// *INDENT-OFF*
80// clang-format off
81DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
82 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
83 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000084 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Unsupported broadcast
85 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
86 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),// Mismatching shapes
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000087 }),
88 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
89 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000090 TensorInfo(TensorShape(1U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000091 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
92 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000093 })),
94 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
95 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000096 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000097 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
98 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000099 })),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100100 framework::dataset::make("Expected", { true, true, false, false, false})),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +0000101 input1_info, input2_info, output_info, expected)
102{
Georgios Pinitas5a594532018-12-03 14:30:05 +0000103 Status s = NEArithmeticAddition::validate(&input1_info.clone()->set_is_resizable(false),
104 &input2_info.clone()->set_is_resizable(false),
105 &output_info.clone()->set_is_resizable(false),
106 ConvertPolicy::WRAP);
107 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +0000108}
109// clang-format on
110// *INDENT-ON*
111
Michele Di Giorgio3be0b8c2020-06-18 15:28:54 +0100112TEST_CASE(NoPaddingAdded, framework::DatasetMode::PRECOMMIT)
113{
114 // NEArithmeticAddition doesn't use padding, so make sure this is the case.
115 Tensor input1 = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32);
116 Tensor input2 = create_tensor<Tensor>(TensorShape(15U, 1U), DataType::F32);
117 Tensor output = create_tensor<Tensor>(TensorShape(15U, 15U), DataType::F32);
118
119 NEArithmeticAddition add;
120 add.configure(&input1, &input2, &output, ConvertPolicy::WRAP);
121
122 // Validate padding is zero
123 validate(input1.info()->padding(), PaddingSize());
124 validate(input2.info()->padding(), PaddingSize());
125 validate(output.info()->padding(), PaddingSize());
126}
127
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000128TEST_SUITE(Integer)
Sanghoon Lee70f82912017-08-24 14:21:24 +0100129TEST_SUITE(U8)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000130FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset),
131 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100132{
133 // Validate output
134 validate(Accessor(_target), _reference);
135}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000136TEST_SUITE_END() // U8
Sanghoon Lee70f82912017-08-24 14:21:24 +0100137
138TEST_SUITE(S16)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000139FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS16Dataset),
140 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100141{
142 // Validate output
143 validate(Accessor(_target), _reference);
144}
145
Michele Di Giorgio19023832020-06-17 16:08:10 +0000146FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionS16Dataset),
147 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100148{
149 // Validate output
150 validate(Accessor(_target), _reference);
151}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000152TEST_SUITE_END() // S16
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100153
154TEST_SUITE(S32)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000155FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int32_t>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS32Dataset),
156 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100157{
158 // Validate output
159 validate(Accessor(_target), _reference);
160}
161TEST_SUITE_END() // S32
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000162TEST_SUITE_END() // Integer
Sanghoon Lee70f82912017-08-24 14:21:24 +0100163
Sanghoon Lee70f82912017-08-24 14:21:24 +0100164TEST_SUITE(Float)
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000165#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +0100166TEST_SUITE(F16)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000167FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP16Dataset),
168 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100169{
170 // Validate output
171 validate(Accessor(_target), _reference);
172}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000173TEST_SUITE_END() // F16
174#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +0100175
176TEST_SUITE(F32)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000177FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP32Dataset),
178 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100179{
180 // Validate output
181 validate(Accessor(_target), _reference);
182}
183
Michele Di Giorgio19023832020-06-17 16:08:10 +0000184FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionFP32Dataset),
185 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100186{
187 // Validate output
188 validate(Accessor(_target), _reference);
189}
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000190
191template <typename T>
192using NEArithmeticAdditionBroadcastFixture = ArithmeticAdditionBroadcastValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
193
Michele Di Giorgio19023832020-06-17 16:08:10 +0000194FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapesBroadcast(),
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000195 ArithmeticAdditionFP32Dataset),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000196 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000197{
198 // Validate output
199 validate(Accessor(_target), _reference);
200}
201
Michele Di Giorgio19023832020-06-17 16:08:10 +0000202FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapesBroadcast(),
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000203 ArithmeticAdditionFP32Dataset),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000204 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000205{
206 // Validate output
207 validate(Accessor(_target), _reference);
208}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000209TEST_SUITE_END() // F32
210TEST_SUITE_END() // Float
Sanghoon Lee70f82912017-08-24 14:21:24 +0100211
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000212template <typename T>
213using NEArithmeticAdditionQuantizedFixture = ArithmeticAdditionValidationQuantizedFixture<Tensor, Accessor, NEArithmeticAddition, T>;
214
Michalis Spyrou2232a202020-07-13 15:15:33 +0100215template <typename T>
216using NEArithmeticAdditionQuantizedBroadcastFixture = ArithmeticAdditionValidationQuantizedBroadcastFixture<Tensor, Accessor, NEArithmeticAddition, T>;
217
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000218TEST_SUITE(Quantized)
219TEST_SUITE(QASYMM8)
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000220FIXTURE_DATA_TEST_CASE(RunSmall,
221 NEArithmeticAdditionQuantizedFixture<uint8_t>,
222 framework::DatasetMode::PRECOMMIT,
223 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8Dataset),
Manuel Bottini6a2b6e82019-02-25 13:50:11 +0000224 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100225 framework::dataset::make("Src0QInfo", { QuantizationInfo(5.f / 255.f, 20) })),
226 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 255.f, 10) })),
227 framework::dataset::make("OutQInfo", { QuantizationInfo(1.f / 255.f, 5) })))
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000228{
229 // Validate output
Manuel Bottini65383e22019-06-24 14:25:32 +0100230 validate(Accessor(_target), _reference, tolerance_quant);
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000231}
232TEST_SUITE_END() // QASYMM8
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000233
234TEST_SUITE(QASYMM8_SIGNED)
235FIXTURE_DATA_TEST_CASE(RunSmall,
236 NEArithmeticAdditionQuantizedFixture<int8_t>,
237 framework::DatasetMode::ALL,
238 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8SIGNEDDataset),
239 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
240 framework::dataset::make("Src0QInfo", { QuantizationInfo(0.5f, 20) })),
241 framework::dataset::make("Src1QInfo", { QuantizationInfo(0.5f, 10) })),
242 framework::dataset::make("OutQInfo", { QuantizationInfo(0.5f, 5) })))
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100243{
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000244 // Validate output
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000245 validate(Accessor(_target), _reference, tolerance_quant);
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100246}
Michalis Spyrou2232a202020-07-13 15:15:33 +0100247
248FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionQuantizedBroadcastFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(
249 datasets::SmallShapesBroadcast(), ArithmeticAdditionQASYMM8SIGNEDDataset),
250 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
251 framework::dataset::make("Src0QInfo", { QuantizationInfo(0.5f, 20) })),
252 framework::dataset::make("Src1QInfo", { QuantizationInfo(0.5f, 10) })),
253 framework::dataset::make("OutQInfo", { QuantizationInfo(0.5f, 5) })))
254{
255 // Validate output
Michalis Spyrou2232a202020-07-13 15:15:33 +0100256 validate(Accessor(_target), _reference, tolerance_quant);
Michalis Spyrou2232a202020-07-13 15:15:33 +0100257}
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000258TEST_SUITE_END() // QASYMM8_SIGNED
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100259
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000260TEST_SUITE(QSYMM16)
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100261FIXTURE_DATA_TEST_CASE(RunSmall,
262 NEArithmeticAdditionQuantizedFixture<int16_t>,
263 framework::DatasetMode::PRECOMMIT,
264 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQSYMM16Dataset),
265 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
266 framework::dataset::make("Src0QInfo", { QuantizationInfo(1.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
267 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
268 framework::dataset::make("OutQInfo", { QuantizationInfo(5.f / 32768.f, 0) })))
269{
270 // Validate output
Manuel Bottini65383e22019-06-24 14:25:32 +0100271 validate(Accessor(_target), _reference, tolerance_quant);
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100272}
273TEST_SUITE_END() // QSYMM16
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000274TEST_SUITE_END() // Quantized
275
276TEST_SUITE_END() // ArithmeticAddition
Sheri Zhangac6499a2021-02-10 15:32:38 +0000277TEST_SUITE_END() // Neon
Sanghoon Lee70f82912017-08-24 14:21:24 +0100278} // namespace validation
279} // namespace test
280} // namespace arm_compute