blob: 72993172fd0cf11f2faf98753226e7ff0095c41c [file] [log] [blame]
Sanghoon Lee70f82912017-08-24 14:21:24 +01001/*
Michele Di Giorgio11c562c2020-06-10 16:34:50 +01002 * Copyright (c) 2017-2020 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{
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +000046#ifndef __aarch64__
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 */
48#endif //__aarch64__
Georgios Pinitasa84faff2018-12-05 18:17:24 +000049
Sanghoon Lee70f82912017-08-24 14:21:24 +010050/** Input data sets **/
51const auto ArithmeticAdditionU8Dataset = combine(combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8)), framework::dataset::make("DataType",
52 DataType::U8));
53const auto ArithmeticAdditionS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::U8, DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
54 framework::dataset::make("DataType", DataType::S16));
Michele Di Giorgio11c562c2020-06-10 16:34:50 +010055const auto ArithmeticAdditionS32Dataset = combine(combine(framework::dataset::make("DataType", { DataType::S32 }), framework::dataset::make("DataType", DataType::S32)),
56 framework::dataset::make("DataType", DataType::S32));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000057#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +010058const auto ArithmeticAdditionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
59 framework::dataset::make("DataType", DataType::F16));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000060#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +010061const auto ArithmeticAdditionFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
62 framework::dataset::make("DataType", DataType::F32));
Georgios Pinitasa84faff2018-12-05 18:17:24 +000063const auto ArithmeticAdditionQASYMM8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::QASYMM8)),
64 framework::dataset::make("DataType", DataType::QASYMM8));
Michalis Spyroubc4d7c22019-12-03 15:11:09 +000065const 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 +010066 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED));
Manuel Bottini3689fcd2019-06-14 17:18:12 +010067const auto ArithmeticAdditionQSYMM16Dataset = combine(combine(framework::dataset::make("DataType", DataType::QSYMM16), framework::dataset::make("DataType", DataType::QSYMM16)),
68 framework::dataset::make("DataType", DataType::QSYMM16));
Sanghoon Lee70f82912017-08-24 14:21:24 +010069} // namespace
70
71TEST_SUITE(NEON)
72TEST_SUITE(ArithmeticAddition)
73
74template <typename T>
75using NEArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
76
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000077// *INDENT-OFF*
78// clang-format off
79DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
80 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
81 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000082 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Unsupported broadcast
83 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
84 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),// Mismatching shapes
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000085 }),
86 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
87 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000088 TensorInfo(TensorShape(1U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000089 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
90 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000091 })),
92 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
93 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000094 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000095 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
96 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000097 })),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +010098 framework::dataset::make("Expected", { true, true, false, false, false})),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000099 input1_info, input2_info, output_info, expected)
100{
Georgios Pinitas5a594532018-12-03 14:30:05 +0000101 Status s = NEArithmeticAddition::validate(&input1_info.clone()->set_is_resizable(false),
102 &input2_info.clone()->set_is_resizable(false),
103 &output_info.clone()->set_is_resizable(false),
104 ConvertPolicy::WRAP);
105 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +0000106}
107// clang-format on
108// *INDENT-ON*
109
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000110TEST_SUITE(Integer)
Sanghoon Lee70f82912017-08-24 14:21:24 +0100111TEST_SUITE(U8)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000112FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset),
113 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100114{
115 // Validate output
116 validate(Accessor(_target), _reference);
117}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000118TEST_SUITE_END() // U8
Sanghoon Lee70f82912017-08-24 14:21:24 +0100119
120TEST_SUITE(S16)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000121FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS16Dataset),
122 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100123{
124 // Validate output
125 validate(Accessor(_target), _reference);
126}
127
Michele Di Giorgio19023832020-06-17 16:08:10 +0000128FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionS16Dataset),
129 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100130{
131 // Validate output
132 validate(Accessor(_target), _reference);
133}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000134TEST_SUITE_END() // S16
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100135
136TEST_SUITE(S32)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000137FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int32_t>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS32Dataset),
138 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Michele Di Giorgio11c562c2020-06-10 16:34:50 +0100139{
140 // Validate output
141 validate(Accessor(_target), _reference);
142}
143TEST_SUITE_END() // S32
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000144TEST_SUITE_END() // Integer
Sanghoon Lee70f82912017-08-24 14:21:24 +0100145
Sanghoon Lee70f82912017-08-24 14:21:24 +0100146TEST_SUITE(Float)
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000147#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +0100148TEST_SUITE(F16)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000149FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP16Dataset),
150 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100151{
152 // Validate output
153 validate(Accessor(_target), _reference);
154}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000155TEST_SUITE_END() // F16
156#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +0100157
158TEST_SUITE(F32)
Michele Di Giorgio19023832020-06-17 16:08:10 +0000159FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP32Dataset),
160 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100161{
162 // Validate output
163 validate(Accessor(_target), _reference);
164}
165
Michele Di Giorgio19023832020-06-17 16:08:10 +0000166FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionFP32Dataset),
167 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100168{
169 // Validate output
170 validate(Accessor(_target), _reference);
171}
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000172
173template <typename T>
174using NEArithmeticAdditionBroadcastFixture = ArithmeticAdditionBroadcastValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
175
Michele Di Giorgio19023832020-06-17 16:08:10 +0000176FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapesBroadcast(),
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000177 ArithmeticAdditionFP32Dataset),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000178 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000179{
180 // Validate output
181 validate(Accessor(_target), _reference);
182}
183
Michele Di Giorgio19023832020-06-17 16:08:10 +0000184FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapesBroadcast(),
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000185 ArithmeticAdditionFP32Dataset),
Michele Di Giorgio19023832020-06-17 16:08:10 +0000186 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000187{
188 // Validate output
189 validate(Accessor(_target), _reference);
190}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000191TEST_SUITE_END() // F32
192TEST_SUITE_END() // Float
Sanghoon Lee70f82912017-08-24 14:21:24 +0100193
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000194template <typename T>
195using NEArithmeticAdditionQuantizedFixture = ArithmeticAdditionValidationQuantizedFixture<Tensor, Accessor, NEArithmeticAddition, T>;
196
197TEST_SUITE(Quantized)
198TEST_SUITE(QASYMM8)
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000199FIXTURE_DATA_TEST_CASE(RunSmall,
200 NEArithmeticAdditionQuantizedFixture<uint8_t>,
201 framework::DatasetMode::PRECOMMIT,
202 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8Dataset),
Manuel Bottini6a2b6e82019-02-25 13:50:11 +0000203 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100204 framework::dataset::make("Src0QInfo", { QuantizationInfo(5.f / 255.f, 20) })),
205 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 255.f, 10) })),
206 framework::dataset::make("OutQInfo", { QuantizationInfo(1.f / 255.f, 5) })))
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000207{
208 // Validate output
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +0000209#ifdef __aarch64__
210 validate(Accessor(_target), _reference);
Manuel Bottini6a2b6e82019-02-25 13:50:11 +0000211#else //__aarch64__
Manuel Bottini65383e22019-06-24 14:25:32 +0100212 validate(Accessor(_target), _reference, tolerance_quant);
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +0000213#endif //__aarch64__
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000214}
215TEST_SUITE_END() // QASYMM8
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000216
217TEST_SUITE(QASYMM8_SIGNED)
218FIXTURE_DATA_TEST_CASE(RunSmall,
219 NEArithmeticAdditionQuantizedFixture<int8_t>,
220 framework::DatasetMode::ALL,
221 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8SIGNEDDataset),
222 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
223 framework::dataset::make("Src0QInfo", { QuantizationInfo(0.5f, 20) })),
224 framework::dataset::make("Src1QInfo", { QuantizationInfo(0.5f, 10) })),
225 framework::dataset::make("OutQInfo", { QuantizationInfo(0.5f, 5) })))
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100226{
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000227 // Validate output
228#ifdef __aarch64__
229 validate(Accessor(_target), _reference);
230#else //__aarch64__
231 validate(Accessor(_target), _reference, tolerance_quant);
232#endif //__aarch64__
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100233}
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000234TEST_SUITE_END() // QASYMM8_SIGNED
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100235
Michalis Spyroubc4d7c22019-12-03 15:11:09 +0000236TEST_SUITE(QSYMM16)
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100237FIXTURE_DATA_TEST_CASE(RunSmall,
238 NEArithmeticAdditionQuantizedFixture<int16_t>,
239 framework::DatasetMode::PRECOMMIT,
240 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQSYMM16Dataset),
241 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
242 framework::dataset::make("Src0QInfo", { QuantizationInfo(1.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
243 framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 32768.f, 0), QuantizationInfo(5.f / 32768.f, 0) })),
244 framework::dataset::make("OutQInfo", { QuantizationInfo(5.f / 32768.f, 0) })))
245{
246 // Validate output
Manuel Bottini65383e22019-06-24 14:25:32 +0100247#ifdef __aarch64__
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100248 validate(Accessor(_target), _reference);
Manuel Bottini65383e22019-06-24 14:25:32 +0100249#else //__aarch64__
250 validate(Accessor(_target), _reference, tolerance_quant);
251#endif //__aarch64__
Manuel Bottini3689fcd2019-06-14 17:18:12 +0100252}
253TEST_SUITE_END() // QSYMM16
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000254TEST_SUITE_END() // Quantized
255
256TEST_SUITE_END() // ArithmeticAddition
257TEST_SUITE_END() // NEON
Sanghoon Lee70f82912017-08-24 14:21:24 +0100258} // namespace validation
259} // namespace test
260} // namespace arm_compute