blob: ff22ae5ef091814e230b62e875c880a6185675fc [file] [log] [blame]
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01001/*
SiCong Li1b2f8682023-01-04 10:04:26 +00002 * Copyright (c) 2017-2023 Arm Limited.
Moritz Pflanzerb3d25792017-07-26 11:49:37 +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/core/Types.h"
25#include "arm_compute/runtime/CL/CLTensor.h"
26#include "arm_compute/runtime/CL/CLTensorAllocator.h"
27#include "arm_compute/runtime/CL/functions/CLDirectConvolutionLayer.h"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010028#include "tests/CL/CLAccessor.h"
29#include "tests/PaddingCalculator.h"
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +000030#include "tests/datasets/DirectConvolutionLayerDataset.h"
Moritz Pflanzera09de0c2017-09-01 20:41:12 +010031#include "tests/datasets/ShapeDatasets.h"
32#include "tests/framework/Asserts.h"
33#include "tests/framework/Macros.h"
34#include "tests/framework/datasets/Datasets.h"
35#include "tests/validation/Validation.h"
36#include "tests/validation/fixtures/DirectConvolutionLayerFixture.h"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010037
SiCong Li54eafd82023-01-26 17:36:08 +000038/** Synced with tests/validation/dynamic_fusion/gpu/cl/DirectConv2d.cpp
39 * Please check there for any differences in the coverage
40 */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010041namespace arm_compute
42{
43namespace test
44{
45namespace validation
46{
47namespace
48{
Gunes Bayir38ce29d2021-08-04 12:45:33 +010049RelativeTolerance<half> tolerance_fp16(half(0.2)); /**< Tolerance for floating point tests */
50RelativeTolerance<float> tolerance_fp32(0.05f); /**< Tolerance for floating point tests */
51constexpr float abs_tolerance_f32(0.0001f); /**< Absolute tolerance for FP32 tests*/
52
53constexpr float tolerance_num = 0.07f; /**< Tolerance number */
54constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance for quantized tests */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010055
Michalis Spyrou45091732019-05-13 17:41:01 +010056const auto data_strides = combine(framework::dataset::make("StrideX", 1, 3), framework::dataset::make("StrideY", 1, 3));
57const auto data_strides_small = combine(framework::dataset::make("StrideX", 1), framework::dataset::make("StrideY", 1));
58const auto data_ksize_one = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 1)));
59const auto data_ksize_one_small = combine(framework::dataset::make("PadX", 0), combine(framework::dataset::make("PadY", 0), framework::dataset::make("KernelSize", 1)));
60const auto data_ksize_three = combine(framework::dataset::make("PadX", 0, 2), combine(framework::dataset::make("PadY", 0, 2), framework::dataset::make("KernelSize", 3)));
61const auto data_ksize_five = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 5)));
62const auto data_ksize_nine = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 9)));
63const auto data_ksize_nine_small = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 9)));
Michalis Spyroudef665a2017-08-14 11:26:37 +010064
Michalis Spyrou45091732019-05-13 17:41:01 +010065const auto data_all_kernels = concat(concat(data_ksize_one, data_ksize_three), data_ksize_five);
66
67const auto data = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_all_kernels));
68const auto data9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_ksize_nine));
69const auto data_small = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_one_small));
70const auto data_small9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_nine_small));
Michalis Spyrou064add62018-11-01 18:14:27 +000071
72/** Direct convolution nightly data set. */
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +010073const auto data_nightly = combine(data, framework::dataset::make("NumKernels", { 1, 4 }));
74const auto data_nightly_9x9 = combine(data9x9, framework::dataset::make("NumKernels", { 1, 4 }));
75const auto data_nightly_usecase = combine(framework::dataset::make("InputShape", { TensorShape{ 3U, 800U, 800U } }),
76 combine(framework::dataset::make("StrideX", { 1 }),
77 combine(framework::dataset::make("StrideY", { 1 }),
78 combine(framework::dataset::make("PadX", { 4 }),
79 combine(framework::dataset::make("PadY", { 4 }),
80 combine(framework::dataset::make("KernelSize", 9),
81 framework::dataset::make("NumKernels", { 16 })))))));
82
Michalis Spyrou064add62018-11-01 18:14:27 +000083/** Direct convolution precommit data set. */
Michalis Spyrou45091732019-05-13 17:41:01 +010084const auto data_precommit = combine(data_small, framework::dataset::make("NumKernels", { 1 }));
85const auto data_precommit_9x9 = combine(data_small9x9, framework::dataset::make("NumKernels", { 1 }));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010086
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000087/** Activation function Dataset*/
88const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
Michalis Spyrou5ce99a22019-01-25 14:17:49 +000089{ ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f) });
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010090} // namespace
91
92TEST_SUITE(CL)
93TEST_SUITE(DirectConvolutionLayer)
94
Michele Di Giorgio97e25802021-03-25 12:37:45 +000095/** Check whether the configuration of a Direct Convolution layer with no
96 * bias leads to a successful execution.
97 */
98TEST_CASE(NoBias, framework::DatasetMode::PRECOMMIT)
99{
100 const auto src_shape = TensorShape(27U, 13U, 2U);
101 const auto weights_shape = TensorShape(3U, 3U, 2U, 4U);
102 const auto bias_shape = TensorShape(4U);
103 const auto dst_shape = TensorShape(25U, 11U, 4U);
104 constexpr auto dt = DataType::F32;
105
106 auto src = create_tensor<CLTensor>(src_shape, dt);
107 auto weights = create_tensor<CLTensor>(weights_shape, dt);
108 auto dst = create_tensor<CLTensor>(dst_shape, dt);
109
110 const auto conv_info = PadStrideInfo(1, 1, 0, 0);
111
112 // Create Direct Convolution function
113 CLDirectConvolutionLayer conv{};
114 conv.configure(&src, &weights, nullptr, &dst, conv_info);
115
116 src.allocator()->allocate();
117 weights.allocator()->allocate();
118 dst.allocator()->allocate();
119
120 library->fill_tensor_value(CLAccessor(src), 1.f);
121 library->fill_tensor_value(CLAccessor(weights), 1.f);
122
123 conv.run();
124
125 // Compute reference to compare
126 SimpleTensor<float> ref_src{ src_shape, dt };
127 SimpleTensor<float> ref_weights{ weights_shape, dt };
128 SimpleTensor<float> ref_bias{ bias_shape, dt };
129 library->fill_tensor_value(ref_src, 1.f);
130 library->fill_tensor_value(ref_weights, 1.f);
131 // No bias
132 library->fill_tensor_value(ref_bias, 0.f);
133 auto ref_dst = reference::convolution_layer<float>(ref_src, ref_weights, ref_bias, dst_shape, conv_info);
134
135 validate(CLAccessor(dst), ref_dst);
136}
137
Ramy Elgammal73f19af2022-10-23 11:44:49 +0100138/** Check whether the case of rectangle kernels i.e. when width and height of the weight_shape are not equal
139 * would lead to successful run
140 */
141TEST_CASE(NonSquareKernel, framework::DatasetMode::PRECOMMIT)
142{
143 auto src_shape = TensorShape(33U, 27U, 3U);
144 auto weights_shape = TensorShape(5U, 7U, 3U, 4U); // non-square kernel
145 const auto bias_shape = TensorShape(4U);
146 auto dst_shape = TensorShape(11U, 12U, 4U);
147 constexpr auto dt = DataType::F32;
148
149 TensorShape src_shape_nhwc(src_shape);
150 TensorShape weights_shape_nhwc(weights_shape);
151 TensorShape dst_shape_nhwc(dst_shape);
152
153 // Non-square shapes are only allowed for NHWC
154 permute(src_shape_nhwc, PermutationVector(2U, 0U, 1U));
155 permute(weights_shape_nhwc, PermutationVector(2U, 0U, 1U));
156 permute(dst_shape_nhwc, PermutationVector(2U, 0U, 1U));
157
158 auto src = create_tensor<CLTensor>(src_shape_nhwc, dt, 1, QuantizationInfo(), DataLayout::NHWC);
159 auto weights = create_tensor<CLTensor>(weights_shape_nhwc, dt, 1, QuantizationInfo(), DataLayout::NHWC);
160 auto dst = create_tensor<CLTensor>(dst_shape_nhwc, dt, 1, QuantizationInfo(), DataLayout::NHWC);
161 const auto conv_info = PadStrideInfo(3, 2, 1, 1, 2, 0, DimensionRoundingType::FLOOR);
162
163 // Create direct convolution function
164 CLDirectConvolutionLayer conv{};
165 conv.configure(&src, &weights, nullptr, &dst, conv_info);
166
167 src.allocator()->allocate();
168 weights.allocator()->allocate();
169 dst.allocator()->allocate();
170
171 library->fill_tensor_value(CLAccessor(src), 1.f);
172 library->fill_tensor_value(CLAccessor(weights), 1.f);
173
174 conv.run();
175
176 // Compute reference to compare
177 SimpleTensor<float> ref_src{ src_shape, dt };
178 SimpleTensor<float> ref_weights{ weights_shape, dt };
179 SimpleTensor<float> ref_bias{ bias_shape, dt };
180 library->fill_tensor_value(ref_src, 1.f);
181 library->fill_tensor_value(ref_weights, 1.f);
182 // No bias
183 library->fill_tensor_value(ref_bias, 0.f);
184 auto ref_dst = reference::convolution_layer<float>(ref_src, ref_weights, ref_bias, dst_shape, conv_info);
185
186 validate(CLAccessor(dst), ref_dst);
187}
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000188// *INDENT-OFF*
189// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000190DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
SiCong Li1b2f8682023-01-04 10:04:26 +0000191 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid: Mismatching data type input/weights
192 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid: Mismatching input feature maps
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100193 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
SiCong Li1b2f8682023-01-04 10:04:26 +0000194 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported biases size
195 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported biases dimensions
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100196 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100197 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000198 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100199 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
200 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100201 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32),
202 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
203 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
204 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100205 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000206 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100207 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32),
208 TensorInfo(TensorShape(4U), 1, DataType::F32),
209 TensorInfo(TensorShape(4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100210 TensorInfo(TensorShape(3U), 1, DataType::F32),
211 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
212 TensorInfo(TensorShape(4U), 1, DataType::F32),
213 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000214 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100215 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
216 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
217 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
218 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
219 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100220 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100221 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000222 })),
223 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
224 PadStrideInfo(1, 1, 0, 0),
225 PadStrideInfo(1, 1, 0, 0),
226 PadStrideInfo(1, 1, 0, 0),
227 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000228 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000229 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000230 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000231 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000232{
SiCong Li1b2f8682023-01-04 10:04:26 +0000233 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
234 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
235 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
236 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
237 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
238 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000239 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
240})),
SiCong Li1b2f8682023-01-04 10:04:26 +0000241 framework::dataset::make("Expected", { false, false, false, false, false, false, true })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000242 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
243{
244 bool is_valid = bool(CLDirectConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false), &weights_info.clone()->set_is_resizable(false), &biases_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info, act_info));
Georgios Pinitas631c41a2017-12-06 11:53:03 +0000245 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000246}
SiCong Li1b2f8682023-01-04 10:04:26 +0000247// clang-format on
248// *INDENT-ON*
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000249
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100250template <typename T>
251using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000252template <typename T>
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000253using CLDirectConvolutionLayerMixedDataLayoutFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T, true>;
254template <typename T>
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000255using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000256template <typename T>
257using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
258template <typename T>
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000259using CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T, true>;
260template <typename T>
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000261using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100262
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000263TEST_SUITE(NHWC)
SiCong Li1b2f8682023-01-04 10:04:26 +0000264// *INDENT-OFF*
265// clang-format off
266DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
267 framework::dataset::make("InputInfo", {
268 TensorInfo(TensorShape(2U, 27U, 13U), 1, DataType::F32, DataLayout::NHWC), // Arbitrary weight sizes for NHWC are supported
269 TensorInfo(TensorShape(2U, 27U, 13U), 1, DataType::F32, DataLayout::NHWC), // Non-rectangular weights dimensions for NHWC are supported
270 TensorInfo(TensorShape(2U, 27U, 13U), 1, DataType::F32, DataLayout::NHWC), // Strides > 2 for any kernel sizes for NHWC are supported
271 }),
272 framework::dataset::make("WeightsInfo",{
273 TensorInfo(TensorShape(2U, 13U, 13U, 4U), 1, DataType::F32, DataLayout::NHWC),
274 TensorInfo(TensorShape(2U, 5U, 3U, 4U), 1, DataType::F32, DataLayout::NHWC),
275 TensorInfo(TensorShape(2U, 3U, 3U, 4U), 1, DataType::F32, DataLayout::NHWC),
276 })),
277 framework::dataset::make("BiasesInfo",{
278 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NHWC),
279 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NHWC),
280 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NHWC),
281 })),
282 framework::dataset::make("OutputInfo",{
283 TensorInfo(TensorShape(4U, 15U, 1U), 1, DataType::F32, DataLayout::NHWC),
284 TensorInfo(TensorShape(4U, 23U, 11U), 1, DataType::F32, DataLayout::NHWC),
285 TensorInfo(TensorShape(4U, 9U, 4U), 1, DataType::F32, DataLayout::NHWC),
286 })),
287 framework::dataset::make("ConvInfo", {
288 PadStrideInfo(1, 1, 0, 0),
289 PadStrideInfo(1, 1, 0, 0),
290 PadStrideInfo(3, 3, 0, 0),
291 })),
292 framework::dataset::make("ActivationInfo",
293{
294 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
295 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
296 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
297})),
298 framework::dataset::make("Expected", { true, true, true })),
299 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
300{
301 bool is_valid = bool(CLDirectConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false), &weights_info.clone()->set_is_resizable(false), &biases_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info, act_info));
302 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
303}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000304TEST_SUITE(FP16)
305FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT,
306 combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100307 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
308 TensorShape(19U, 5U, 16U, 4U),
309 TensorShape(13U, 5U, 17U, 2U),
310 TensorShape(32U, 37U, 13U) } ),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000311 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
312 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
313 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
314 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
315 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
Gian Marco Iodice5c9eed82021-03-19 11:26:20 +0000316 framework::dataset::make("NumKernels", { 17, 3, 1, 19 })),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000317 framework::dataset::make("DataType", DataType::F16)),
318 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
319 framework::dataset::make("DataLayout", DataLayout::NHWC)))
320{
321 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
322}
323
324FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY,
325 combine(combine(combine(zip(zip(zip(zip(zip(zip(
326 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
327 framework::dataset::make("StrideX", { 1 })),
328 framework::dataset::make("StrideY", { 1 })),
329 framework::dataset::make("PadX", { 1 })),
330 framework::dataset::make("PadY", { 1 })),
331 framework::dataset::make("KernelSize", { 9 })),
332 framework::dataset::make("NumKernels", { 3 })),
333 framework::dataset::make("DataType", DataType::F16)),
334 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::IDENTITY) )),
335 framework::dataset::make("DataLayout", DataLayout::NHWC)))
336{
337 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
338}
339
340TEST_SUITE_END() // FP16
341
342TEST_SUITE(FP32)
343FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT,
344 combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100345 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
346 TensorShape(19U, 5U, 16U, 4U),
347 TensorShape(13U, 5U, 17U, 2U),
348 TensorShape(32U, 37U, 13U) } ),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000349 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
350 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
351 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
352 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
353 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
Gian Marco Iodice5c9eed82021-03-19 11:26:20 +0000354 framework::dataset::make("NumKernels", { 17, 3, 1, 19 })),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000355 framework::dataset::make("DataType", DataType::F32)),
356 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
357 framework::dataset::make("DataLayout", DataLayout::NHWC)))
358{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100359 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000360}
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000361FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerMixedDataLayoutFixture<float>, framework::DatasetMode::PRECOMMIT,
362 combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100363 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
364 TensorShape(19U, 5U, 16U, 4U),
365 TensorShape(13U, 5U, 17U, 2U),
366 TensorShape(32U, 37U, 13U) } ),
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000367 framework::dataset::make("StrideX", { 1 })),
368 framework::dataset::make("StrideY", { 2 })),
369 framework::dataset::make("PadX", { 1 })),
370 framework::dataset::make("PadY", { 3 })),
371 framework::dataset::make("KernelSize", { 3 })),
372 framework::dataset::make("NumKernels", { 3 })),
373 framework::dataset::make("DataType", DataType::F32)),
374 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
375 framework::dataset::make("DataLayout", DataLayout::NHWC)))
376{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100377 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000378}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000379FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY,
380 combine(combine(combine(zip(zip(zip(zip(zip(zip(
381 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
382 framework::dataset::make("StrideX", { 1 })),
383 framework::dataset::make("StrideY", { 1 })),
384 framework::dataset::make("PadX", { 1 })),
385 framework::dataset::make("PadY", { 1 })),
386 framework::dataset::make("KernelSize", { 9 })),
387 framework::dataset::make("NumKernels", { 3 })),
388 framework::dataset::make("DataType", DataType::F32)),
389 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::IDENTITY) )),
390 framework::dataset::make("DataLayout", DataLayout::NHWC)))
391{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100392 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000393}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000394TEST_SUITE_END() // FP32
395
396TEST_SUITE(Quantized)
397TEST_SUITE(QASYMM8)
398FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
399 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100400 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
401 TensorShape(19U, 5U, 16U, 4U),
402 TensorShape(13U, 5U, 17U, 2U),
403 TensorShape(32U, 37U, 13U) } ),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000404 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
405 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
406 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
407 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
408 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
409 framework::dataset::make("NumKernels", { 7, 3, 1, 3 })),
410 framework::dataset::make("DataType", DataType::QASYMM8)),
411 framework::dataset::make("QuantizationInfo", QuantizationInfo(1.1f / 255, 10))),
412 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
413 framework::dataset::make("DataLayout", DataLayout::NHWC)))
414{
415 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
416}
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000417FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
418 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100419 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
420 TensorShape(19U, 5U, 16U, 4U),
421 TensorShape(13U, 5U, 17U, 2U),
422 TensorShape(32U, 37U, 13U) } ),
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000423 framework::dataset::make("StrideX", { 1 })),
424 framework::dataset::make("StrideY", { 2 })),
425 framework::dataset::make("PadX", { 1 })),
426 framework::dataset::make("PadY", { 1 })),
427 framework::dataset::make("KernelSize", { 3 })),
428 framework::dataset::make("NumKernels", { 3 })),
429 framework::dataset::make("DataType", DataType::QASYMM8)),
430 framework::dataset::make("QuantizationInfo", QuantizationInfo(1.1f / 255, 10))),
431 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
432 framework::dataset::make("DataLayout", DataLayout::NHWC)))
433{
434 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
435}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000436FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
437 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
438 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
439 framework::dataset::make("StrideX", { 1 })),
440 framework::dataset::make("StrideY", { 1 })),
441 framework::dataset::make("PadX", { 1 })),
442 framework::dataset::make("PadY", { 1 })),
443 framework::dataset::make("KernelSize", { 9 })),
444 framework::dataset::make("NumKernels", { 3 })),
445 framework::dataset::make("DataType", DataType::QASYMM8)),
446 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
447 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
448 framework::dataset::make("DataLayout", DataLayout::NHWC)))
449{
450 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
451}
452
453TEST_SUITE_END() // QASYMM8
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000454TEST_SUITE(QASYMM8_SIGNED)
455FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
456 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100457 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
458 TensorShape(19U, 5U, 16U, 4U),
459 TensorShape(13U, 5U, 17U, 2U),
460 TensorShape(32U, 37U, 13U) } ),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000461 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
462 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
463 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
464 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
465 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
466 framework::dataset::make("NumKernels", { 7, 3, 1, 3 })),
467 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
468 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
469 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
470 framework::dataset::make("DataLayout", DataLayout::NHWC)))
471{
472 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
473}
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000474FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
475 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
Gian Marco Iodice2ba39b62021-05-07 09:21:47 +0100476 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 23U),
477 TensorShape(19U, 5U, 16U, 4U),
478 TensorShape(13U, 5U, 17U, 2U),
479 TensorShape(32U, 37U, 13U) } ),
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000480 framework::dataset::make("StrideX", { 1 })),
481 framework::dataset::make("StrideY", { 1 })),
482 framework::dataset::make("PadX", { 1 })),
483 framework::dataset::make("PadY", { 1 })),
484 framework::dataset::make("KernelSize", { 3 })),
485 framework::dataset::make("NumKernels", { 3 })),
486 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
487 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
488 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
489 framework::dataset::make("DataLayout", DataLayout::NHWC)))
490{
491 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
492}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000493FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
494 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
495 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
496 framework::dataset::make("StrideX", { 1 })),
497 framework::dataset::make("StrideY", { 1 })),
498 framework::dataset::make("PadX", { 1 })),
499 framework::dataset::make("PadY", { 1 })),
500 framework::dataset::make("KernelSize", { 9 })),
501 framework::dataset::make("NumKernels", { 3 })),
502 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
503 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
504 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
505 framework::dataset::make("DataLayout", DataLayout::NHWC)))
506{
507 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
508}
509TEST_SUITE_END() // QASYMM8_SIGNED
510TEST_SUITE_END() // Quantized
511TEST_SUITE_END() // NHWC
512
SiCong Li1b2f8682023-01-04 10:04:26 +0000513TEST_SUITE(NCHW)
514DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
515 framework::dataset::make("InputInfo", {
516 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, DataLayout::NCHW), // Unsupported kernel width
517 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, DataLayout::NCHW), // Non-rectangular weights dimensions are unsupported
518 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32, DataLayout::NCHW) // Unsupported stride
519 }),
520 framework::dataset::make("WeightsInfo",{
521 TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32, DataLayout::NCHW),
522 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32, DataLayout::NCHW),
523 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32, DataLayout::NCHW)
524 })),
525 framework::dataset::make("BiasesInfo",{
526 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NCHW),
527 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NCHW),
528 TensorInfo(TensorShape(4U), 1, DataType::F32, DataLayout::NCHW)
529 })),
530 framework::dataset::make("OutputInfo",{
531 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, DataLayout::NCHW),
532 TensorInfo(TensorShape(23U, 11U, 4U), 1, DataType::F32, DataLayout::NCHW),
533 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32, DataLayout::NCHW)
534 })),
535 framework::dataset::make("ConvInfo", {
536 PadStrideInfo(1, 1, 0, 0),
537 PadStrideInfo(1, 1, 0, 0),
538 PadStrideInfo(3, 3, 0, 0)
539 })),
540 framework::dataset::make("ActivationInfo",
541{
542 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
543 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
544 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
545})),
546 framework::dataset::make("Expected", { false, false, false})),
547 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
548{
549 bool is_valid = bool(CLDirectConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false), &weights_info.clone()->set_is_resizable(false), &biases_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info, act_info));
550 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
551}
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000552// clang-format on
553// *INDENT-ON*
SiCong Li1b2f8682023-01-04 10:04:26 +0000554
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100555TEST_SUITE(Float)
556TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000557FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
558 ActivationFunctionsDataset),
559 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100560{
561 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100562 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100563}
Michalis Spyrou064add62018-11-01 18:14:27 +0000564FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
565 ActivationFunctionsDataset),
566 framework::dataset::make("DataLayout", DataLayout::NCHW)))
567{
568 // Validate output
569 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
570}
571TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100572
573TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000574FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
575 DataType::F32)),
576 ActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000577 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100578{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100579 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100580}
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100581FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerMixedDataLayoutFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit,
582 framework::dataset::make("DataType",
583 DataType::F32)),
584 ActivationFunctionsDataset),
585 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000586{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100587 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000588}
Michalis Spyrou064add62018-11-01 18:14:27 +0000589FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
590 ActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000591 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000592{
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100593 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Michalis Spyrou064add62018-11-01 18:14:27 +0000594}
595TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000596
597TEST_SUITE(FP32_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000598FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000599 framework::dataset::make("DataType", DataType::F32)),
600 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000601{
602 // Validate output
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100603 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.0, abs_tolerance_f32);
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000604}
Michalis Spyrou064add62018-11-01 18:14:27 +0000605TEST_SUITE_END() // FP32_CustomDataset
606TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100607
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100608/// @note: Every quantized test has a version with or without activation because the quantization info given is
609/// ignored when there is no activation. Instead of using the same quantization information for all the tensors, the
610/// fixture generates separate quantization info for each input and the output tensor.
611/// When we can also support dynamic quantization with the presence of activation, these two versions should be merged
612/// again, with the explicitly specified quantization info removed
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000613const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
614{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000615 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
616 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
617});
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100618const auto NoActivation = framework::dataset::make("ActivationInfo",
619{
620 ActivationLayerInfo()
621});
622const auto IgnoredQuantizationInfo = framework::dataset::make("IgnoredQuantizationInfo",
623{
624 QuantizationInfo()
625});
Chunosovd621bca2017-11-03 17:33:15 +0700626TEST_SUITE(Quantized)
627TEST_SUITE(QASYMM8)
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100628FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit,
629 framework::dataset::make("DataType", DataType::QASYMM8),
630 IgnoredQuantizationInfo,
631 NoActivation,
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000632 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
633{
634 // Validate output
635 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
636}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100637FIXTURE_DATA_TEST_CASE(RunMixedDataLayoutWithActivation, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit,
638 framework::dataset::make("DataType", DataType::QASYMM8),
639 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) }),
640 QuantizedActivationFunctionsDataset,
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000641 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100642{
643 // Validate output
644 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
645}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100646FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit,
647 framework::dataset::make("DataType", DataType::QASYMM8),
648 IgnoredQuantizationInfo,
649 NoActivation,
650 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
651{
652 // Validate output
653 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
654}
655FIXTURE_DATA_TEST_CASE(RunSmallWithActivation, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit,
656 framework::dataset::make("DataType", DataType::QASYMM8),
657 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) }),
658 QuantizedActivationFunctionsDataset,
659 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
660{
661 // Validate output
662 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
663}
664FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit_9x9,
Giorgio Arenae620a832020-02-17 16:33:20 +0000665 framework::dataset::make("DataType",
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100666 DataType::QASYMM8),
667 IgnoredQuantizationInfo,
668 NoActivation,
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000669 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000670{
671 // Validate output
672 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
673}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100674FIXTURE_DATA_TEST_CASE(RunSmall9x9WithActivation, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(data_precommit_9x9,
Giorgio Arenae620a832020-02-17 16:33:20 +0000675 framework::dataset::make("DataType",
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100676 DataType::QASYMM8),
677 framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) }),
678 QuantizedActivationFunctionsDataset,
Giorgio Arenae620a832020-02-17 16:33:20 +0000679 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100680{
681 // Validate output
682 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
683}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100684FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(data_nightly, framework::dataset::make("DataType",
685 DataType::QASYMM8),
686 IgnoredQuantizationInfo,
687 NoActivation,
688 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
689{
690 // Validate output
691 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
692}
693FIXTURE_DATA_TEST_CASE(RunLargeWithActivation, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(data_nightly, framework::dataset::make("DataType",
694 DataType::QASYMM8),
695 framework::dataset::make("QuantizationInfoIf", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) }),
696 QuantizedActivationFunctionsDataset,
697 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
698{
699 // Validate output
700 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
701}
702FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(data_nightly_9x9,
703 framework::dataset::make("DataType",
704 DataType::QASYMM8),
705 IgnoredQuantizationInfo,
706 NoActivation,
707 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
708{
709 // Validate output
710 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
711}
712FIXTURE_DATA_TEST_CASE(RunLarge9x9WithActivation, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(data_nightly_9x9,
713 framework::dataset::make("DataType",
714 DataType::QASYMM8),
715 framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) }),
716 QuantizedActivationFunctionsDataset,
717 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
718{
719 // Validate output
720 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
721}
722FIXTURE_DATA_TEST_CASE(CustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
723 combine(datasets::DirectConvolutionLayerDataset(),
724 framework::dataset::make("DataType", DataType::QASYMM8),
725 IgnoredQuantizationInfo,
726 NoActivation,
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000727 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000728{
729 // Validate output
730 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
731}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100732FIXTURE_DATA_TEST_CASE(CustomDatasetWithActivation, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
733 combine(datasets::DirectConvolutionLayerDataset(),
734 framework::dataset::make("DataType", DataType::QASYMM8),
735 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) }),
736 QuantizedActivationFunctionsDataset,
737 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
738{
739 // Validate output
740 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
741}
742TEST_SUITE_END() // QASYMM8
Sheri Zhang681f2d42020-02-20 11:23:08 +0000743
744TEST_SUITE(QASYMM8_SIGNED)
745
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100746FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit, framework::dataset::make("DataType",
747 DataType::QASYMM8_SIGNED),
748 IgnoredQuantizationInfo,
749 NoActivation,
Giorgio Arenae620a832020-02-17 16:33:20 +0000750 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000751{
752 // Validate output
753 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
754}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100755FIXTURE_DATA_TEST_CASE(RunSmallWithActivation, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit, framework::dataset::make("DataType",
756 DataType::QASYMM8_SIGNED),
757 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, -10) }),
758 QuantizedActivationFunctionsDataset,
759 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
760{
761 // Validate output
762 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
763}
764FIXTURE_DATA_TEST_CASE(RunMixedDataLayout, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit,
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100765 framework::dataset::make("DataType",
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100766 DataType::QASYMM8_SIGNED),
767 IgnoredQuantizationInfo,
768 NoActivation,
Gunes Bayir38ce29d2021-08-04 12:45:33 +0100769 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Manuel Bottinica62c6f2021-03-23 11:50:34 +0000770{
771 // Validate output
772 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
773}
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100774FIXTURE_DATA_TEST_CASE(RunMixedDataLayoutWithActivation, CLDirectConvolutionLayerQuantizedMixedDataLayoutFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit,
Sheri Zhang681f2d42020-02-20 11:23:08 +0000775 framework::dataset::make("DataType",
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100776 DataType::QASYMM8_SIGNED),
777 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.1f, -10) }),
778 QuantizedActivationFunctionsDataset,
779 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
780{
781 // Validate output
782 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
783}
784FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit_9x9,
785 framework::dataset::make("DataType",
786 DataType::QASYMM8_SIGNED),
787 IgnoredQuantizationInfo,
788 NoActivation,
789 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
790{
791 // Validate output
792 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
793}
794FIXTURE_DATA_TEST_CASE(RunSmall9x9WithActivation, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(data_precommit_9x9,
795 framework::dataset::make("DataType",
796 DataType::QASYMM8_SIGNED),
797 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) }),
798 QuantizedActivationFunctionsDataset,
Giorgio Arenae620a832020-02-17 16:33:20 +0000799 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000800{
801 // Validate output
802 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
803}
804
805FIXTURE_DATA_TEST_CASE(RunCustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
Gunes Bayirdfcd41a2023-10-11 09:56:05 +0100806 combine(datasets::DirectConvolutionLayerDataset(),
807 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED),
808 IgnoredQuantizationInfo,
809 NoActivation,
810 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
811{
812 // Validate output
813 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
814}
815
816FIXTURE_DATA_TEST_CASE(RunCustomDatasetWithActivation, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
817 combine(datasets::DirectConvolutionLayerDataset(),
818 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED),
819 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) }),
820 QuantizedActivationFunctionsDataset,
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000821 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000822{
823 // Validate output
824 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
825}
826
827TEST_SUITE_END() // QASYMM8_SIGNED
Michalis Spyrou064add62018-11-01 18:14:27 +0000828TEST_SUITE_END() // Quantized
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000829TEST_SUITE_END() // NCHW
Michalis Spyrou064add62018-11-01 18:14:27 +0000830TEST_SUITE_END() // DirectConvolutionLayer
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000831TEST_SUITE_END() // CL
832
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100833} // namespace validation
834} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000835} // namespace arm_compute