xref: /aosp_15_r20/external/ComputeLibrary/tests/validation/NEON/PixelWiseMultiplication.cpp (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2017-2021 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 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #include "arm_compute/core/Rounding.h"
25 #include "arm_compute/runtime/NEON/functions/NEPixelWiseMultiplication.h"
26 #include "tests/NEON/Accessor.h"
27 #include "tests/PaddingCalculator.h"
28 #include "tests/datasets/ConvertPolicyDataset.h"
29 #include "tests/datasets/ShapeDatasets.h"
30 #include "tests/framework/Macros.h"
31 #include "tests/validation/Validation.h"
32 #include "tests/validation/fixtures/PixelWiseMultiplicationFixture.h"
33 
34 namespace arm_compute
35 {
36 namespace test
37 {
38 namespace validation
39 {
40 namespace
41 {
42 const float scale_unity = 1.f;
43 const float scale_255   = 1.f / 255.f;
44 const float scale_other = 1.f / 32768.f;
45 
46 constexpr AbsoluteTolerance<float> tolerance_qasymm8(1); /**< Tolerance value for comparing reference's output against implementation's output for 8-bit quantized asymmetric data types */
47 constexpr AbsoluteTolerance<float> tolerance_qsymm16(1); /**< Tolerance value for comparing reference's output against implementation's output for 16-bit quantized symmetric data types */
48 
49 const auto PixelWiseMultiplicationQSYMM16QuantDataset = combine(combine(
50                                                                     framework::dataset::make("Src0QInfo", { QuantizationInfo(1.f / 32768.f, 0) }),
51                                                                     framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 32768.f, 0) })),
52                                                                 framework::dataset::make("OutQInfo", { QuantizationInfo(5.f / 32768.f, 0) }));
53 
54 const auto PixelWiseMultiplicationQASYMM8QuantDataset = combine(combine(
55                                                                     framework::dataset::make("Src0QInfo", { QuantizationInfo(5.f / 32768.f, 0) }),
56                                                                     framework::dataset::make("Src1QInfo", { QuantizationInfo(2.f / 32768.f, 0) })),
57                                                                 framework::dataset::make("OutQInfo", { QuantizationInfo(1.f / 32768.f, 0) }));
58 
59 const auto PixelWiseMultiplicationQASYMM8QuantInPlaceDataset = combine(combine(
60                                                                            framework::dataset::make("Src0QInfo", { QuantizationInfo(5.f / 32768.f, 10) }),
61                                                                            framework::dataset::make("Src1QInfo", { QuantizationInfo(5.f / 32768.f, 10) })),
62                                                                        framework::dataset::make("OutQInfo", { QuantizationInfo(5.f / 32768.f, 10) }));
63 
64 const auto PixelWiseMultiplicationPolicySTNUDataset = combine(
65                                                           framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
66                                                           framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_NEAREST_UP }));
67 
68 const auto PixelWiseMultiplicationPolicySTZDataset = combine(
69                                                          framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
70                                                          framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_ZERO }));
71 
72 /** Tests for in-place computation
73  * With current interface storing TensorInfo with quantization information
74  * in the kernel, it is difficult to have different tensor metadata
75  * (e.g., quantization information, data type, different shape for broadcasting)
76  * when an input is used as the output of the computation.
77  * So, the following dataset for in-place computation is used only when
78  * the exact same input and output Tensor object makes sense
79  * (i.e., all the tensor metadata is the same) whereas if output is
80  * expected to have either different quantization information, data type
81  * or different shape we are not testing in-place computation.
82  */
83 const auto InPlaceDataSet    = framework::dataset::make("InPlace", { false, true });
84 const auto OutOfPlaceDataSet = framework::dataset::make("InPlace", { false });
85 
86 #define DEFAULT_VALIDATE validate(Accessor(_target), _reference);
87 #define VALIDATE(TYPE, TOLERANCE) validate(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
88 #define WRAP_VALIDATE(TYPE, TOLERANCE) validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
89 
90 // *INDENT-OFF*
91 // clang-format off
92 #define PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, SHAPES, DT1, DT2, DT3, SCALE, RP, INPLACE_DATASET, VALIDATE) \
93     FIXTURE_DATA_TEST_CASE(TEST_NAME, NEPixelWiseMultiplication##FIXTURE, framework::DatasetMode::MODE,                        \
94                            combine(combine(combine(combine(combine(combine(combine(                                            \
95                            datasets::SHAPES,                                                                              \
96                            framework::dataset::make("DataType1", DataType::DT1)),                                         \
97                            framework::dataset::make("DataType2", DataType::DT2)),                                         \
98                            framework::dataset::make("DataType3", DataType::DT3)),                                         \
99                            framework::dataset::make("Scale", std::move(SCALE))),                                          \
100                            datasets::ConvertPolicies()),                                                                  \
101                            framework::dataset::make("RoundingPolicy", RoundingPolicy::RP)),                               \
102                            (INPLACE_DATASET)))                                                                            \
103     {                                                                                                                     \
104         VALIDATE                                                                                                          \
105     }
106 
107 // *INDENT-ON*
108 // clang-format on
109 } // namespace
110 
111 using NEPixelWiseMultiplicationQASYMM8Fixture       = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
112 using NEPixelWiseMultiplicationQASYMM8SignedFixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
113 using NEPixelWiseMultiplicationQSYMM16Fixture       = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t>;
114 using NEPixelWiseMultiplicationQSYMM16ToS32Fixture  = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t, int32_t>;
115 template <typename T>
116 using NEPixelWiseMultiplicationToU8Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, uint8_t>;
117 template <typename T>
118 using NEPixelWiseMultiplicationToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int16_t>;
119 template <typename T>
120 using NEPixelWiseMultiplicationToS32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int32_t>;
121 template <typename T>
122 using NEPixelWiseMultiplicationToF16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, half_float::half>;
123 template <typename T>
124 using NEPixelWiseMultiplicationToF32Fixture     = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
125 using NEPixelWiseMultiplicationU8U8ToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t, int16_t>;
126 template <typename T>
127 using NEPixelWiseMultiplicationBroadcastFixture              = PixelWiseMultiplicationBroadcastValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, T>;
128 using NEPixelWiseMultiplicationBroadcastQASYMM8Fixture       = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
129 using NEPixelWiseMultiplicationBroadcastQASYMM8SignedFixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
130 
131 TEST_SUITE(NEON)
TEST_SUITE(PixelWiseMultiplication)132 TEST_SUITE(PixelWiseMultiplication)
133 
134 // *INDENT-OFF*
135 // clang-format off
136 DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
137                framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),                 //1 Ok
138                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),                 //2 Ok
139                                                         TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),                 //3 Window shrink
140                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),                 //4 Invalid scale
141                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),                 //5 Invalid data type combination
142                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),                //6 Mismatching shapes
143                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),                //7 Mismatching data type
144                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),            //8 Mismatching data type
145                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),     //9 Ok
146                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),     //10 Mismatching data type
147                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),            //11 Mismatching data type
148                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),            //12 Ok
149                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),     //13 Quantized cannot do WRAP
150                                                         TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),                //14 S32 does not support scale255
151                                                       }),
152                framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
153                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
154                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
155                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
156                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
157                                                        TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
158                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
159                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
160                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
161                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
162                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
163                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
164                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
165                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
166                                                      })),
167                framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
168                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
169                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
170                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
171                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
172                                                        TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
173                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
174                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
175                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
176                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
177                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
178                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
179                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
180                                                        TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
181                                                      })),
182                framework::dataset::make("Scale",{  scale_unity,
183                                                    scale_unity,
184                                                    scale_unity,
185                                                    -1.f,
186                                                    scale_unity,
187                                                    scale_unity,
188                                                    scale_unity,
189                                                    scale_unity,
190                                                    scale_unity,
191                                                    scale_unity,
192                                                    scale_unity,
193                                                    scale_unity,
194                                                    scale_unity,
195                                                    scale_255})),
196                framework::dataset::make("OverflowPolicy",{
197                                                    ConvertPolicy::WRAP,
198                                                    ConvertPolicy::WRAP,
199                                                    ConvertPolicy::WRAP,
200                                                    ConvertPolicy::WRAP,
201                                                    ConvertPolicy::WRAP,
202                                                    ConvertPolicy::WRAP,
203                                                    ConvertPolicy::WRAP,
204                                                    ConvertPolicy::WRAP,
205                                                    ConvertPolicy::SATURATE,
206                                                    ConvertPolicy::WRAP,
207                                                    ConvertPolicy::WRAP,
208                                                    ConvertPolicy::SATURATE,
209                                                    ConvertPolicy::WRAP,
210                                                    ConvertPolicy::SATURATE,
211                                         })),
212 
213                framework::dataset::make("Expected", { true, true, true, false, false, false, false, false, true , false, false, true, false, false})),
214                input1_info, input2_info, output_info, scale, policy, expected)
215 {
216     bool has_error = bool(NEPixelWiseMultiplication::validate(&input1_info.clone()->set_is_resizable(false), &input2_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), scale, policy, RoundingPolicy::TO_ZERO));
217     ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
218 }
219 // clang-format on
220 // *INDENT-ON*
221 
222 TEST_SUITE(InPlaceValidate)
TEST_CASE(SingleTensor,framework::DatasetMode::ALL)223 TEST_CASE(SingleTensor, framework::DatasetMode::ALL)
224 {
225     const auto random_shape       = TensorShape{ 9, 9 };
226     const auto single_tensor_info = TensorInfo{ random_shape, 1, DataType::F32 };
227 
228     Status result = NEPixelWiseMultiplication::validate(&single_tensor_info, &single_tensor_info, &single_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
229     ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
230 }
231 
TEST_CASE(ValidBroadCast,framework::DatasetMode::ALL)232 TEST_CASE(ValidBroadCast, framework::DatasetMode::ALL)
233 {
234     const auto larger_shape  = TensorShape{ 27U, 13U, 2U };
235     const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
236 
237     const auto larger_tensor_info  = TensorInfo{ larger_shape, 1, DataType::F32 };
238     const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
239 
240     Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &larger_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
241     ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
242 }
243 
TEST_CASE(InvalidBroadcastOutput,framework::DatasetMode::ALL)244 TEST_CASE(InvalidBroadcastOutput, framework::DatasetMode::ALL)
245 {
246     const auto larger_shape  = TensorShape{ 27U, 13U, 2U };
247     const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
248 
249     const auto larger_tensor_info  = TensorInfo{ larger_shape, 1, DataType::F32 };
250     const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
251 
252     Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &smaller_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
253     ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
254 }
255 
TEST_CASE(InvalidBroadcastBoth,framework::DatasetMode::ALL)256 TEST_CASE(InvalidBroadcastBoth, framework::DatasetMode::ALL)
257 {
258     const auto shape0 = TensorShape{ 9U, 9U };
259     const auto shape1 = TensorShape{ 9U, 1U, 2U };
260 
261     const auto info0 = TensorInfo{ shape0, 1, DataType::F32 };
262     const auto info1 = TensorInfo{ shape1, 1, DataType::F32 };
263 
264     Status result{};
265 
266     result = NEPixelWiseMultiplication::validate(&info0, &info1, &info0, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
267     ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
268 
269     result = NEPixelWiseMultiplication::validate(&info0, &info1, &info1, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
270     ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
271 }
272 TEST_SUITE_END() // InPlaceValidate
273 
TEST_SUITE(Quantized)274 TEST_SUITE(Quantized)
275 TEST_SUITE(QASYMM8_SIGNED)
276 TEST_SUITE(ScaleUnity)
277 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8SignedFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
278                                                                                                                      framework::dataset::make("DataTypeIn1", DataType::QASYMM8_SIGNED)),
279                                                                                                                      framework::dataset::make("DataTypeIn2", DataType::QASYMM8_SIGNED)),
280                                                                                                                      framework::dataset::make("DataTypeOut", DataType::QASYMM8_SIGNED)),
281                                                                                                                      framework::dataset::make("Scale", { scale_unity })),
282                                                                                                                      PixelWiseMultiplicationPolicySTZDataset),
283                                                                                                                      PixelWiseMultiplicationQASYMM8QuantDataset),
284                                                                                                                      OutOfPlaceDataSet))
285 {
286     // Validate output
287     validate(Accessor(_target), _reference, tolerance_qasymm8);
288 }
289 FIXTURE_DATA_TEST_CASE(RunSmallInPlace, NEPixelWiseMultiplicationQASYMM8SignedFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
290                        framework::dataset::make("DataTypeIn1", DataType::QASYMM8_SIGNED)),
291                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8_SIGNED)),
292                        framework::dataset::make("DataTypeOut", DataType::QASYMM8_SIGNED)),
293                        framework::dataset::make("Scale", { scale_unity })),
294                        PixelWiseMultiplicationPolicySTZDataset),
295                        PixelWiseMultiplicationQASYMM8QuantInPlaceDataset),
296                        InPlaceDataSet))
297 {
298     // Validate output
299     validate(Accessor(_target), _reference, tolerance_qasymm8);
300 }
301 TEST_SUITE_END() // ScaleUnity
TEST_SUITE_END()302 TEST_SUITE_END() // QASYMM8_SIGNED
303 
304 TEST_SUITE(QASYMM8)
305 TEST_SUITE(Scale255)
306 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
307                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
308                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
309                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
310                                                                                                                        framework::dataset::make("Scale", { scale_255 })),
311                                                                                                                        PixelWiseMultiplicationPolicySTNUDataset),
312                                                                                                                        PixelWiseMultiplicationQASYMM8QuantDataset),
313                                                                                                                OutOfPlaceDataSet))
314 {
315     // Validate output
316     validate(Accessor(_target), _reference, tolerance_qasymm8);
317 }
318 TEST_SUITE_END() // Scale255
TEST_SUITE(ScaleUnity)319 TEST_SUITE(ScaleUnity)
320 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
321                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
322                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
323                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
324                                                                                                                        framework::dataset::make("Scale", { scale_unity })),
325                                                                                                                        PixelWiseMultiplicationPolicySTZDataset),
326                                                                                                                        PixelWiseMultiplicationQASYMM8QuantDataset),
327                                                                                                                OutOfPlaceDataSet))
328 {
329     // Validate output
330     validate(Accessor(_target), _reference, tolerance_qasymm8);
331 }
332 TEST_SUITE_END() // ScaleUnity
TEST_SUITE(ScaleOther)333 TEST_SUITE(ScaleOther)
334 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
335                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
336                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
337                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
338                                                                                                                        framework::dataset::make("Scale", { scale_other })),
339                                                                                                                        PixelWiseMultiplicationPolicySTZDataset),
340                                                                                                                        PixelWiseMultiplicationQASYMM8QuantDataset),
341                                                                                                                OutOfPlaceDataSet))
342 {
343     // Validate output
344     validate(Accessor(_target), _reference, tolerance_qasymm8);
345 }
346 TEST_SUITE_END() // ScaleOther
TEST_SUITE(Broadcast)347 TEST_SUITE(Broadcast)
348 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationBroadcastQASYMM8Fixture, framework::DatasetMode::ALL,
349                        combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapesBroadcast(),
350                                                                                framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
351                                                                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
352                                                                framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
353                                                        framework::dataset::make("Scale", { scale_other })),
354                                                PixelWiseMultiplicationPolicySTZDataset),
355                                        PixelWiseMultiplicationQASYMM8QuantDataset),
356                                OutOfPlaceDataSet))
357 {
358     // Validate output
359     validate(Accessor(_target), _reference, tolerance_qasymm8);
360 }
361 FIXTURE_DATA_TEST_CASE(RunTinyInPlace, NEPixelWiseMultiplicationBroadcastQASYMM8Fixture, framework::DatasetMode::ALL,
362                        combine(combine(combine(combine(combine(combine(combine(datasets::TinyShapesBroadcastInplace(),
363                                                                                framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
364                                                                        framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
365                                                                framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
366                                                        framework::dataset::make("Scale", { scale_other })),
367                                                PixelWiseMultiplicationPolicySTZDataset),
368                                        PixelWiseMultiplicationQASYMM8QuantInPlaceDataset),
369                                InPlaceDataSet))
370 {
371     // Validate output
372     validate(Accessor(_target), _reference, tolerance_qasymm8);
373 }
374 TEST_SUITE_END() // Broadcast
TEST_SUITE_END()375 TEST_SUITE_END() // QASYMM8
376 TEST_SUITE(QSYMM16)
377 TEST_SUITE(Scale255)
378 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
379                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
380                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
381                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
382                                                                                                                        framework::dataset::make("Scale", { scale_255 })),
383                                                                                                                        PixelWiseMultiplicationPolicySTNUDataset),
384                                                                                                                        PixelWiseMultiplicationQSYMM16QuantDataset),
385                                                                                                                OutOfPlaceDataSet))
386 {
387     // Validate output
388     validate(Accessor(_target), _reference, tolerance_qsymm16);
389 }
390 TEST_SUITE_END() // Scale255
TEST_SUITE(ScaleUnity)391 TEST_SUITE(ScaleUnity)
392 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
393                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
394                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
395                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
396                                                                                                                        framework::dataset::make("Scale", { scale_unity })),
397                                                                                                                        PixelWiseMultiplicationPolicySTZDataset),
398                                                                                                                        PixelWiseMultiplicationQSYMM16QuantDataset),
399                                                                                                                OutOfPlaceDataSet))
400 {
401     // Validate output
402     validate(Accessor(_target), _reference, tolerance_qsymm16);
403 }
404 TEST_SUITE_END() // ScaleUnity
TEST_SUITE(ScaleOther)405 TEST_SUITE(ScaleOther)
406 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
407                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
408                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
409                                                                                                                        framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
410                                                                                                                        framework::dataset::make("Scale", { scale_other })),
411                                                                                                                        PixelWiseMultiplicationPolicySTZDataset),
412                                                                                                                        PixelWiseMultiplicationQSYMM16QuantDataset),
413                                                                                                                OutOfPlaceDataSet))
414 {
415     // Validate output
416     validate(Accessor(_target), _reference, tolerance_qsymm16);
417 }
418 TEST_SUITE_END() // ScaleOther
TEST_SUITE_END()419 TEST_SUITE_END() // QSYMM16
420 TEST_SUITE(QSYMM16toS32)
421 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16ToS32Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
422                                                                                                                     framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
423                                                                                                                     framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
424                                                                                                                     framework::dataset::make("DataTypeOut", DataType::S32)),
425                                                                                                                     framework::dataset::make("Scale", { scale_unity })),
426                                                                                                                     PixelWiseMultiplicationPolicySTZDataset),
427                                                                                                                     PixelWiseMultiplicationQSYMM16QuantDataset),
428                                                                                                                     OutOfPlaceDataSet))
429 {
430     // Validate output
431     validate(Accessor(_target), _reference);
432 }
433 TEST_SUITE_END() // QSYMM16toS32
TEST_SUITE_END()434 TEST_SUITE_END() // Quantized
435 
436 TEST_SUITE(U8U8toS16)
437 
438 FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
439                                                                                                                        framework::dataset::make("DataTypeIn1", DataType::U8)),
440                                                                                                                        framework::dataset::make("DataTypeIn2", DataType::U8)),
441                                                                                                                        framework::dataset::make("DataTypeOut", DataType::S16)),
442                                                                                                                        framework::dataset::make("Scale", { scale_255 })),
443                                                                                                                        datasets::ConvertPolicies()),
444                                                                                                                        framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_NEAREST_UP)),
445                                                                                                                        OutOfPlaceDataSet))
446 {
447     // Validate output
448     validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<int16_t>(1), 0.f);
449 }
450 
451 FIXTURE_DATA_TEST_CASE(RunSmall1, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
452                                                                                                                         framework::dataset::make("DataTypeIn1", DataType::U8)),
453                                                                                                                         framework::dataset::make("DataTypeIn2", DataType::U8)),
454                                                                                                                         framework::dataset::make("DataTypeOut", DataType::S16)),
455                                                                                                                         framework::dataset::make("Scale", { scale_other })),
456                                                                                                                         datasets::ConvertPolicies()),
457                                                                                                                         framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_ZERO)),
458                                                                                                                         framework::dataset::make("InPlace", { false })))
459 {
460     // Validate output
461     validate(Accessor(_target), _reference);
462 }
463 
464 TEST_SUITE_END() // U8U8toS16
465 
466 TEST_SUITE(U8toU8)
467 
468 TEST_SUITE(Scale255)
469 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, U8, scale_255, TO_NEAREST_UP, InPlaceDataSet, WRAP_VALIDATE(uint8_t, 1))
470 TEST_SUITE_END() // Scale255
471 
472 TEST_SUITE(ScaleUnity)
473 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, U8, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
474 TEST_SUITE_END() // ScaleUnity
475 
476 TEST_SUITE(ScaleOther)
477 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, U8, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
478 TEST_SUITE_END() // ScaleOther
479 
480 TEST_SUITE_END() // U8toU8
481 
482 TEST_SUITE(U8toS16)
483 
484 TEST_SUITE(Scale255)
485 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_255, TO_NEAREST_UP, OutOfPlaceDataSet,
486                                                  WRAP_VALIDATE(int16_t, 2))
487 TEST_SUITE_END() // Scale255
488 
489 TEST_SUITE(ScaleUnity)
490 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_unity, TO_ZERO, OutOfPlaceDataSet,
491                                                  DEFAULT_VALIDATE)
492 TEST_SUITE_END() // ScaleUnity
493 
494 TEST_SUITE(ScaleOther)
495 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_other, TO_ZERO, OutOfPlaceDataSet,
496                                                  DEFAULT_VALIDATE)
497 TEST_SUITE_END() // ScaleOther
498 
499 TEST_SUITE_END() // U8toS16
500 
501 TEST_SUITE(S16toS16)
502 
503 TEST_SUITE(Scale255)
504 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, S16, scale_255, TO_NEAREST_UP, InPlaceDataSet, WRAP_VALIDATE(int16_t, 2))
505 TEST_SUITE_END() // Scale255
506 
507 TEST_SUITE(ScaleUnity)
508 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, S16, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
509 TEST_SUITE_END() // ScaleUnity
510 
511 TEST_SUITE(ScaleOther)
512 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, S16, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
513 TEST_SUITE_END() // ScaleOther
514 
515 TEST_SUITE_END() // S16toS16
516 
517 TEST_SUITE(S32toS32)
518 
519 TEST_SUITE(ScaleUnity)
520 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS32Fixture<int32_t>, ALL, SmallShapes(), S32, S32, S32, scale_unity, TO_ZERO, InPlaceDataSet, WRAP_VALIDATE(int32_t, 1))
521 TEST_SUITE_END() // ScaleUnity
522 
523 TEST_SUITE(ScaleOther)
524 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS32Fixture<int32_t>, ALL, SmallShapes(), S32, S32, S32, scale_other, TO_ZERO, InPlaceDataSet, WRAP_VALIDATE(int32_t, 1))
525 TEST_SUITE_END() // ScaleOther
526 
527 TEST_SUITE(Broadcast)
528 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<int32_t>, ALL, SmallShapesBroadcast(), S32, S32, S32, scale_unity, TO_ZERO, framework::dataset::make("InPlace", { false }),
529                                                  WRAP_VALIDATE(int32_t, 1))
530 TEST_SUITE_END() // Broadcast
531 
532 TEST_SUITE_END() // S32toS32
533 
534 #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
535 TEST_SUITE(F16toF16)
536 
537 TEST_SUITE(Scale255)
538 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF16Fixture<half_float::half>, ALL, SmallShapes(), F16, F16, F16, scale_255, TO_NEAREST_UP, InPlaceDataSet, VALIDATE(float, 1.f))
539 TEST_SUITE_END() // Scale255
540 
541 TEST_SUITE_END() // F16toF16
542 #endif           /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
543 
544 TEST_SUITE(F32toF32)
545 
546 TEST_SUITE(Scale255)
547 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_255, TO_NEAREST_UP, InPlaceDataSet, VALIDATE(float, 1.f))
548 TEST_SUITE_END() // Scale255
549 
550 TEST_SUITE(ScaleUnity)
551 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
552 TEST_SUITE_END() // ScaleUnity
553 
554 TEST_SUITE(ScaleOther)
555 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
556 TEST_SUITE_END() // ScaleOther
557 
558 TEST_SUITE_END() // F32toF32
559 
560 TEST_SUITE(Broadcast)
561 PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<float>, ALL, SmallShapesBroadcast(), F32, F32, F32, scale_255, TO_NEAREST_UP, framework::dataset::make("InPlace", { false }),
562                                                  VALIDATE(float, 1.f))
563 TEST_SUITE_END() // Broadcast
564 
565 TEST_SUITE_END()
566 TEST_SUITE_END()
567 } // namespace validation
568 } // namespace test
569 } // namespace arm_compute
570