blob: 77da473e0d8b4eece1d27c15c080d057e6756b36 [file] [log] [blame]
John Richardsondd715f22017-09-18 16:10:48 +01001/*
Michalis Spyrou861f0db2018-02-26 16:47:58 +00002 * Copyright (c) 2017-2018 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 */
24#include "arm_compute/runtime/NEON/functions/NEPixelWiseMultiplication.h"
25#include "tests/NEON/Accessor.h"
26#include "tests/PaddingCalculator.h"
27#include "tests/datasets/ConvertPolicyDataset.h"
28#include "tests/datasets/ShapeDatasets.h"
29#include "tests/framework/Macros.h"
30#include "tests/validation/Validation.h"
31#include "tests/validation/fixtures/PixelWiseMultiplicationFixture.h"
32
33namespace arm_compute
34{
35namespace test
36{
37namespace validation
38{
39namespace
40{
41const float scale_unity = 1.f;
42const float scale_255 = 1.f / 255.f;
43const float scale_other = 1.f / 32768.f;
44
45#define DEFAULT_VALIDATE validate(Accessor(_target), _reference);
John Richardson9c450cc2017-11-22 12:00:41 +000046#define VALIDATE(TYPE, TOLERANCE) validate(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
John Richardsondd715f22017-09-18 16:10:48 +010047#define WRAP_VALIDATE(TYPE, TOLERANCE) validate_wrap(Accessor(_target), _reference, AbsoluteTolerance<TYPE>(TOLERANCE), 0.f);
48
49// *INDENT-OFF*
50// clang-format off
51#define PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(DT1, DT2, SCALE, RP) \
52 DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, \
53 combine(combine(combine(combine(combine( \
54 concat(datasets::SmallShapes(), datasets::LargeShapes()), \
55 framework::dataset::make("DataType1", DataType::DT1)), \
56 framework::dataset::make("DataType2", DataType::DT2)), \
57 framework::dataset::make("Scale", std::move(SCALE))), \
58 datasets::ConvertPolicies()), \
59 framework::dataset::make("RoundingPolicy", RoundingPolicy::RP)), \
60 shape, dt1, dt2, scale, convert_policy, rounding_policy) \
61 { \
62 validate_configuration(shape, dt1, dt2, scale, convert_policy, rounding_policy); \
63 }
64
65#define PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, SHAPES, DT1, DT2, SCALE, RP, VALIDATE) \
66 FIXTURE_DATA_TEST_CASE(TEST_NAME, NEPixelWiseMultiplication##FIXTURE, framework::DatasetMode::MODE, \
67 combine(combine(combine(combine(combine( \
68 datasets::SHAPES, \
69 framework::dataset::make("DataType1", DataType::DT1)), \
70 framework::dataset::make("DataType2", DataType::DT2)), \
71 framework::dataset::make("Scale", std::move(SCALE))), \
72 datasets::ConvertPolicies()), \
73 framework::dataset::make("RoundingPolicy", RoundingPolicy::RP))) \
74 { \
75 VALIDATE \
76 }
77// *INDENT-ON*
78// clang-format on
79
80void validate_configuration(TensorShape shape, DataType dt1, DataType dt2, float scale, ConvertPolicy convert_policy, RoundingPolicy rounding_policy)
81{
82 Tensor src1 = create_tensor<Tensor>(shape, dt1);
83 Tensor src2 = create_tensor<Tensor>(shape, dt2);
84 Tensor dst = create_tensor<Tensor>(shape, dt2);
85
86 ARM_COMPUTE_EXPECT(src1.info()->is_resizable(), framework::LogLevel::ERRORS);
87 ARM_COMPUTE_EXPECT(src2.info()->is_resizable(), framework::LogLevel::ERRORS);
88 ARM_COMPUTE_EXPECT(dst.info()->is_resizable(), framework::LogLevel::ERRORS);
89
90 // Create and configure function
91 NEPixelWiseMultiplication multiply;
92 multiply.configure(&src1, &src2, &dst, scale, convert_policy, rounding_policy);
93
94 // Validate valid region
95 const ValidRegion valid_region = shape_to_valid_region(shape);
96 validate(src1.info()->valid_region(), valid_region);
97 validate(src2.info()->valid_region(), valid_region);
98 validate(dst.info()->valid_region(), valid_region);
99
100 // Validate padding
101 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
102 validate(src1.info()->padding(), padding);
103 validate(src2.info()->padding(), padding);
104 validate(dst.info()->padding(), padding);
105}
106} // namespace
107
108template <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
124DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
125 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
126 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
127 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Window shrink
128 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid scale
129 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
130 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100131 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), // Mismatching data type
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000132 }),
133 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
134 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
135 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
136 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
137 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
138 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100139 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000140 })),
141 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
142 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
143 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
144 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
145 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
146 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100147 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000148 })),
Vidhya Sudhan Loganathan0fc25452018-06-18 14:40:56 +0100149 framework::dataset::make("Scale",{ scale_unity, scale_unity, scale_unity, -1.f, scale_unity, scale_unity, scale_unity})),
150 framework::dataset::make("Expected", { true, true, false, false, false, false, false })),
Ioan-Cristian Szabo754e9522017-11-28 18:29:43 +0000151 input1_info, input2_info, output_info, scale, expected)
152{
153 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, ConvertPolicy::WRAP, RoundingPolicy::TO_ZERO));
154 ARM_COMPUTE_EXPECT(has_error == expected, framework::LogLevel::ERRORS);
155}
156// clang-format on
157// *INDENT-ON*
158
John Richardsondd715f22017-09-18 16:10:48 +0100159TEST_SUITE(U8toU8)
160
161TEST_SUITE(Scale255)
162PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, U8, scale_255, TO_NEAREST_UP)
163PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, U8, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(uint8_t, 1))
164PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToU8Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, U8, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(uint8_t, 1))
165TEST_SUITE_END() // Scale255
166
167TEST_SUITE(ScaleUnity)
168PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, U8, scale_unity, TO_ZERO)
169PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, U8, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
170PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToU8Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, U8, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
171TEST_SUITE_END() // ScaleUnity
172
173TEST_SUITE(ScaleOther)
174PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, U8, scale_other, TO_ZERO)
175PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToU8Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, U8, scale_other, TO_ZERO, DEFAULT_VALIDATE)
176PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToU8Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, U8, scale_other, TO_ZERO, DEFAULT_VALIDATE)
177TEST_SUITE_END() // ScaleOther
178
179TEST_SUITE_END() // U8toU8
180
181TEST_SUITE(U8toS16)
182
183TEST_SUITE(Scale255)
184PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, S16, scale_255, TO_NEAREST_UP)
185PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, S16, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(int16_t, 2))
186PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, S16, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(int16_t, 2))
187TEST_SUITE_END() // Scale255
188
189TEST_SUITE(ScaleUnity)
190PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, S16, scale_unity, TO_ZERO)
191PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, S16, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
192PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, S16, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
193TEST_SUITE_END() // ScaleUnity
194
195TEST_SUITE(ScaleOther)
196PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(U8, S16, scale_other, TO_ZERO)
197PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<uint8_t>, PRECOMMIT, SmallShapes(), U8, S16, scale_other, TO_ZERO, DEFAULT_VALIDATE)
198PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<uint8_t>, NIGHTLY, LargeShapes(), U8, S16, scale_other, TO_ZERO, DEFAULT_VALIDATE)
199TEST_SUITE_END() // ScaleOther
200
201TEST_SUITE_END() // U8toS16
202
203TEST_SUITE(S16toS16)
204
205TEST_SUITE(Scale255)
206PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(S16, S16, scale_255, TO_NEAREST_UP)
207PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, PRECOMMIT, SmallShapes(), S16, S16, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(int16_t, 2))
208PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<int16_t>, NIGHTLY, LargeShapes(), S16, S16, scale_255, TO_NEAREST_UP, WRAP_VALIDATE(int16_t, 2))
209TEST_SUITE_END() // Scale255
210
211TEST_SUITE(ScaleUnity)
212PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(S16, S16, scale_unity, TO_ZERO)
213PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, PRECOMMIT, SmallShapes(), S16, S16, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
214PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<int16_t>, NIGHTLY, LargeShapes(), S16, S16, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
215TEST_SUITE_END() // ScaleUnity
216
217TEST_SUITE(ScaleOther)
218PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(S16, S16, scale_other, TO_ZERO)
219PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToS16Fixture<int16_t>, PRECOMMIT, SmallShapes(), S16, S16, scale_other, TO_ZERO, DEFAULT_VALIDATE)
220PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToS16Fixture<int16_t>, NIGHTLY, LargeShapes(), S16, S16, scale_other, TO_ZERO, DEFAULT_VALIDATE)
221TEST_SUITE_END() // ScaleOther
222
223TEST_SUITE_END() // S16toS16
224
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000225#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
John Richardsondd715f22017-09-18 16:10:48 +0100226TEST_SUITE(F16toF16)
227
228TEST_SUITE(Scale255)
John Richardson9c450cc2017-11-22 12:00:41 +0000229PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF16Fixture<half_float::half>, PRECOMMIT, SmallShapes(), F16, F16, scale_255, TO_NEAREST_UP, VALIDATE(float, 1.f))
John Richardsondd715f22017-09-18 16:10:48 +0100230TEST_SUITE_END() // Scale255
231
232TEST_SUITE_END() // F16toF16
Ioan-Cristian Szabo5edbd1c2017-11-13 13:34:08 +0000233#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
John Richardsondd715f22017-09-18 16:10:48 +0100234
235TEST_SUITE(F32toF32)
236
237TEST_SUITE(Scale255)
238PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(F32, F32, scale_255, TO_NEAREST_UP)
John Richardson9c450cc2017-11-22 12:00:41 +0000239PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, PRECOMMIT, SmallShapes(), F32, F32, scale_255, TO_NEAREST_UP, VALIDATE(float, 1.f))
240PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToF32Fixture<float>, NIGHTLY, LargeShapes(), F32, F32, scale_255, TO_NEAREST_UP, VALIDATE(float, 1.f))
John Richardsondd715f22017-09-18 16:10:48 +0100241TEST_SUITE_END() // Scale255
242
243TEST_SUITE(ScaleUnity)
244PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(F32, F32, scale_unity, TO_ZERO)
245PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, PRECOMMIT, SmallShapes(), F32, F32, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
246PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToF32Fixture<float>, NIGHTLY, LargeShapes(), F32, F32, scale_unity, TO_ZERO, DEFAULT_VALIDATE)
247TEST_SUITE_END() // ScaleUnity
248
249TEST_SUITE(ScaleOther)
250PIXEL_WISE_MULTIPLICATION_DATA_TEST_CASE(F32, F32, scale_other, TO_ZERO)
251PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, ToF32Fixture<float>, PRECOMMIT, SmallShapes(), F32, F32, scale_other, TO_ZERO, DEFAULT_VALIDATE)
252PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunLarge, ToF32Fixture<float>, NIGHTLY, LargeShapes(), F32, F32, scale_other, TO_ZERO, DEFAULT_VALIDATE)
253TEST_SUITE_END() // ScaleOther
254
255TEST_SUITE_END() // F32toF32
256
Michalis Spyrou861f0db2018-02-26 16:47:58 +0000257TEST_SUITE(Broadcast)
258PIXEL_WISE_MULTIPLICATION_FIXTURE_DATA_TEST_CASE(RunSmall, BroadcastFixture<float>, PRECOMMIT, SmallShapesBroadcast(), F32, F32, scale_255, TO_NEAREST_UP, VALIDATE(float, 1.f))
259TEST_SUITE_END() // Broadcast
260
John Richardsondd715f22017-09-18 16:10:48 +0100261TEST_SUITE_END()
262TEST_SUITE_END()
263} // namespace validation
264} // namespace test
265} // namespace arm_compute