blob: 964d1c5deb4ef3770eddc3d67a8dc9fd0cbce069 [file] [log] [blame]
John Richardsondd715f22017-09-18 16:10:48 +01001/*
Sheri Zhanga387e272021-06-29 17:34:06 +01002 * Copyright (c) 2017-2021 Arm Limited.
John Richardsondd715f22017-09-18 16:10:48 +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,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
Manuel Bottini7bb56c62019-06-26 15:17:09 +010024#include "arm_compute/core/Rounding.h"
John Richardsondd715f22017-09-18 16:10:48 +010025#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
34namespace arm_compute
35{
36namespace test
37{
38namespace validation
39{
40namespace
41{
42const float scale_unity = 1.f;
43const float scale_255 = 1.f / 255.f;
44const float scale_other = 1.f / 32768.f;
45
Manuel Bottini7bb56c62019-06-26 15:17:09 +010046constexpr AbsoluteTolerance<float> tolerance_qasymm8(1); /**< Tolerance value for comparing reference's output against implementation's output for 8-bit quantized asymmetric data types */
47constexpr AbsoluteTolerance<float> tolerance_qsymm16(1); /**< Tolerance value for comparing reference's output against implementation's output for 16-bit quantized symmetric data types */
48
49const 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
54const 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
Sheri Zhanga387e272021-06-29 17:34:06 +010059const 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
Manuel Bottini7bb56c62019-06-26 15:17:09 +010064const auto PixelWiseMultiplicationPolicySTNUDataset = combine(
65 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
66 framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_NEAREST_UP }));
67
68const auto PixelWiseMultiplicationPolicySTZDataset = combine(
69 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
70 framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_ZERO }));
71
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010072/** 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 */
Sheri Zhanga387e272021-06-29 17:34:06 +010083const auto InPlaceDataSet = framework::dataset::make("InPlace", { false, true });
84const auto OutOfPlaceDataSet = framework::dataset::make("InPlace", { false });
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010085
John Richardsondd715f22017-09-18 16:10:48 +010086#define DEFAULT_VALIDATE validate(Accessor(_target), _reference);
John Richardson9c450cc2017-11-22 12:00:41 +000087#define VALIDATE(TYPE, TOLERANCE) validate(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
John Richardsondd715f22017-09-18 16:10:48 +010088#define WRAP_VALIDATE(TYPE, TOLERANCE) validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
89
90// *INDENT-OFF*
91// clang-format off
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +010092#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( \
John Richardsondd715f22017-09-18 16:10:48 +010095 datasets::SHAPES, \
96 framework::dataset::make("DataType1", DataType::DT1)), \
97 framework::dataset::make("DataType2", DataType::DT2)), \
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +010098 framework::dataset::make("DataType3", DataType::DT3)), \
John Richardsondd715f22017-09-18 16:10:48 +010099 framework::dataset::make("Scale", std::move(SCALE))), \
100 datasets::ConvertPolicies()), \
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100101 framework::dataset::make("RoundingPolicy", RoundingPolicy::RP)), \
102 (INPLACE_DATASET))) \
John Richardsondd715f22017-09-18 16:10:48 +0100103 { \
104 VALIDATE \
105 }
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000106
John Richardsondd715f22017-09-18 16:10:48 +0100107// *INDENT-ON*
108// clang-format on
John Richardsondd715f22017-09-18 16:10:48 +0100109} // namespace
110
Pablo Tello52ea9c22019-12-10 11:28:53 +0000111using NEPixelWiseMultiplicationQASYMM8Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
112using NEPixelWiseMultiplicationQASYMM8SignedFixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
113using NEPixelWiseMultiplicationQSYMM16Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t>;
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100114using NEPixelWiseMultiplicationQSYMM16ToS32Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t, int32_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100115template <typename T>
116using NEPixelWiseMultiplicationToU8Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, uint8_t>;
117template <typename T>
118using NEPixelWiseMultiplicationToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int16_t>;
119template <typename T>
SiCong Libb88f892020-08-28 11:18:47 +0100120using NEPixelWiseMultiplicationToS32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int32_t>;
121template <typename T>
John Richardsondd715f22017-09-18 16:10:48 +0100122using NEPixelWiseMultiplicationToF16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, half_float::half>;
123template <typename T>
Sheri Zhanga449a362020-07-16 15:52:25 +0100124using NEPixelWiseMultiplicationToF32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100125using NEPixelWiseMultiplicationU8U8ToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t, int16_t>;
Sheri Zhanga449a362020-07-16 15:52:25 +0100126template <typename T>
SiCong Lid6d1b362020-09-24 17:34:23 +0100127using NEPixelWiseMultiplicationBroadcastFixture = PixelWiseMultiplicationBroadcastValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, T>;
Sheri Zhanga449a362020-07-16 15:52:25 +0100128using NEPixelWiseMultiplicationBroadcastQASYMM8Fixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
129using NEPixelWiseMultiplicationBroadcastQASYMM8SignedFixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100130
131TEST_SUITE(NEON)
132TEST_SUITE(PixelWiseMultiplication)
133
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000134// *INDENT-OFF*
135// clang-format off
Pablo Tello52ea9c22019-12-10 11:28:53 +0000136DATA_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
SiCong Libb88f892020-08-28 11:18:47 +0100150 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32), //14 S32 does not support scale255
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000151 }),
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),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100158 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000159 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000160 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),
SiCong Libb88f892020-08-28 11:18:47 +0100165 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000166 })),
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),
SiCong Libb88f892020-08-28 11:18:47 +0100173 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000174 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000175 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),
SiCong Libb88f892020-08-28 11:18:47 +0100180 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000181 })),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000182 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,
SiCong Libb88f892020-08-28 11:18:47 +0100194 scale_unity,
195 scale_255})),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000196 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,
SiCong Libb88f892020-08-28 11:18:47 +0100210 ConvertPolicy::SATURATE,
Pablo Tello52ea9c22019-12-10 11:28:53 +0000211 })),
212
SiCong Libb88f892020-08-28 11:18:47 +0100213 framework::dataset::make("Expected", { true, true, true, false, false, false, false, false, true , false, false, true, false, false})),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000214 input1_info, input2_info, output_info, scale, policy, expected)
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000215{
Pablo Tello52ea9c22019-12-10 11:28:53 +0000216 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));
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000217 ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
218}
219// clang-format on
220// *INDENT-ON*
221
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100222TEST_SUITE(InPlaceValidate)
223TEST_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
232TEST_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
244TEST_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
256TEST_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}
272TEST_SUITE_END() // InPlaceValidate
273
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100274TEST_SUITE(Quantized)
Pablo Tello52ea9c22019-12-10 11:28:53 +0000275TEST_SUITE(QASYMM8_SIGNED)
SiCong Libb88f892020-08-28 11:18:47 +0100276TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100277FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100284 OutOfPlaceDataSet))
285{
286 // Validate output
287 validate(Accessor(_target), _reference, tolerance_qasymm8);
288}
289FIXTURE_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))
Pablo Tello52ea9c22019-12-10 11:28:53 +0000297{
298 // Validate output
299 validate(Accessor(_target), _reference, tolerance_qasymm8);
300}
SiCong Libb88f892020-08-28 11:18:47 +0100301TEST_SUITE_END() // ScaleUnity
302TEST_SUITE_END() // QASYMM8_SIGNED
Pablo Tello52ea9c22019-12-10 11:28:53 +0000303
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100304TEST_SUITE(QASYMM8)
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000305TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100306FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100313 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100314{
315 // Validate output
316 validate(Accessor(_target), _reference, tolerance_qasymm8);
317}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000318TEST_SUITE_END() // Scale255
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000319TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100320FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100327 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100328{
329 // Validate output
330 validate(Accessor(_target), _reference, tolerance_qasymm8);
331}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000332TEST_SUITE_END() // ScaleUnity
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000333TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100334FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100341 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100342{
343 // Validate output
344 validate(Accessor(_target), _reference, tolerance_qasymm8);
345}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000346TEST_SUITE_END() // ScaleOther
Sheri Zhanga449a362020-07-16 15:52:25 +0100347TEST_SUITE(Broadcast)
348FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100356 OutOfPlaceDataSet))
357{
358 // Validate output
359 validate(Accessor(_target), _reference, tolerance_qasymm8);
360}
361FIXTURE_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))
Sheri Zhanga449a362020-07-16 15:52:25 +0100370{
371 // Validate output
372 validate(Accessor(_target), _reference, tolerance_qasymm8);
373}
374TEST_SUITE_END() // Broadcast
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100375TEST_SUITE_END() // QASYMM8
376TEST_SUITE(QSYMM16)
377TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100378FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100385 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100386{
387 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100388 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100389}
390TEST_SUITE_END() // Scale255
391TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100392FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100399 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100400{
401 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100402 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100403}
404TEST_SUITE_END() // ScaleUnity
405TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100406FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100413 OutOfPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100414{
415 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100416 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100417}
418TEST_SUITE_END() // ScaleOther
419TEST_SUITE_END() // QSYMM16
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100420TEST_SUITE(QSYMM16toS32)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100421FIXTURE_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),
Sheri Zhanga387e272021-06-29 17:34:06 +0100428 OutOfPlaceDataSet))
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100429{
430 // Validate output
431 validate(Accessor(_target), _reference);
432}
433TEST_SUITE_END() // QSYMM16toS32
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100434TEST_SUITE_END() // Quantized
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000435
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100436TEST_SUITE(U8U8toS16)
437
438FIXTURE_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)),
Sheri Zhanga387e272021-06-29 17:34:06 +0100445 OutOfPlaceDataSet))
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100446{
447 // Validate output
448 validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<int16_t>(1), 0.f);
449}
450
451FIXTURE_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
464TEST_SUITE_END() // U8U8toS16
465
John Richardsondd715f22017-09-18 16:10:48 +0100466TEST_SUITE(U8toU8)
467
468TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100469PIXEL_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))
John Richardsondd715f22017-09-18 16:10:48 +0100470TEST_SUITE_END() // Scale255
471
472TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100473PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, U8, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100474TEST_SUITE_END() // ScaleUnity
475
476TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100477PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, U8, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100478TEST_SUITE_END() // ScaleOther
479
480TEST_SUITE_END() // U8toU8
481
482TEST_SUITE(U8toS16)
483
484TEST_SUITE(Scale255)
Sheri Zhanga387e272021-06-29 17:34:06 +0100485PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_255, TO_NEAREST_UP, OutOfPlaceDataSet,
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100486 WRAP_VALIDATE(int16_t, 2))
John Richardsondd715f22017-09-18 16:10:48 +0100487TEST_SUITE_END() // Scale255
488
489TEST_SUITE(ScaleUnity)
Sheri Zhanga387e272021-06-29 17:34:06 +0100490PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_unity, TO_ZERO, OutOfPlaceDataSet,
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100491 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100492TEST_SUITE_END() // ScaleUnity
493
494TEST_SUITE(ScaleOther)
Sheri Zhanga387e272021-06-29 17:34:06 +0100495PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_other, TO_ZERO, OutOfPlaceDataSet,
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100496 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100497TEST_SUITE_END() // ScaleOther
498
499TEST_SUITE_END() // U8toS16
500
501TEST_SUITE(S16toS16)
502
503TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100504PIXEL_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))
John Richardsondd715f22017-09-18 16:10:48 +0100505TEST_SUITE_END() // Scale255
506
507TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100508PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, S16, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100509TEST_SUITE_END() // ScaleUnity
510
511TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100512PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, S16, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100513TEST_SUITE_END() // ScaleOther
514
515TEST_SUITE_END() // S16toS16
516
SiCong Libb88f892020-08-28 11:18:47 +0100517TEST_SUITE(S32toS32)
518
519TEST_SUITE(ScaleUnity)
520PIXEL_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))
521TEST_SUITE_END() // ScaleUnity
522
523TEST_SUITE(ScaleOther)
524PIXEL_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))
525TEST_SUITE_END() // ScaleOther
526
SiCong Lid6d1b362020-09-24 17:34:23 +0100527TEST_SUITE(Broadcast)
528PIXEL_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))
530TEST_SUITE_END() // Broadcast
531
SiCong Libb88f892020-08-28 11:18:47 +0100532TEST_SUITE_END() // S32toS32
533
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000534#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Richardsondd715f22017-09-18 16:10:48 +0100535TEST_SUITE(F16toF16)
536
537TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100538PIXEL_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))
John Richardsondd715f22017-09-18 16:10:48 +0100539TEST_SUITE_END() // Scale255
540
541TEST_SUITE_END() // F16toF16
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000542#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
John Richardsondd715f22017-09-18 16:10:48 +0100543
544TEST_SUITE(F32toF32)
545
546TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100547PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_255, TO_NEAREST_UP, InPlaceDataSet, VALIDATE(float, 1.f))
John Richardsondd715f22017-09-18 16:10:48 +0100548TEST_SUITE_END() // Scale255
549
550TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100551PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100552TEST_SUITE_END() // ScaleUnity
553
554TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100555PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, F32, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100556TEST_SUITE_END() // ScaleOther
557
558TEST_SUITE_END() // F32toF32
559
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000560TEST_SUITE(Broadcast)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100561PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<float>, ALL, SmallShapesBroadcast(), F32, F32, F32, scale_255, TO_NEAREST_UP, framework::dataset::make("InPlace", { false }),
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100562 VALIDATE(float, 1.f))
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000563TEST_SUITE_END() // Broadcast
564
John Richardsondd715f22017-09-18 16:10:48 +0100565TEST_SUITE_END()
566TEST_SUITE_END()
567} // namespace validation
568} // namespace test
569} // namespace arm_compute