blob: 0b88628912e723fb5416b4fae1942ba770bdfa48 [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>
114using NEPixelWiseMultiplicationToF16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, half_float::half>;
115template <typename T>
Sheri Zhanga449a362020-07-16 15:52:25 +0100116using NEPixelWiseMultiplicationToF32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100117using NEPixelWiseMultiplicationU8U8ToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t, int16_t>;
Sheri Zhanga449a362020-07-16 15:52:25 +0100118template <typename T>
119using NEPixelWiseMultiplicationBroadcastFixture = PixelWiseMultiplicationBroadcastValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
120using NEPixelWiseMultiplicationBroadcastQASYMM8Fixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
121using NEPixelWiseMultiplicationBroadcastQASYMM8SignedFixture = PixelWiseMultiplicationBroadcastValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100122
123TEST_SUITE(NEON)
124TEST_SUITE(PixelWiseMultiplication)
125
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000126// *INDENT-OFF*
127// clang-format off
Pablo Tello52ea9c22019-12-10 11:28:53 +0000128DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
129 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //1 Ok
130 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //2 Ok
131 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), //3 Window shrink
132 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //4 Invalid scale
133 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //5 Invalid data type combination
134 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //6 Mismatching shapes
135 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //7 Mismatching data type
136 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //8 Mismatching data type
137 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //9 Ok
138 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //10 Mismatching data type
139 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //11 Mismatching data type
140 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //12 Ok
141 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //13 Quantized cannot do WRAP
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000142 }),
143 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
144 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
145 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
146 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
147 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
148 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100149 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000150 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000151 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
152 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
153 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
154 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
155 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000156 })),
157 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
158 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
159 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
160 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
161 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
162 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100163 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000164 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000165 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
166 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
167 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
168 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
169 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000170 })),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000171 framework::dataset::make("Scale",{ scale_unity,
172 scale_unity,
173 scale_unity,
174 -1.f,
175 scale_unity,
176 scale_unity,
177 scale_unity,
178 scale_unity,
179 scale_unity,
180 scale_unity,
181 scale_unity,
182 scale_unity,
183 scale_unity})),
184 framework::dataset::make("OverflowPolicy",{
185 ConvertPolicy::WRAP,
186 ConvertPolicy::WRAP,
187 ConvertPolicy::WRAP,
188 ConvertPolicy::WRAP,
189 ConvertPolicy::WRAP,
190 ConvertPolicy::WRAP,
191 ConvertPolicy::WRAP,
192 ConvertPolicy::WRAP,
193 ConvertPolicy::SATURATE,
194 ConvertPolicy::WRAP,
195 ConvertPolicy::WRAP,
196 ConvertPolicy::SATURATE,
197 ConvertPolicy::WRAP,
198 })),
199
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100200 framework::dataset::make("Expected", { true, true, true, false, false, false, false, false, true , false, false, true, false })),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000201 input1_info, input2_info, output_info, scale, policy, expected)
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000202{
Pablo Tello52ea9c22019-12-10 11:28:53 +0000203 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 +0000204 ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
205}
206// clang-format on
207// *INDENT-ON*
208
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100209TEST_SUITE(InPlaceValidate)
210TEST_CASE(SingleTensor, framework::DatasetMode::ALL)
211{
212 const auto random_shape = TensorShape{ 9, 9 };
213 const auto single_tensor_info = TensorInfo{ random_shape, 1, DataType::F32 };
214
215 Status result = NEPixelWiseMultiplication::validate(&single_tensor_info, &single_tensor_info, &single_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
216 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
217}
218
219TEST_CASE(ValidBroadCast, framework::DatasetMode::ALL)
220{
221 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
222 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
223
224 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
225 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
226
227 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &larger_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
228 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
229}
230
231TEST_CASE(InvalidBroadcastOutput, framework::DatasetMode::ALL)
232{
233 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
234 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
235
236 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
237 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
238
239 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &smaller_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
240 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
241}
242
243TEST_CASE(InvalidBroadcastBoth, framework::DatasetMode::ALL)
244{
245 const auto shape0 = TensorShape{ 9U, 9U };
246 const auto shape1 = TensorShape{ 9U, 1U, 2U };
247
248 const auto info0 = TensorInfo{ shape0, 1, DataType::F32 };
249 const auto info1 = TensorInfo{ shape1, 1, DataType::F32 };
250
251 Status result{};
252
253 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info0, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
254 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
255
256 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info1, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
257 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
258}
259TEST_SUITE_END() // InPlaceValidate
260
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100261TEST_SUITE(Quantized)
Pablo Tello52ea9c22019-12-10 11:28:53 +0000262TEST_SUITE(QASYMM8_SIGNED)
263TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100264FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8SignedFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
265 framework::dataset::make("DataTypeIn1", DataType::QASYMM8_SIGNED)),
266 framework::dataset::make("DataTypeIn2", DataType::QASYMM8_SIGNED)),
267 framework::dataset::make("DataTypeOut", DataType::QASYMM8_SIGNED)),
268 framework::dataset::make("Scale", { scale_unity })),
269 PixelWiseMultiplicationPolicySTZDataset),
270 PixelWiseMultiplicationQASYMM8QuantDataset),
271 InPlaceDataSet))
Pablo Tello52ea9c22019-12-10 11:28:53 +0000272{
273 // Validate output
274 validate(Accessor(_target), _reference, tolerance_qasymm8);
275}
276TEST_SUITE_END() // Scale255
277TEST_SUITE_END() // QASYMM8
278
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100279TEST_SUITE(QASYMM8)
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000280TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100281FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
282 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
283 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
284 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
285 framework::dataset::make("Scale", { scale_255 })),
286 PixelWiseMultiplicationPolicySTNUDataset),
287 PixelWiseMultiplicationQASYMM8QuantDataset),
288 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100289{
290 // Validate output
291 validate(Accessor(_target), _reference, tolerance_qasymm8);
292}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000293TEST_SUITE_END() // Scale255
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000294TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100295FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
296 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
297 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
298 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
299 framework::dataset::make("Scale", { scale_unity })),
300 PixelWiseMultiplicationPolicySTZDataset),
301 PixelWiseMultiplicationQASYMM8QuantDataset),
302 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100303{
304 // Validate output
305 validate(Accessor(_target), _reference, tolerance_qasymm8);
306}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000307TEST_SUITE_END() // ScaleUnity
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000308TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100309FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
310 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
311 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
312 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
313 framework::dataset::make("Scale", { scale_other })),
314 PixelWiseMultiplicationPolicySTZDataset),
315 PixelWiseMultiplicationQASYMM8QuantDataset),
316 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100317{
318 // Validate output
319 validate(Accessor(_target), _reference, tolerance_qasymm8);
320}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000321TEST_SUITE_END() // ScaleOther
Sheri Zhanga449a362020-07-16 15:52:25 +0100322TEST_SUITE(Broadcast)
323FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationBroadcastQASYMM8Fixture, framework::DatasetMode::ALL,
324 combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapesBroadcast(),
325 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
326 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
327 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
328 framework::dataset::make("Scale", { scale_other })),
329 PixelWiseMultiplicationPolicySTZDataset),
330 PixelWiseMultiplicationQASYMM8QuantDataset),
331 framework::dataset::make("InPlace", { false })))
332{
333 // Validate output
334 validate(Accessor(_target), _reference, tolerance_qasymm8);
335}
336TEST_SUITE_END() // Broadcast
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100337TEST_SUITE_END() // QASYMM8
338TEST_SUITE(QSYMM16)
339TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100340FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
341 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
342 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
343 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
344 framework::dataset::make("Scale", { scale_255 })),
345 PixelWiseMultiplicationPolicySTNUDataset),
346 PixelWiseMultiplicationQSYMM16QuantDataset),
347 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100348{
349 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100350 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100351}
352TEST_SUITE_END() // Scale255
353TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100354FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
355 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
356 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
357 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
358 framework::dataset::make("Scale", { scale_unity })),
359 PixelWiseMultiplicationPolicySTZDataset),
360 PixelWiseMultiplicationQSYMM16QuantDataset),
361 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100362{
363 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100364 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100365}
366TEST_SUITE_END() // ScaleUnity
367TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100368FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
369 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
370 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
371 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
372 framework::dataset::make("Scale", { scale_other })),
373 PixelWiseMultiplicationPolicySTZDataset),
374 PixelWiseMultiplicationQSYMM16QuantDataset),
375 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100376{
377 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100378 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100379}
380TEST_SUITE_END() // ScaleOther
381TEST_SUITE_END() // QSYMM16
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100382TEST_SUITE(QSYMM16toS32)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100383FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16ToS32Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
384 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
385 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
386 framework::dataset::make("DataTypeOut", DataType::S32)),
387 framework::dataset::make("Scale", { scale_unity })),
388 PixelWiseMultiplicationPolicySTZDataset),
389 PixelWiseMultiplicationQSYMM16QuantDataset),
390 framework::dataset::make("InPlace", { false })))
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100391{
392 // Validate output
393 validate(Accessor(_target), _reference);
394}
395TEST_SUITE_END() // QSYMM16toS32
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100396TEST_SUITE_END() // Quantized
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000397
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100398TEST_SUITE(U8U8toS16)
399
400FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
401 framework::dataset::make("DataTypeIn1", DataType::U8)),
402 framework::dataset::make("DataTypeIn2", DataType::U8)),
403 framework::dataset::make("DataTypeOut", DataType::S16)),
404 framework::dataset::make("Scale", { scale_255 })),
405 datasets::ConvertPolicies()),
406 framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_NEAREST_UP)),
407 framework::dataset::make("InPlace", { false })))
408{
409 // Validate output
410 validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<int16_t>(1), 0.f);
411}
412
413FIXTURE_DATA_TEST_CASE(RunSmall1, NEPixelWiseMultiplicationU8U8ToS16Fixture, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
414 framework::dataset::make("DataTypeIn1", DataType::U8)),
415 framework::dataset::make("DataTypeIn2", DataType::U8)),
416 framework::dataset::make("DataTypeOut", DataType::S16)),
417 framework::dataset::make("Scale", { scale_other })),
418 datasets::ConvertPolicies()),
419 framework::dataset::make("RoundingPolicy", RoundingPolicy::TO_ZERO)),
420 framework::dataset::make("InPlace", { false })))
421{
422 // Validate output
423 validate(Accessor(_target), _reference);
424}
425
426TEST_SUITE_END() // U8U8toS16
427
John Richardsondd715f22017-09-18 16:10:48 +0100428TEST_SUITE(U8toU8)
429
430TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100431PIXEL_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 +0100432TEST_SUITE_END() // Scale255
433
434TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100435PIXEL_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 +0100436TEST_SUITE_END() // ScaleUnity
437
438TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100439PIXEL_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 +0100440TEST_SUITE_END() // ScaleOther
441
442TEST_SUITE_END() // U8toU8
443
444TEST_SUITE(U8toS16)
445
446TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100447PIXEL_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 +0100448 WRAP_VALIDATE(int16_t, 2))
John Richardsondd715f22017-09-18 16:10:48 +0100449TEST_SUITE_END() // Scale255
450
451TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100452PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_unity, TO_ZERO, framework::dataset::make("InPlace", { false }),
453 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100454TEST_SUITE_END() // ScaleUnity
455
456TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100457PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, S16, scale_other, TO_ZERO, framework::dataset::make("InPlace", { false }),
458 DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100459TEST_SUITE_END() // ScaleOther
460
461TEST_SUITE_END() // U8toS16
462
463TEST_SUITE(S16toS16)
464
465TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100466PIXEL_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 +0100467TEST_SUITE_END() // Scale255
468
469TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100470PIXEL_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 +0100471TEST_SUITE_END() // ScaleUnity
472
473TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100474PIXEL_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 +0100475TEST_SUITE_END() // ScaleOther
476
477TEST_SUITE_END() // S16toS16
478
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000479#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Richardsondd715f22017-09-18 16:10:48 +0100480TEST_SUITE(F16toF16)
481
482TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100483PIXEL_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 +0100484TEST_SUITE_END() // Scale255
485
486TEST_SUITE_END() // F16toF16
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000487#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
John Richardsondd715f22017-09-18 16:10:48 +0100488
489TEST_SUITE(F32toF32)
490
491TEST_SUITE(Scale255)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100492PIXEL_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 +0100493TEST_SUITE_END() // Scale255
494
495TEST_SUITE(ScaleUnity)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100496PIXEL_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 +0100497TEST_SUITE_END() // ScaleUnity
498
499TEST_SUITE(ScaleOther)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100500PIXEL_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 +0100501TEST_SUITE_END() // ScaleOther
502
503TEST_SUITE_END() // F32toF32
504
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000505TEST_SUITE(Broadcast)
Sheri Zhangfcf6f4e2020-06-25 20:01:00 +0100506PIXEL_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 +0100507 VALIDATE(float, 1.f))
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000508TEST_SUITE_END() // Broadcast
509
John Richardsondd715f22017-09-18 16:10:48 +0100510TEST_SUITE_END()
511TEST_SUITE_END()
512} // namespace validation
513} // namespace test
514} // namespace arm_compute