blob: bad0b33d379a67d587a49751be668f52c0ce5f9e [file] [log] [blame]
Sanghoon Lee70f82912017-08-24 14:21:24 +01001/*
Georgios Pinitas5a594532018-12-03 14:30:05 +00002 * Copyright (c) 2017-2019 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__
Georgios Pinitasa84faff2018-12-05 18:17:24 +000047constexpr AbsoluteTolerance<float> tolerance_qasymm8(1); /**< Tolerance value for comparing reference's output against implementation's output for quantized data types */
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +000048#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));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000055#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +010056const auto ArithmeticAdditionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
57 framework::dataset::make("DataType", DataType::F16));
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +000058#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +010059const auto ArithmeticAdditionFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
60 framework::dataset::make("DataType", DataType::F32));
Georgios Pinitasa84faff2018-12-05 18:17:24 +000061const auto ArithmeticAdditionQASYMM8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::QASYMM8)),
62 framework::dataset::make("DataType", DataType::QASYMM8));
Sanghoon Lee70f82912017-08-24 14:21:24 +010063} // namespace
64
65TEST_SUITE(NEON)
66TEST_SUITE(ArithmeticAddition)
67
68template <typename T>
69using NEArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
70
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000071// *INDENT-OFF*
72// clang-format off
73DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
74 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
75 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000076 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Unsupported broadcast
77 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
78 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),// Mismatching shapes
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000079 }),
80 framework::dataset::make("Input2Info",{ 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(1U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000083 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
84 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000085 })),
86 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
87 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Georgios Pinitas5a594532018-12-03 14:30:05 +000088 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S16),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000089 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
90 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000091 })),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +010092 framework::dataset::make("Expected", { true, true, false, false, false})),
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000093 input1_info, input2_info, output_info, expected)
94{
Georgios Pinitas5a594532018-12-03 14:30:05 +000095 Status s = NEArithmeticAddition::validate(&input1_info.clone()->set_is_resizable(false),
96 &input2_info.clone()->set_is_resizable(false),
97 &output_info.clone()->set_is_resizable(false),
98 ConvertPolicy::WRAP);
99 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +0000100}
101// clang-format on
102// *INDENT-ON*
103
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000104TEST_SUITE(Integer)
Sanghoon Lee70f82912017-08-24 14:21:24 +0100105TEST_SUITE(U8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000106DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Sanghoon Lee70f82912017-08-24 14:21:24 +0100107 shape, policy)
108{
109 // Create tensors
110 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::U8);
111 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::U8);
112 Tensor dst = create_tensor<Tensor>(shape, DataType::U8);
113
114 // Create and Configure function
115 NEArithmeticAddition add;
116 add.configure(&ref_src1, &ref_src2, &dst, policy);
117
118 // Validate valid region
119 const ValidRegion valid_region = shape_to_valid_region(shape);
120 validate(dst.info()->valid_region(), valid_region);
121
122 // Validate padding
Georgios Pinitas5a594532018-12-03 14:30:05 +0000123 validate(ref_src1.info()->padding(), PaddingSize());
124 validate(ref_src2.info()->padding(), PaddingSize());
125 validate(dst.info()->padding(), PaddingSize());
Sanghoon Lee70f82912017-08-24 14:21:24 +0100126}
127
128FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset),
129 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
130{
131 // Validate output
132 validate(Accessor(_target), _reference);
133}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000134TEST_SUITE_END() // U8
Sanghoon Lee70f82912017-08-24 14:21:24 +0100135
136TEST_SUITE(S16)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000137DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("DataType", { DataType::U8, DataType::S16 })),
Sanghoon Lee70f82912017-08-24 14:21:24 +0100138 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
139 shape, data_type, policy)
140{
141 // Create tensors
142 Tensor ref_src1 = create_tensor<Tensor>(shape, data_type);
143 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::S16);
144 Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
145
146 // Create and Configure function
147 NEArithmeticAddition add;
148 add.configure(&ref_src1, &ref_src2, &dst, policy);
149
150 // Validate valid region
151 const ValidRegion valid_region = shape_to_valid_region(shape);
152 validate(dst.info()->valid_region(), valid_region);
153
154 // Validate padding
Georgios Pinitas5a594532018-12-03 14:30:05 +0000155 validate(ref_src1.info()->padding(), PaddingSize());
156 validate(ref_src2.info()->padding(), PaddingSize());
157 validate(dst.info()->padding(), PaddingSize());
Sanghoon Lee70f82912017-08-24 14:21:24 +0100158}
159
160FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS16Dataset),
161 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
162{
163 // Validate output
164 validate(Accessor(_target), _reference);
165}
166
167FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionS16Dataset),
168 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
169{
170 // Validate output
171 validate(Accessor(_target), _reference);
172}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000173TEST_SUITE_END() // S16
174TEST_SUITE_END() // Integer
Sanghoon Lee70f82912017-08-24 14:21:24 +0100175
Sanghoon Lee70f82912017-08-24 14:21:24 +0100176TEST_SUITE(Float)
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000177#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sanghoon Lee70f82912017-08-24 14:21:24 +0100178TEST_SUITE(F16)
Georgios Pinitas583137c2017-08-31 18:12:42 +0100179FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP16Dataset),
180 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee70f82912017-08-24 14:21:24 +0100181{
182 // Validate output
183 validate(Accessor(_target), _reference);
184}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000185TEST_SUITE_END() // F16
186#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Sanghoon Lee70f82912017-08-24 14:21:24 +0100187
188TEST_SUITE(F32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000189DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Sanghoon Lee70f82912017-08-24 14:21:24 +0100190 shape, policy)
191{
192 // Create tensors
193 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::F32);
194 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::F32);
195 Tensor dst = create_tensor<Tensor>(shape, DataType::F32);
196
197 // Create and Configure function
198 NEArithmeticAddition add;
199 add.configure(&ref_src1, &ref_src2, &dst, policy);
200
201 // Validate valid region
202 const ValidRegion valid_region = shape_to_valid_region(shape);
203 validate(dst.info()->valid_region(), valid_region);
204
205 // Validate padding
Georgios Pinitas5a594532018-12-03 14:30:05 +0000206 validate(ref_src1.info()->padding(), PaddingSize());
207 validate(ref_src2.info()->padding(), PaddingSize());
208 validate(dst.info()->padding(), PaddingSize());
Sanghoon Lee70f82912017-08-24 14:21:24 +0100209}
210
211FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP32Dataset),
212 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
213{
214 // Validate output
215 validate(Accessor(_target), _reference);
216}
217
218FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionFP32Dataset),
219 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
220{
221 // Validate output
222 validate(Accessor(_target), _reference);
223}
Diego Lopez Recas0021d752017-12-18 14:42:56 +0000224
225template <typename T>
226using NEArithmeticAdditionBroadcastFixture = ArithmeticAdditionBroadcastValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
227
228FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapesBroadcast(),
229 ArithmeticAdditionFP32Dataset),
230 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
231{
232 // Validate output
233 validate(Accessor(_target), _reference);
234}
235
236FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEArithmeticAdditionBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapesBroadcast(),
237 ArithmeticAdditionFP32Dataset),
238 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
239{
240 // Validate output
241 validate(Accessor(_target), _reference);
242}
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000243TEST_SUITE_END() // F32
244TEST_SUITE_END() // Float
Sanghoon Lee70f82912017-08-24 14:21:24 +0100245
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000246template <typename T>
247using NEArithmeticAdditionQuantizedFixture = ArithmeticAdditionValidationQuantizedFixture<Tensor, Accessor, NEArithmeticAddition, T>;
248
249TEST_SUITE(Quantized)
250TEST_SUITE(QASYMM8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000251DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000252 shape, policy)
253{
254 // Create tensors
255 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::QASYMM8);
256 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::QASYMM8);
257 Tensor dst = create_tensor<Tensor>(shape, DataType::QASYMM8);
258
259 // Create and Configure function
260 NEArithmeticAddition add;
261 add.configure(&ref_src1, &ref_src2, &dst, policy);
262
263 // Validate valid region
264 const ValidRegion valid_region = shape_to_valid_region(shape);
265 validate(dst.info()->valid_region(), valid_region);
266
267 // Validate padding
Georgios Pinitas5a594532018-12-03 14:30:05 +0000268 validate(ref_src1.info()->padding(), PaddingSize());
269 validate(ref_src2.info()->padding(), PaddingSize());
270 validate(dst.info()->padding(), PaddingSize());
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000271}
272
273FIXTURE_DATA_TEST_CASE(RunSmall,
274 NEArithmeticAdditionQuantizedFixture<uint8_t>,
275 framework::DatasetMode::PRECOMMIT,
276 combine(combine(combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQASYMM8Dataset),
277 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
278 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
279 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255.f, 10) })),
280 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 5) })))
281{
282 // Validate output
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +0000283#ifdef __aarch64__
284 validate(Accessor(_target), _reference);
285#else //__aarch64__
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000286 validate(Accessor(_target), _reference, tolerance_qasymm8);
Vidhya Sudhan Loganathanf8b65202019-02-01 09:49:50 +0000287#endif //__aarch64__
Georgios Pinitasa84faff2018-12-05 18:17:24 +0000288}
289TEST_SUITE_END() // QASYMM8
290TEST_SUITE_END() // Quantized
291
292TEST_SUITE_END() // ArithmeticAddition
293TEST_SUITE_END() // NEON
Sanghoon Lee70f82912017-08-24 14:21:24 +0100294} // namespace validation
295} // namespace test
296} // namespace arm_compute