blob: 4cc589c71a13e72053d2d832e2b80818e9be0ed0 [file] [log] [blame]
Sanghoon Lee70f82912017-08-24 14:21:24 +01001/*
2 * Copyright (c) 2017 ARM Limited.
3 *
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,
21 * OUT OF OR IN CONCLCTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * 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"
36#include "tests/validation/fixtures/ArithmeticAdditionFixture.h"
37#include "tests/validation/half.h"
38
39namespace arm_compute
40{
41namespace test
42{
43namespace validation
44{
45namespace
46{
47/** Input data sets **/
48const auto ArithmeticAdditionU8Dataset = combine(combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8)), framework::dataset::make("DataType",
49 DataType::U8));
50const auto ArithmeticAdditionS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::U8, DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
51 framework::dataset::make("DataType", DataType::S16));
52const auto ArithmeticAdditionQS8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QS8), framework::dataset::make("DataType", DataType::QS8)),
53 framework::dataset::make("DataType", DataType::QS8));
54const auto ArithmeticAdditionQS16Dataset = combine(combine(framework::dataset::make("DataType", DataType::QS16), framework::dataset::make("DataType", DataType::QS16)),
55 framework::dataset::make("DataType", DataType::QS16));
56#ifdef ARM_COMPUTE_ENABLE_FP16
57const auto ArithmeticAdditionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
58 framework::dataset::make("DataType", DataType::F16));
59#endif /* ARM_COMPUTE_ENABLE_FP16 */
60const auto ArithmeticAdditionFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
61 framework::dataset::make("DataType", DataType::F32));
62} // namespace
63
64TEST_SUITE(NEON)
65TEST_SUITE(ArithmeticAddition)
66
67template <typename T>
68using NEArithmeticAdditionFixture = ArithmeticAdditionValidationFixture<Tensor, Accessor, NEArithmeticAddition, T>;
69
70TEST_SUITE(U8)
71DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
72 shape, policy)
73{
74 // Create tensors
75 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::U8);
76 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::U8);
77 Tensor dst = create_tensor<Tensor>(shape, DataType::U8);
78
79 // Create and Configure function
80 NEArithmeticAddition add;
81 add.configure(&ref_src1, &ref_src2, &dst, policy);
82
83 // Validate valid region
84 const ValidRegion valid_region = shape_to_valid_region(shape);
85 validate(dst.info()->valid_region(), valid_region);
86
87 // Validate padding
88 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
89 validate(ref_src1.info()->padding(), padding);
90 validate(ref_src2.info()->padding(), padding);
91 validate(dst.info()->padding(), padding);
92}
93
94FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionU8Dataset),
95 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
96{
97 // Validate output
98 validate(Accessor(_target), _reference);
99}
100TEST_SUITE_END()
101
102TEST_SUITE(S16)
103DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("DataType", { DataType::U8, DataType::S16 })),
104 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
105 shape, data_type, policy)
106{
107 // Create tensors
108 Tensor ref_src1 = create_tensor<Tensor>(shape, data_type);
109 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::S16);
110 Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
111
112 // Create and Configure function
113 NEArithmeticAddition add;
114 add.configure(&ref_src1, &ref_src2, &dst, policy);
115
116 // Validate valid region
117 const ValidRegion valid_region = shape_to_valid_region(shape);
118 validate(dst.info()->valid_region(), valid_region);
119
120 // Validate padding
121 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
122 validate(ref_src1.info()->padding(), padding);
123 validate(ref_src2.info()->padding(), padding);
124 validate(dst.info()->padding(), padding);
125}
126
127FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionS16Dataset),
128 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
129{
130 // Validate output
131 validate(Accessor(_target), _reference);
132}
133
134FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionS16Dataset),
135 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
136{
137 // Validate output
138 validate(Accessor(_target), _reference);
139}
140TEST_SUITE_END()
141
142template <typename T>
143using NEArithmeticAdditionFixedPointFixture = ArithmeticAdditionValidationFixedPointFixture<Tensor, Accessor, NEArithmeticAddition, T>;
144
145TEST_SUITE(Quantized)
146TEST_SUITE(QS8)
147FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixedPointFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQS8Dataset),
148 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
149 framework::dataset::make("FractionalBits", 1, 7)))
150{
151 // Validate output
152 validate(Accessor(_target), _reference);
153}
154
155FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixedPointFixture<int8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), ArithmeticAdditionQS8Dataset),
156 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
157 framework::dataset::make("FractionalBits", 1, 7)))
158{
159 // Validate output
160 validate(Accessor(_target), _reference);
161}
162TEST_SUITE_END()
163
164TEST_SUITE(QS16)
165FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixedPointFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), ArithmeticAdditionQS16Dataset),
166 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
167 framework::dataset::make("FractionalBits", 1, 15)))
168{
169 // Validate output
170 validate(Accessor(_target), _reference);
171}
172
173FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixedPointFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), ArithmeticAdditionQS16Dataset),
174 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
175 framework::dataset::make("FractionalBits", 1, 15)))
176{
177 // Validate output
178 validate(Accessor(_target), _reference);
179}
180TEST_SUITE_END()
181TEST_SUITE_END()
182
183TEST_SUITE(Float)
184#ifdef ARM_COMPUTE_ENABLE_FP16
185TEST_SUITE(F16)
186FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<half_float::half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP16Dataset),
187 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
188{
189 // Validate output
190 validate(Accessor(_target), _reference);
191}
192TEST_SUITE_END()
193#endif /* ARM_COMPUTE_ENABLE_FP16 */
194
195TEST_SUITE(F32)
196DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
197 shape, policy)
198{
199 // Create tensors
200 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::F32);
201 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::F32);
202 Tensor dst = create_tensor<Tensor>(shape, DataType::F32);
203
204 // Create and Configure function
205 NEArithmeticAddition add;
206 add.configure(&ref_src1, &ref_src2, &dst, policy);
207
208 // Validate valid region
209 const ValidRegion valid_region = shape_to_valid_region(shape);
210 validate(dst.info()->valid_region(), valid_region);
211
212 // Validate padding
213 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
214 validate(ref_src1.info()->padding(), padding);
215 validate(ref_src2.info()->padding(), padding);
216 validate(dst.info()->padding(), padding);
217}
218
219FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticAdditionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticAdditionFP32Dataset),
220 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
221{
222 // Validate output
223 validate(Accessor(_target), _reference);
224}
225
226FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticAdditionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticAdditionFP32Dataset),
227 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
228{
229 // Validate output
230 validate(Accessor(_target), _reference);
231}
232TEST_SUITE_END()
233TEST_SUITE_END()
234
235TEST_SUITE_END()
236TEST_SUITE_END()
237} // namespace validation
238} // namespace test
239} // namespace arm_compute