blob: 9c0417b9ea333bf5a4ad62a6afc172f8a5e17a21 [file] [log] [blame]
John Richardsondd715f22017-09-18 16:10:48 +01001/*
Michele Di Giorgio9428a182020-03-30 14:10:20 +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
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010086#define PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, SHAPES, DT1, DT2, SCALE, RP, INPLACE_DATASET, VALIDATE) \
John Richardsondd715f22017-09-18 16:10:48 +010087 FIXTURE_DATA_TEST_CASE(TEST_NAME, NEPixelWiseMultiplication##FIXTURE, framework::DatasetMode::MODE, \
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010088 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)), \
92 framework::dataset::make("Scale", std::move(SCALE))), \
93 datasets::ConvertPolicies()), \
Sang-Hoon Park95a6f722020-06-19 15:31:29 +010094 framework::dataset::make("RoundingPolicy", RoundingPolicy::RP)), \
95 (INPLACE_DATASET))) \
John Richardsondd715f22017-09-18 16:10:48 +010096 { \
97 VALIDATE \
98 }
Manuel Bottini79fa9a22019-02-22 17:54:22 +000099
John Richardsondd715f22017-09-18 16:10:48 +0100100// *INDENT-ON*
101// clang-format on
John Richardsondd715f22017-09-18 16:10:48 +0100102} // namespace
103
Pablo Tello52ea9c22019-12-10 11:28:53 +0000104using NEPixelWiseMultiplicationQASYMM8Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, uint8_t, uint8_t>;
105using NEPixelWiseMultiplicationQASYMM8SignedFixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int8_t, int8_t>;
106using NEPixelWiseMultiplicationQSYMM16Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t>;
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100107using NEPixelWiseMultiplicationQSYMM16ToS32Fixture = PixelWiseMultiplicationValidationQuantizedFixture<Tensor, Accessor, NEPixelWiseMultiplication, int16_t, int16_t, int32_t>;
John Richardsondd715f22017-09-18 16:10:48 +0100108template <typename T>
109using NEPixelWiseMultiplicationToU8Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, uint8_t>;
110template <typename T>
111using NEPixelWiseMultiplicationToS16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, int16_t>;
112template <typename T>
113using NEPixelWiseMultiplicationToF16Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, half_float::half>;
114template <typename T>
115using NEPixelWiseMultiplicationToF32Fixture = PixelWiseMultiplicationValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
116template <typename T>
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000117using NEPixelWiseMultiplicationBroadcastFixture = PixelWiseMultiplicationBroadcastValidationFixture<Tensor, Accessor, NEPixelWiseMultiplication, T, float>;
John Richardsondd715f22017-09-18 16:10:48 +0100118
119TEST_SUITE(NEON)
120TEST_SUITE(PixelWiseMultiplication)
121
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000122// *INDENT-OFF*
123// clang-format off
Pablo Tello52ea9c22019-12-10 11:28:53 +0000124DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
125 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //1 Ok
126 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //2 Ok
127 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), //3 Window shrink
128 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //4 Invalid scale
129 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), //5 Invalid data type combination
130 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //6 Mismatching shapes
131 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), //7 Mismatching data type
132 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //8 Mismatching data type
133 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //9 Ok
134 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //10 Mismatching data type
135 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //11 Mismatching data type
136 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8), //12 Ok
137 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED), //13 Quantized cannot do WRAP
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000138 }),
139 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
140 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
141 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
142 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
143 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
144 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100145 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000146 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000147 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
148 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
149 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
150 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
151 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000152 })),
153 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
154 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
155 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
156 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
157 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
158 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100159 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000160 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000161 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
162 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
163 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
164 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8),
165 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::QASYMM8_SIGNED),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000166 })),
Pablo Tello52ea9c22019-12-10 11:28:53 +0000167 framework::dataset::make("Scale",{ scale_unity,
168 scale_unity,
169 scale_unity,
170 -1.f,
171 scale_unity,
172 scale_unity,
173 scale_unity,
174 scale_unity,
175 scale_unity,
176 scale_unity,
177 scale_unity,
178 scale_unity,
179 scale_unity})),
180 framework::dataset::make("OverflowPolicy",{
181 ConvertPolicy::WRAP,
182 ConvertPolicy::WRAP,
183 ConvertPolicy::WRAP,
184 ConvertPolicy::WRAP,
185 ConvertPolicy::WRAP,
186 ConvertPolicy::WRAP,
187 ConvertPolicy::WRAP,
188 ConvertPolicy::WRAP,
189 ConvertPolicy::SATURATE,
190 ConvertPolicy::WRAP,
191 ConvertPolicy::WRAP,
192 ConvertPolicy::SATURATE,
193 ConvertPolicy::WRAP,
194 })),
195
196 framework::dataset::make("Expected", { true, true, false, false, false, false, false, false, true , false, false, true, false })),
197 input1_info, input2_info, output_info, scale, policy, expected)
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000198{
Pablo Tello52ea9c22019-12-10 11:28:53 +0000199 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 +0000200 ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
201}
202// clang-format on
203// *INDENT-ON*
204
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100205TEST_SUITE(InPlaceValidate)
206TEST_CASE(SingleTensor, framework::DatasetMode::ALL)
207{
208 const auto random_shape = TensorShape{ 9, 9 };
209 const auto single_tensor_info = TensorInfo{ random_shape, 1, DataType::F32 };
210
211 Status result = NEPixelWiseMultiplication::validate(&single_tensor_info, &single_tensor_info, &single_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
212 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
213}
214
215TEST_CASE(ValidBroadCast, framework::DatasetMode::ALL)
216{
217 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
218 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
219
220 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
221 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
222
223 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &larger_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
224 ARM_COMPUTE_EXPECT(bool(result) == true, framework::LogLevel::ERRORS);
225}
226
227TEST_CASE(InvalidBroadcastOutput, framework::DatasetMode::ALL)
228{
229 const auto larger_shape = TensorShape{ 27U, 13U, 2U };
230 const auto smaller_shape = TensorShape{ 1U, 13U, 2U };
231
232 const auto larger_tensor_info = TensorInfo{ larger_shape, 1, DataType::F32 };
233 const auto smaller_tensor_info = TensorInfo{ smaller_shape, 1, DataType::F32 };
234
235 Status result = NEPixelWiseMultiplication::validate(&larger_tensor_info, &smaller_tensor_info, &smaller_tensor_info, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
236 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
237}
238
239TEST_CASE(InvalidBroadcastBoth, framework::DatasetMode::ALL)
240{
241 const auto shape0 = TensorShape{ 9U, 9U };
242 const auto shape1 = TensorShape{ 9U, 1U, 2U };
243
244 const auto info0 = TensorInfo{ shape0, 1, DataType::F32 };
245 const auto info1 = TensorInfo{ shape1, 1, DataType::F32 };
246
247 Status result{};
248
249 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info0, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
250 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
251
252 result = NEPixelWiseMultiplication::validate(&info0, &info1, &info1, scale_unity, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO);
253 ARM_COMPUTE_EXPECT(bool(result) == false, framework::LogLevel::ERRORS);
254}
255TEST_SUITE_END() // InPlaceValidate
256
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100257TEST_SUITE(Quantized)
Pablo Tello52ea9c22019-12-10 11:28:53 +0000258TEST_SUITE(QASYMM8_SIGNED)
259TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100260FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8SignedFixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
261 framework::dataset::make("DataTypeIn1", DataType::QASYMM8_SIGNED)),
262 framework::dataset::make("DataTypeIn2", DataType::QASYMM8_SIGNED)),
263 framework::dataset::make("DataTypeOut", DataType::QASYMM8_SIGNED)),
264 framework::dataset::make("Scale", { scale_unity })),
265 PixelWiseMultiplicationPolicySTZDataset),
266 PixelWiseMultiplicationQASYMM8QuantDataset),
267 InPlaceDataSet))
Pablo Tello52ea9c22019-12-10 11:28:53 +0000268{
269 // Validate output
270 validate(Accessor(_target), _reference, tolerance_qasymm8);
271}
272TEST_SUITE_END() // Scale255
273TEST_SUITE_END() // QASYMM8
274
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100275TEST_SUITE(QASYMM8)
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000276TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100277FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
278 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
279 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
280 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
281 framework::dataset::make("Scale", { scale_255 })),
282 PixelWiseMultiplicationPolicySTNUDataset),
283 PixelWiseMultiplicationQASYMM8QuantDataset),
284 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100285{
286 // Validate output
287 validate(Accessor(_target), _reference, tolerance_qasymm8);
288}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000289TEST_SUITE_END() // Scale255
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000290TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100291FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
292 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
293 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
294 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
295 framework::dataset::make("Scale", { scale_unity })),
296 PixelWiseMultiplicationPolicySTZDataset),
297 PixelWiseMultiplicationQASYMM8QuantDataset),
298 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100299{
300 // Validate output
301 validate(Accessor(_target), _reference, tolerance_qasymm8);
302}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000303TEST_SUITE_END() // ScaleUnity
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000304TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100305FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQASYMM8Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
306 framework::dataset::make("DataTypeIn1", DataType::QASYMM8)),
307 framework::dataset::make("DataTypeIn2", DataType::QASYMM8)),
308 framework::dataset::make("DataTypeOut", DataType::QASYMM8)),
309 framework::dataset::make("Scale", { scale_other })),
310 PixelWiseMultiplicationPolicySTZDataset),
311 PixelWiseMultiplicationQASYMM8QuantDataset),
312 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100313{
314 // Validate output
315 validate(Accessor(_target), _reference, tolerance_qasymm8);
316}
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000317TEST_SUITE_END() // ScaleOther
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100318TEST_SUITE_END() // QASYMM8
319TEST_SUITE(QSYMM16)
320TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100321FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
322 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
323 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
324 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
325 framework::dataset::make("Scale", { scale_255 })),
326 PixelWiseMultiplicationPolicySTNUDataset),
327 PixelWiseMultiplicationQSYMM16QuantDataset),
328 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100329{
330 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100331 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100332}
333TEST_SUITE_END() // Scale255
334TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100335FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
336 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
337 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
338 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
339 framework::dataset::make("Scale", { scale_unity })),
340 PixelWiseMultiplicationPolicySTZDataset),
341 PixelWiseMultiplicationQSYMM16QuantDataset),
342 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100343{
344 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100345 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100346}
347TEST_SUITE_END() // ScaleUnity
348TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100349FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
350 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
351 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
352 framework::dataset::make("DataTypeOut", DataType::QSYMM16)),
353 framework::dataset::make("Scale", { scale_other })),
354 PixelWiseMultiplicationPolicySTZDataset),
355 PixelWiseMultiplicationQSYMM16QuantDataset),
356 InPlaceDataSet))
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100357{
358 // Validate output
Michalis Spyroued516502019-07-05 15:20:09 +0100359 validate(Accessor(_target), _reference, tolerance_qsymm16);
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100360}
361TEST_SUITE_END() // ScaleOther
362TEST_SUITE_END() // QSYMM16
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100363TEST_SUITE(QSYMM16toS32)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100364FIXTURE_DATA_TEST_CASE(RunSmall, NEPixelWiseMultiplicationQSYMM16ToS32Fixture, framework::DatasetMode::ALL, combine(combine(combine(combine(combine(combine(combine(datasets::SmallShapes(),
365 framework::dataset::make("DataTypeIn1", DataType::QSYMM16)),
366 framework::dataset::make("DataTypeIn2", DataType::QSYMM16)),
367 framework::dataset::make("DataTypeOut", DataType::S32)),
368 framework::dataset::make("Scale", { scale_unity })),
369 PixelWiseMultiplicationPolicySTZDataset),
370 PixelWiseMultiplicationQSYMM16QuantDataset),
371 framework::dataset::make("InPlace", { false })))
Michele Di Giorgio9428a182020-03-30 14:10:20 +0100372{
373 // Validate output
374 validate(Accessor(_target), _reference);
375}
376TEST_SUITE_END() // QSYMM16toS32
Manuel Bottini7bb56c62019-06-26 15:17:09 +0100377TEST_SUITE_END() // Quantized
Manuel Bottini79fa9a22019-02-22 17:54:22 +0000378
John Richardsondd715f22017-09-18 16:10:48 +0100379TEST_SUITE(U8toU8)
380
381TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100382PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, scale_255, TO_NEAREST_UP, InPlaceDataSet, WRAP_VALIDATE(uint8_t, 1))
John Richardsondd715f22017-09-18 16:10:48 +0100383TEST_SUITE_END() // Scale255
384
385TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100386PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100387TEST_SUITE_END() // ScaleUnity
388
389TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100390PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, ALL, SmallShapes(), U8, U8, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100391TEST_SUITE_END() // ScaleOther
392
393TEST_SUITE_END() // U8toU8
394
395TEST_SUITE(U8toS16)
396
397TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100398PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, scale_255, TO_NEAREST_UP, framework::dataset::make("InPlace", { false }),
399 WRAP_VALIDATE(int16_t, 2))
John Richardsondd715f22017-09-18 16:10:48 +0100400TEST_SUITE_END() // Scale255
401
402TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100403PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, scale_unity, TO_ZERO, framework::dataset::make("InPlace", { false }), DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100404TEST_SUITE_END() // ScaleUnity
405
406TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100407PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, ALL, SmallShapes(), U8, S16, scale_other, TO_ZERO, framework::dataset::make("InPlace", { false }), DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100408TEST_SUITE_END() // ScaleOther
409
410TEST_SUITE_END() // U8toS16
411
412TEST_SUITE(S16toS16)
413
414TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100415PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, scale_255, TO_NEAREST_UP, InPlaceDataSet, WRAP_VALIDATE(int16_t, 2))
John Richardsondd715f22017-09-18 16:10:48 +0100416TEST_SUITE_END() // Scale255
417
418TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100419PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100420TEST_SUITE_END() // ScaleUnity
421
422TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100423PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, ALL, SmallShapes(), S16, S16, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100424TEST_SUITE_END() // ScaleOther
425
426TEST_SUITE_END() // S16toS16
427
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000428#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Richardsondd715f22017-09-18 16:10:48 +0100429TEST_SUITE(F16toF16)
430
431TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100432PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF16Fixture<half_float::half>, ALL, SmallShapes(), F16, F16, scale_255, TO_NEAREST_UP, InPlaceDataSet, VALIDATE(float, 1.f))
John Richardsondd715f22017-09-18 16:10:48 +0100433TEST_SUITE_END() // Scale255
434
435TEST_SUITE_END() // F16toF16
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000436#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
John Richardsondd715f22017-09-18 16:10:48 +0100437
438TEST_SUITE(F32toF32)
439
440TEST_SUITE(Scale255)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100441PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, scale_255, TO_NEAREST_UP, InPlaceDataSet, VALIDATE(float, 1.f))
John Richardsondd715f22017-09-18 16:10:48 +0100442TEST_SUITE_END() // Scale255
443
444TEST_SUITE(ScaleUnity)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100445PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, scale_unity, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100446TEST_SUITE_END() // ScaleUnity
447
448TEST_SUITE(ScaleOther)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100449PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, ALL, SmallShapes(), F32, F32, scale_other, TO_ZERO, InPlaceDataSet, DEFAULT_VALIDATE)
John Richardsondd715f22017-09-18 16:10:48 +0100450TEST_SUITE_END() // ScaleOther
451
452TEST_SUITE_END() // F32toF32
453
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000454TEST_SUITE(Broadcast)
Sang-Hoon Park95a6f722020-06-19 15:31:29 +0100455PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<float>, ALL, SmallShapesBroadcast(), F32, F32, scale_255, TO_NEAREST_UP, framework::dataset::make("InPlace", { false }),
456 VALIDATE(float, 1.f))
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000457TEST_SUITE_END() // Broadcast
458
John Richardsondd715f22017-09-18 16:10:48 +0100459TEST_SUITE_END()
460TEST_SUITE_END()
461} // namespace validation
462} // namespace test
463} // namespace arm_compute