blob: 9a86b541de6ed86d277662d84a62ed1c35cad8cd [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
Sheri Zhangac6499a2021-02-10 15:32:38 +00002 * Copyright (c) 2018-2021 Arm Limited.
giuros0192fd9432018-12-03 17:30:00 +00003 *
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 Pinitas2d6cb172018-12-24 15:00:43 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
giuros0192fd9432018-12-03 17:30:00 +000022 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEElementwiseOperations.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/ShapeDatasets.h"
31#include "tests/framework/Asserts.h"
32#include "tests/framework/Macros.h"
33#include "tests/framework/datasets/Datasets.h"
34#include "tests/validation/Validation.h"
35#include "tests/validation/fixtures/ElementwiseOperationsFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
45RelativeTolerance<float> tolerance_fp32(0.000001f);
Georgios Pinitas2d6cb172018-12-24 15:00:43 +000046#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
47RelativeTolerance<float> tolerance_fp16(0.01f);
48#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
49
giuros0192fd9432018-12-03 17:30:00 +000050/** Input data sets **/
51const auto ElementwiseSquaredDiffQASYMM8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::QASYMM8)),
52 framework::dataset::make("DataType",
53 DataType::QASYMM8));
morgolock6427c822020-01-13 11:53:20 +000054
55const auto ElementwiseSquaredDiffQASYMM8SignedDataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8_SIGNED), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
56 framework::dataset::make("DataType",
57 DataType::QASYMM8_SIGNED));
58
giuros0192fd9432018-12-03 17:30:00 +000059/** Input data sets **/
60const auto ElementwiseSquaredDiffS32Dataset = combine(combine(framework::dataset::make("DataType", DataType::S32), framework::dataset::make("DataType", DataType::S32)),
61 framework::dataset::make("DataType",
62 DataType::S32));
63const auto ElementwiseSquaredDiffS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
64 framework::dataset::make("DataType", DataType::S16));
65#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
66const auto ElementwiseSquaredDiffFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
67 framework::dataset::make("DataType", DataType::F16));
68#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
69const auto ElementwiseSquaredDiffFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
70 framework::dataset::make("DataType", DataType::F32));
Sheri Zhanga387e272021-06-29 17:34:06 +010071const auto InPlaceDataSet = framework::dataset::make("InPlace", { false, true });
72const auto OutOfPlaceDataSet = framework::dataset::make("InPlace", { false });
giuros0192fd9432018-12-03 17:30:00 +000073} // namespace
74
75TEST_SUITE(NEON)
76TEST_SUITE(ElementwiseSquaredDiff)
77
78template <typename T>
79using NEElementwiseSquaredDiffFixture = ElementwiseSquaredDiffValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
80
81// *INDENT-OFF*
82// clang-format off
83DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
84 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
85 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
86 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
87 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32), // Invalid data type combination
88 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
morgolock6427c822020-01-13 11:53:20 +000089 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8_SIGNED), // Mismatching types
giuros0192fd9432018-12-03 17:30:00 +000090 }),
91 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
92 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
93 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
94 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
95 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
morgolock6427c822020-01-13 11:53:20 +000096 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8_SIGNED),
giuros0192fd9432018-12-03 17:30:00 +000097 })),
98 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
99 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
100 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
101 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
102 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
morgolock6427c822020-01-13 11:53:20 +0000103 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8, QuantizationInfo(0.3f,1)),
giuros0192fd9432018-12-03 17:30:00 +0000104 })),
morgolock6427c822020-01-13 11:53:20 +0000105 framework::dataset::make("Expected", { true, true, true, false, false, false})),
giuros0192fd9432018-12-03 17:30:00 +0000106 input1_info, input2_info, output_info, expected)
107{
108 ARM_COMPUTE_EXPECT(bool(NEElementwiseSquaredDiff::validate(&input1_info.clone()->set_is_resizable(false), &input2_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false))) == expected, framework::LogLevel::ERRORS);
109}
110// clang-format on
111// *INDENT-ON*
112
113TEST_SUITE(S32)
Sheri Zhanga387e272021-06-29 17:34:06 +0100114FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<int32_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ElementwiseSquaredDiffS32Dataset),
115 InPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000116{
117 // Validate output
118 validate(Accessor(_target), _reference);
119}
120TEST_SUITE_END() // S32
121
122TEST_SUITE(S16)
Sheri Zhanga387e272021-06-29 17:34:06 +0100123FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<int16_t>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ElementwiseSquaredDiffS16Dataset),
124 InPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000125{
126 // Validate output
127 validate(Accessor(_target), _reference);
128}
129TEST_SUITE_END() // S16
130
131template <typename T>
132using NEElementwiseSquaredDiffQuantizedFixture = ElementwiseSquaredDiffValidationQuantizedFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
133
134TEST_SUITE(Quantized)
135TEST_SUITE(QASYMM8)
Sheri Zhanga387e272021-06-29 17:34:06 +0100136FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
giuros0192fd9432018-12-03 17:30:00 +0000137 ElementwiseSquaredDiffQASYMM8Dataset),
138 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
139 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255.f, 10) })),
Sheri Zhanga387e272021-06-29 17:34:06 +0100140 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 5) })),
141 OutOfPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000142{
143 // Validate output
144 validate(Accessor(_target), _reference, tolerance_fp32, 0.01);
145}
146template <typename T>
147using NEElementwiseSquaredDiffQuantizedBroadcastFixture = ElementwiseSquaredDiffQuantizedBroadcastValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
148
149FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEElementwiseSquaredDiffQuantizedBroadcastFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
Sheri Zhanga387e272021-06-29 17:34:06 +0100150 combine(combine(combine(combine(combine(datasets::SmallShapesBroadcast(),
151 ElementwiseSquaredDiffQASYMM8Dataset),
152 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
153 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255.f, 10) })),
154 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 5) })),
155 OutOfPlaceDataSet))
156{
157 // Validate output
158 validate(Accessor(_target), _reference);
159}
160FIXTURE_DATA_TEST_CASE(RunTinyBroadcastInPlace, NEElementwiseSquaredDiffQuantizedBroadcastFixture<uint8_t>, framework::DatasetMode::ALL,
161 combine(combine(combine(combine(combine(datasets::TinyShapesBroadcastInplace(),
162 ElementwiseSquaredDiffQASYMM8Dataset),
163 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
giuros0192fd9432018-12-03 17:30:00 +0000164 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
Sheri Zhanga387e272021-06-29 17:34:06 +0100165 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
166 InPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000167{
168 // Validate output
169 validate(Accessor(_target), _reference);
170}
171TEST_SUITE_END()
morgolock6427c822020-01-13 11:53:20 +0000172
173TEST_SUITE(QASYMM8_SIGNED)
Sheri Zhanga387e272021-06-29 17:34:06 +0100174FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(datasets::SmallShapes(),
morgolock6427c822020-01-13 11:53:20 +0000175 ElementwiseSquaredDiffQASYMM8SignedDataset),
176 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f, 5) })),
177 framework::dataset::make("QuantizationInfo", { QuantizationInfo(.5f, 5) })),
Sheri Zhanga387e272021-06-29 17:34:06 +0100178 framework::dataset::make("QuantizationInfo", { QuantizationInfo(.2f, 5) })),
179 OutOfPlaceDataSet))
morgolock6427c822020-01-13 11:53:20 +0000180{
181 // Validate output
182 validate(Accessor(_target), _reference);
183}
184TEST_SUITE_END()
giuros0192fd9432018-12-03 17:30:00 +0000185TEST_SUITE_END()
186
187TEST_SUITE(Float)
188#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
189TEST_SUITE(F16)
Sheri Zhanga387e272021-06-29 17:34:06 +0100190FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ElementwiseSquaredDiffFP16Dataset),
191 InPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000192{
193 // Validate output
Georgios Pinitas2d6cb172018-12-24 15:00:43 +0000194 validate(Accessor(_target), _reference, tolerance_fp16, 0.01);
giuros0192fd9432018-12-03 17:30:00 +0000195}
196TEST_SUITE_END() // F16
197#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
198
199TEST_SUITE(F32)
Sheri Zhanga387e272021-06-29 17:34:06 +0100200FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<float>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ElementwiseSquaredDiffFP32Dataset),
201 InPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000202{
203 // Validate output
204 validate(Accessor(_target), _reference);
205}
giuros0192fd9432018-12-03 17:30:00 +0000206template <typename T>
207using NEElementwiseSquaredDiffBroadcastFixture = ElementwiseSquaredDiffBroadcastValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
208
Sheri Zhanga387e272021-06-29 17:34:06 +0100209FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEElementwiseSquaredDiffBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapesBroadcast(),
210 ElementwiseSquaredDiffFP32Dataset),
211 OutOfPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000212{
213 // Validate output
214 validate(Accessor(_target), _reference);
215}
216
Sheri Zhanga387e272021-06-29 17:34:06 +0100217FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEElementwiseSquaredDiffBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapesBroadcast(),
218 ElementwiseSquaredDiffFP32Dataset),
219 OutOfPlaceDataSet))
giuros0192fd9432018-12-03 17:30:00 +0000220{
221 // Validate output
222 validate(Accessor(_target), _reference);
223}
224TEST_SUITE_END() // F32
225TEST_SUITE_END() // Float
226
227TEST_SUITE_END() // ElementwiseSquaredDiff
Sheri Zhangac6499a2021-02-10 15:32:38 +0000228TEST_SUITE_END() // Neon
giuros0192fd9432018-12-03 17:30:00 +0000229} // namespace validation
230} // namespace test
231} // namespace arm_compute