blob: 1bb0588919aa336509d8a8a548abe420003cd6b9 [file] [log] [blame]
John Richardsondd715f22017-09-18 16:10:48 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2017-2020 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
59const auto PixelWiseMultiplicationPolicySTNUDataset = combine(
60 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
61 framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_NEAREST_UP }));
62
63const auto PixelWiseMultiplicationPolicySTZDataset = combine(
64 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE }),
65 framework::dataset::make("RoundingPolicy", { RoundingPolicy::TO_ZERO }));
66
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010067/** Tests for in-place computation
68 * With current interface storing TensorInfo with quantization information
69 * in the kernel, it is difficult to have different tensor metadata
70 * (e.g., quantization information, data type, different shape for broadcasting)
71 * when an input is used as the output of the computation.
72 * So, the following dataset for in-place computation is used only when
73 * the exact same input and output Tensor object makes sense
74 * (i.e., all the tensor metadata is the same) whereas if output is
75 * expected to have either different quantization information, data type
76 * or different shape we are not testing in-place computation.
77 */
78const auto InPlaceDataSet = framework::dataset::make("InPlace", { false, true });
79
John Richardsondd715f22017-09-18 16:10:48 +010080#define DEFAULT_VALIDATE validate(Accessor(_target), _reference);
John Richardson9c450cc2017-11-22 12:00:41 +000081#define VALIDATE(TYPE, TOLERANCE) validate(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
John Richardsondd715f22017-09-18 16:10:48 +010082#define WRAP_VALIDATE(TYPE, TOLERANCE) validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
83
84// *INDENT-OFF*
85// clang-format off
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +010086#define PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, SHAPES, DT1, DT2, DT3, SCALE, RP, INPLACE_DATASET, VALIDATE) \
87 FIXTURE_DATA_TEST_CASE(TEST_NAME, NEPixelWiseMultiplication##FIXTURE, framework::DatasetMode::MODE, \
88 combine(combine(combine(combine(combine(combine(combine( \
John Richardsondd715f22017-09-18 16:10:48 +010089 datasets::SHAPES, \
90 framework::dataset::make("DataType1", DataType::DT1)), \
91 framework::dataset::make("DataType2", DataType::DT2)), \
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +010092 framework::dataset::make("DataType3", DataType::DT3)), \
John Richardsondd715f22017-09-18 16:10:48 +010093 framework::dataset::make("Scale", std::move(SCALE))), \
94 datasets::ConvertPolicies()), \
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +010095 framework::dataset::make("RoundingPolicy", RoundingPolicy::RP)), \
96 (INPLACE_DATASET))) \
John Richardsondd715f22017-09-18 16:10:48 +010097 { \
98 VALIDATE \
99 }
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000100
John Richardsondd715f22017-09-18 16:10:48 +0100101// *INDENT-ON*
102// clang-format on
John Richardsondd715f22017-09-18 16:10:48 +0100103} // namespace
104
Pablo Tello52ea9c22019-12-10 11:28:53 +0000105using NEPixelWiseMultiplicationQASYMM8Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
106using NEPixelWiseMultiplicationQASYMM8SignedFixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
107using NEPixelWiseMultiplicationQSYMM16Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t>;
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100108using NEPixelWiseMultiplicationQSYMM16ToS32Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t, int32_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100109template <typename T>
110using NEPixelWiseMultiplicationToU8Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, uint8_t>;
111template <typename T>
112using NEPixelWiseMultiplicationToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int16_t>;
113template <typename T>
SiCong Libb88f892020-08-28 11:18:47 +0100114using NEPixelWiseMultiplicationToS32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int32_t>;
115template <typename T>
John Richardsondd715f22017-09-18 16:10:48 +0100116using NEPixelWiseMultiplicationToF16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, half_float::half>;
117template <typename T>
Sheri Zhanga449a362020-07-16 15:52:25 +0100118using NEPixelWiseMultiplicationToF32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100119using NEPixelWiseMultiplicationU8U8ToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t, int16_t>;
Sheri Zhanga449a362020-07-16 15:52:25 +0100120template <typename T>
SiCong Lid6d1b362020-09-24 17:34:23 +0100121using NEPixelWiseMultiplicationBroadcastFixture = PixelWiseMultiplicationBroadcastValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, T>;
Sheri Zhanga449a362020-07-16 15:52:25 +0100122using NEPixelWiseMultiplicationBroadcastQASYMM8Fixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
123using NEPixelWiseMultiplicationBroadcastQASYMM8SignedFixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100124
125TEST_SUITE(NEON)
126TEST_SUITE(PixelWiseMultiplication)
127
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000128// *INDENT-OFF*
129// clang-format off
Pablo Tello52ea9c22019-12-10 11:28:53 +0000130DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
131 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //1 Ok
132 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //2 Ok
133 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), //3 Window shrink
134 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //4 Invalid scale
135 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //5 Invalid data type combination
136 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //6 Mismatching shapes
137 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //7 Mismatching data type
138 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //8 Mismatching data type
139 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //9 Ok
140 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //10 Mismatching data type
141 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //11 Mismatching data type
142 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //12 Ok
143 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //13 Quantized cannot do WRAP
SiCong Libb88f892020-08-28 11:18:47 +0100144 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32), //14 S32 does not support scale255
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000145 }),
146 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
147 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
148 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
149 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
150 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
151 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100152 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000153 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000154 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
155 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
156 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
157 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
158 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
SiCong Libb88f892020-08-28 11:18:47 +0100159 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000160 })),
161 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
162 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
163 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
164 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
165 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
166 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
SiCong Libb88f892020-08-28 11:18:47 +0100167 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000168 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000169 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
170 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
171 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
172 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
173 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
SiCong Libb88f892020-08-28 11:18:47 +0100174 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000175 })),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000176 framework::dataset::make("Scale",{ scale_unity,
177 scale_unity,
178 scale_unity,
179 -1.f,
180 scale_unity,
181 scale_unity,
182 scale_unity,
183 scale_unity,
184 scale_unity,
185 scale_unity,
186 scale_unity,
187 scale_unity,
SiCong Libb88f892020-08-28 11:18:47 +0100188 scale_unity,
189 scale_255})),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000190 framework::dataset::make("OverflowPolicy",{
191 ConvertPolicy::WRAP,
192 ConvertPolicy::WRAP,
193 ConvertPolicy::WRAP,
194 ConvertPolicy::WRAP,
195 ConvertPolicy::WRAP,
196 ConvertPolicy::WRAP,
197 ConvertPolicy::WRAP,
198 ConvertPolicy::WRAP,
199 ConvertPolicy::SATURATE,
200 ConvertPolicy::WRAP,
201 ConvertPolicy::WRAP,
202 ConvertPolicy::SATURATE,
203 ConvertPolicy::WRAP,
SiCong Libb88f892020-08-28 11:18:47 +0100204 ConvertPolicy::SATURATE,
Pablo Tello52ea9c22019-12-10 11:28:53 +0000205 })),
206
SiCong Libb88f892020-08-28 11:18:47 +0100207 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 +0000208 input1_info, input2_info, output_info, scale, policy, expected)
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000209{
Pablo Tello52ea9c22019-12-10 11:28:53 +0000210 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 +0000211 ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
212}
213// clang-format on
214// *INDENT-ON*
215
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100216TEST_SUITE(InPlaceValidate)
217TEST_CASE(SingleTensor, framework::DatasetMode::ALL)
218{
219 const auto random_shape = TensorShape{ 9, 9 };
220 const auto single_tensor_info = TensorInfo{ random_shape, 1, DataType::F32 };
221
222 Status result = NEPixelWiseMultiplication::validate(&single_tensor_info, &single_tensor_info, &single_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
223 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
224}
225
226TEST_CASE(ValidBroadCast, framework::DatasetMode::ALL)
227{
228 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
229 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
230
231 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
232 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
233
234 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &larger_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
235 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
236}
237
238TEST_CASE(InvalidBroadcastOutput, framework::DatasetMode::ALL)
239{
240 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
241 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
242
243 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
244 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
245
246 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &smaller_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
247 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
248}
249
250TEST_CASE(InvalidBroadcastBoth, framework::DatasetMode::ALL)
251{
252 const auto shape0 = TensorShape{ 9U, 9U };
253 const auto shape1 = TensorShape{ 9U, 1U, 2U };
254
255 const auto info0 = TensorInfo{ shape0, 1, DataType::F32 };
256 const auto info1 = TensorInfo{ shape1, 1, DataType::F32 };
257
258 Status result{};
259
260 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info0, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
261 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
262
263 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info1, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
264 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
265}
266TEST_SUITE_END() // InPlaceValidate
267
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100268TEST_SUITE(Quantized)
Pablo Tello52ea9c22019-12-10 11:28:53 +0000269TEST_SUITE(QASYMM8_SIGNED)
SiCong Libb88f892020-08-28 11:18:47 +0100270TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100271FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8SignedFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
272 framework::dataset::make("DataTypeIn1", DataType::QASYMM8_SIGNED)),
273 framework::dataset::make("DataTypeIn2", DataType::QASYMM8_SIGNED)),
274 framework::dataset::make("DataTypeOut", DataType::QASYMM8_SIGNED)),
275 framework::dataset::make("Scale", { scale_unity })),
276 PixelWiseMultiplicationPolicySTZDataset),
277 PixelWiseMultiplicationQASYMM8QuantDataset),
278 InPlaceDataSet))
Pablo Tello52ea9c22019-12-10 11:28:53 +0000279{
280 // Validate output
281 validate(Accessor(_target), _reference, tolerance_qasymm8);
282}
SiCong Libb88f892020-08-28 11:18:47 +0100283TEST_SUITE_END() // ScaleUnity
284TEST_SUITE_END() // QASYMM8_SIGNED
Pablo Tello52ea9c22019-12-10 11:28:53 +0000285
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100286TEST_SUITE(QASYMM8)
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000287TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100288FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
289 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
290 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
291 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
292 framework::dataset::make("Scale", { scale_255 })),
293 PixelWiseMultiplicationPolicySTNUDataset),
294 PixelWiseMultiplicationQASYMM8QuantDataset),
295 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100296{
297 // Validate output
298 validate(Accessor(_target), _reference, tolerance_qasymm8);
299}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000300TEST_SUITE_END() // Scale255
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000301TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100302FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
303 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
304 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
305 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
306 framework::dataset::make("Scale", { scale_unity })),
307 PixelWiseMultiplicationPolicySTZDataset),
308 PixelWiseMultiplicationQASYMM8QuantDataset),
309 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100310{
311 // Validate output
312 validate(Accessor(_target), _reference, tolerance_qasymm8);
313}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000314TEST_SUITE_END() // ScaleUnity
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000315TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100316FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
317 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
318 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
319 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
320 framework::dataset::make("Scale", { scale_other })),
321 PixelWiseMultiplicationPolicySTZDataset),
322 PixelWiseMultiplicationQASYMM8QuantDataset),
323 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100324{
325 // Validate output
326 validate(Accessor(_target), _reference, tolerance_qasymm8);
327}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000328TEST_SUITE_END() // ScaleOther
Sheri Zhanga449a362020-07-16 15:52:25 +0100329TEST_SUITE(Broadcast)
330FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationBroadcastQASYMM8Fixture, framework::DatasetMode::ALL,
331 combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapesBroadcast(),
332 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
333 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
334 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
335 framework::dataset::make("Scale", { scale_other })),
336 PixelWiseMultiplicationPolicySTZDataset),
337 PixelWiseMultiplicationQASYMM8QuantDataset),
338 framework::dataset::make("InPlace", { false })))
339{
340 // Validate output
341 validate(Accessor(_target), _reference, tolerance_qasymm8);
342}
343TEST_SUITE_END() // Broadcast
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100344TEST_SUITE_END() // QASYMM8
345TEST_SUITE(QSYMM16)
346TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100347FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
348 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
349 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
350 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
351 framework::dataset::make("Scale", { scale_255 })),
352 PixelWiseMultiplicationPolicySTNUDataset),
353 PixelWiseMultiplicationQSYMM16QuantDataset),
354 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100355{
356 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100357 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100358}
359TEST_SUITE_END() // Scale255
360TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100361FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
362 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
363 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
364 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
365 framework::dataset::make("Scale", { scale_unity })),
366 PixelWiseMultiplicationPolicySTZDataset),
367 PixelWiseMultiplicationQSYMM16QuantDataset),
368 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100369{
370 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100371 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100372}
373TEST_SUITE_END() // ScaleUnity
374TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100375FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
376 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
377 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
378 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
379 framework::dataset::make("Scale", { scale_other })),
380 PixelWiseMultiplicationPolicySTZDataset),
381 PixelWiseMultiplicationQSYMM16QuantDataset),
382 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100383{
384 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100385 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100386}
387TEST_SUITE_END() // ScaleOther
388TEST_SUITE_END() // QSYMM16
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100389TEST_SUITE(QSYMM16toS32)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100390FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16ToS32Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
391 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
392 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
393 framework::dataset::make("DataTypeOut", DataType::S32)),
394 framework::dataset::make("Scale", { scale_unity })),
395 PixelWiseMultiplicationPolicySTZDataset),
396 PixelWiseMultiplicationQSYMM16QuantDataset),
397 framework::dataset::make("InPlace", { false })))
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100398{
399 // Validate output
400 validate(Accessor(_target), _reference);
401}
402TEST_SUITE_END() // QSYMM16toS32
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100403TEST_SUITE_END() // Quantized
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000404
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100405TEST_SUITE(U8U8toS16)
406
407FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
408 framework::dataset::make("DataTypeIn1", DataType::U8)),
409 framework::dataset::make("DataTypeIn2", DataType::U8)),
410 framework::dataset::make("DataTypeOut", DataType::S16)),
411 framework::dataset::make("Scale", { scale_255 })),
412 datasets::ConvertPolicies()),
413 framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_NEAREST_UP)),
414 framework::dataset::make("InPlace", { false })))
415{
416 // Validate output
417 validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<int16_t>(1), 0.f);
418}
419
420FIXTURE_DATA_TEST_CASE(RunSmall1, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
421 framework::dataset::make("DataTypeIn1", DataType::U8)),
422 framework::dataset::make("DataTypeIn2", DataType::U8)),
423 framework::dataset::make("DataTypeOut", DataType::S16)),
424 framework::dataset::make("Scale", { scale_other })),
425 datasets::ConvertPolicies()),
426 framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_ZERO)),
427 framework::dataset::make("InPlace", { false })))
428{
429 // Validate output
430 validate(Accessor(_target), _reference);
431}
432
433TEST_SUITE_END() // U8U8toS16
434
John Richardsondd715f22017-09-18 16:10:48 +0100435TEST_SUITE(U8toU8)
436
437TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100438PIXEL_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 +0100439TEST_SUITE_END() // Scale255
440
441TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100442PIXEL_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 +0100443TEST_SUITE_END() // ScaleUnity
444
445TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100446PIXEL_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 +0100447TEST_SUITE_END() // ScaleOther
448
449TEST_SUITE_END() // U8toU8
450
451TEST_SUITE(U8toS16)
452
453TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100454PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_255, TO_NEAREST_UP, framework::dataset::make("InPlace", { false }),
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100455 WRAP_VALIDATE(int16_t, 2))
John Richardsondd715f22017-09-18 16:10:48 +0100456TEST_SUITE_END() // Scale255
457
458TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100459PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_unity, TO_ZERO, framework::dataset::make("InPlace", { false }),
460 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100461TEST_SUITE_END() // ScaleUnity
462
463TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100464PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_other, TO_ZERO, framework::dataset::make("InPlace", { false }),
465 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100466TEST_SUITE_END() // ScaleOther
467
468TEST_SUITE_END() // U8toS16
469
470TEST_SUITE(S16toS16)
471
472TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100473PIXEL_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 +0100474TEST_SUITE_END() // Scale255
475
476TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100477PIXEL_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 +0100478TEST_SUITE_END() // ScaleUnity
479
480TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100481PIXEL_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 +0100482TEST_SUITE_END() // ScaleOther
483
484TEST_SUITE_END() // S16toS16
485
SiCong Libb88f892020-08-28 11:18:47 +0100486TEST_SUITE(S32toS32)
487
488TEST_SUITE(ScaleUnity)
489PIXEL_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))
490TEST_SUITE_END() // ScaleUnity
491
492TEST_SUITE(ScaleOther)
493PIXEL_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))
494TEST_SUITE_END() // ScaleOther
495
SiCong Lid6d1b362020-09-24 17:34:23 +0100496TEST_SUITE(Broadcast)
497PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<int32_t>, ALL, SmallShapesBroadcast(), S32, S32, S32, scale_unity, TO_ZERO, framework::dataset::make("InPlace", { false }),
498 WRAP_VALIDATE(int32_t, 1))
499TEST_SUITE_END() // Broadcast
500
SiCong Libb88f892020-08-28 11:18:47 +0100501TEST_SUITE_END() // S32toS32
502
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000503#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Richardsondd715f22017-09-18 16:10:48 +0100504TEST_SUITE(F16toF16)
505
506TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100507PIXEL_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 +0100508TEST_SUITE_END() // Scale255
509
510TEST_SUITE_END() // F16toF16
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000511#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
John Richardsondd715f22017-09-18 16:10:48 +0100512
513TEST_SUITE(F32toF32)
514
515TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100516PIXEL_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 +0100517TEST_SUITE_END() // Scale255
518
519TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100520PIXEL_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 +0100521TEST_SUITE_END() // ScaleUnity
522
523TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100524PIXEL_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 +0100525TEST_SUITE_END() // ScaleOther
526
527TEST_SUITE_END() // F32toF32
528
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000529TEST_SUITE(Broadcast)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100530PIXEL_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 +0100531 VALIDATE(float, 1.f))
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000532TEST_SUITE_END() // Broadcast
533
John Richardsondd715f22017-09-18 16:10:48 +0100534TEST_SUITE_END()
535TEST_SUITE_END()
536} // namespace validation
537} // namespace test
538} // namespace arm_compute