blob: 4671d8c3ecd5ca8a65c6f2d7a28a27741dff7295 [file] [log] [blame]
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01001/*
Gian Marco Iodice0841ca02021-02-01 14:37:02 +00002 * Copyright (c) 2017-2021 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
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
Giorgio Arena89de1182021-02-04 15:59:03 +000046RelativeTolerance<half> tolerance_fp16(half(0.2)); /**< Tolerance for floating point tests */
47RelativeTolerance<float> tolerance_fp32(0.05f); /**< Tolerance for floating point tests */
48constexpr float tolerance_num = 0.07f; /**< Tolerance number */
49constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance for quantized tests */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010050
Michalis Spyrou45091732019-05-13 17:41:01 +010051const auto data_strides = combine(framework::dataset::make("StrideX", 1, 3), framework::dataset::make("StrideY", 1, 3));
52const auto data_strides_small = combine(framework::dataset::make("StrideX", 1), framework::dataset::make("StrideY", 1));
53const auto data_ksize_one = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 1)));
54const auto data_ksize_one_small = combine(framework::dataset::make("PadX", 0), combine(framework::dataset::make("PadY", 0), framework::dataset::make("KernelSize", 1)));
55const auto data_ksize_three = combine(framework::dataset::make("PadX", 0, 2), combine(framework::dataset::make("PadY", 0, 2), framework::dataset::make("KernelSize", 3)));
56const auto data_ksize_five = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 5)));
57const auto data_ksize_nine = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 9)));
58const 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 +010059
Michalis Spyrou45091732019-05-13 17:41:01 +010060const auto data_all_kernels = concat(concat(data_ksize_one, data_ksize_three), data_ksize_five);
61
62const auto data = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_all_kernels));
63const auto data9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_ksize_nine));
64const auto data_small = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_one_small));
65const auto data_small9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_nine_small));
Michalis Spyrou064add62018-11-01 18:14:27 +000066
67/** Direct convolution nightly data set. */
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +010068const auto data_nightly = combine(data, framework::dataset::make("NumKernels", { 1, 4 }));
69const auto data_nightly_9x9 = combine(data9x9, framework::dataset::make("NumKernels", { 1, 4 }));
70const auto data_nightly_usecase = combine(framework::dataset::make("InputShape", { TensorShape{ 3U, 800U, 800U } }),
71 combine(framework::dataset::make("StrideX", { 1 }),
72 combine(framework::dataset::make("StrideY", { 1 }),
73 combine(framework::dataset::make("PadX", { 4 }),
74 combine(framework::dataset::make("PadY", { 4 }),
75 combine(framework::dataset::make("KernelSize", 9),
76 framework::dataset::make("NumKernels", { 16 })))))));
77
Michalis Spyrou064add62018-11-01 18:14:27 +000078/** Direct convolution precommit data set. */
Michalis Spyrou45091732019-05-13 17:41:01 +010079const auto data_precommit = combine(data_small, framework::dataset::make("NumKernels", { 1 }));
80const auto data_precommit_9x9 = combine(data_small9x9, framework::dataset::make("NumKernels", { 1 }));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010081
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000082/** Activation function Dataset*/
83const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
Michalis Spyrou5ce99a22019-01-25 14:17:49 +000084{ ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f) });
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010085} // namespace
86
87TEST_SUITE(CL)
88TEST_SUITE(DirectConvolutionLayer)
89
Georgios Pinitas30902ed2017-11-14 15:32:57 +000090// *INDENT-OFF*
91// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000092DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010093 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
94 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
95 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
96 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
97 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
98 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
99 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
100 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
101 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
102 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
103 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000104 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100105 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
106 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
Michalis Spyrou45091732019-05-13 17:41:01 +0100107 TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100108 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
109 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32),
110 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
111 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
112 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
113 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
114 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
115 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000116 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100117 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32),
118 TensorInfo(TensorShape(4U), 1, DataType::F32),
119 TensorInfo(TensorShape(4U), 1, DataType::F32),
120 TensorInfo(TensorShape(4U), 1, DataType::F32),
121 TensorInfo(TensorShape(4U), 1, DataType::F32),
122 TensorInfo(TensorShape(4U), 1, DataType::F32),
123 TensorInfo(TensorShape(3U), 1, DataType::F32),
124 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
125 TensorInfo(TensorShape(4U), 1, DataType::F32),
126 TensorInfo(TensorShape(4U), 1, DataType::F32),
127 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000128 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100129 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
130 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
131 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
132 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
133 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
134 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
135 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
136 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
137 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
138 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
139 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000140 })),
141 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
142 PadStrideInfo(1, 1, 0, 0),
143 PadStrideInfo(1, 1, 0, 0),
144 PadStrideInfo(1, 1, 0, 0),
145 PadStrideInfo(1, 1, 0, 0),
146 PadStrideInfo(3, 3, 0, 0),
147 PadStrideInfo(1, 1, 0, 0),
148 PadStrideInfo(1, 1, 0, 0),
149 PadStrideInfo(1, 1, 0, 0),
150 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000151 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000152 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000153 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000154{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000155 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
156})),
157 framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
158 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
159{
160 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 +0000161 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000162}
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000163
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100164template <typename T>
165using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000166template <typename T>
167using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000168template <typename T>
169using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
170template <typename T>
171using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100172
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000173TEST_SUITE(NHWC)
174TEST_SUITE(FP16)
175FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT,
176 combine(combine(combine(zip(zip(zip(zip(zip(zip(
177 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 2U),
178 TensorShape(9U, 5U, 6U, 4U),
179 TensorShape(3U, 5U, 7U, 2U),
180 TensorShape(32U, 37U, 3U) } ),
181 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
182 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
183 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
184 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
185 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
Gian Marco Iodice5c9eed82021-03-19 11:26:20 +0000186 framework::dataset::make("NumKernels", { 17, 3, 1, 19 })),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000187 framework::dataset::make("DataType", DataType::F16)),
188 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
189 framework::dataset::make("DataLayout", DataLayout::NHWC)))
190{
191 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
192}
193
194FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY,
195 combine(combine(combine(zip(zip(zip(zip(zip(zip(
196 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
197 framework::dataset::make("StrideX", { 1 })),
198 framework::dataset::make("StrideY", { 1 })),
199 framework::dataset::make("PadX", { 1 })),
200 framework::dataset::make("PadY", { 1 })),
201 framework::dataset::make("KernelSize", { 9 })),
202 framework::dataset::make("NumKernels", { 3 })),
203 framework::dataset::make("DataType", DataType::F16)),
204 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::IDENTITY) )),
205 framework::dataset::make("DataLayout", DataLayout::NHWC)))
206{
207 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
208}
209
210TEST_SUITE_END() // FP16
211
212TEST_SUITE(FP32)
213FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT,
214 combine(combine(combine(zip(zip(zip(zip(zip(zip(
215 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 2U),
216 TensorShape(9U, 5U, 6U, 4U),
217 TensorShape(3U, 5U, 7U, 2U),
218 TensorShape(32U, 37U, 3U) } ),
219 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
220 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
221 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
222 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
223 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
Gian Marco Iodice5c9eed82021-03-19 11:26:20 +0000224 framework::dataset::make("NumKernels", { 17, 3, 1, 19 })),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000225 framework::dataset::make("DataType", DataType::F32)),
226 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
227 framework::dataset::make("DataLayout", DataLayout::NHWC)))
228{
229 validate(CLAccessor(_target), _reference, tolerance_fp32);
230}
231
232FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY,
233 combine(combine(combine(zip(zip(zip(zip(zip(zip(
234 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
235 framework::dataset::make("StrideX", { 1 })),
236 framework::dataset::make("StrideY", { 1 })),
237 framework::dataset::make("PadX", { 1 })),
238 framework::dataset::make("PadY", { 1 })),
239 framework::dataset::make("KernelSize", { 9 })),
240 framework::dataset::make("NumKernels", { 3 })),
241 framework::dataset::make("DataType", DataType::F32)),
242 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::IDENTITY) )),
243 framework::dataset::make("DataLayout", DataLayout::NHWC)))
244{
245 validate(CLAccessor(_target), _reference, tolerance_fp32);
246}
247
248TEST_SUITE_END() // FP32
249
250TEST_SUITE(Quantized)
251TEST_SUITE(QASYMM8)
252FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
253 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
254 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 2U),
255 TensorShape(9U, 5U, 6U, 4U),
256 TensorShape(3U, 5U, 7U, 2U),
257 TensorShape(32U, 37U, 3U) } ),
258 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
259 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
260 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
261 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
262 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
263 framework::dataset::make("NumKernels", { 7, 3, 1, 3 })),
264 framework::dataset::make("DataType", DataType::QASYMM8)),
265 framework::dataset::make("QuantizationInfo", QuantizationInfo(1.1f / 255, 10))),
266 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
267 framework::dataset::make("DataLayout", DataLayout::NHWC)))
268{
269 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
270}
271
272FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
273 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
274 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
275 framework::dataset::make("StrideX", { 1 })),
276 framework::dataset::make("StrideY", { 1 })),
277 framework::dataset::make("PadX", { 1 })),
278 framework::dataset::make("PadY", { 1 })),
279 framework::dataset::make("KernelSize", { 9 })),
280 framework::dataset::make("NumKernels", { 3 })),
281 framework::dataset::make("DataType", DataType::QASYMM8)),
282 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
283 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
284 framework::dataset::make("DataLayout", DataLayout::NHWC)))
285{
286 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
287}
288
289TEST_SUITE_END() // QASYMM8
290//
291TEST_SUITE(QASYMM8_SIGNED)
292FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT,
293 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
294 framework::dataset::make("InputShape", { TensorShape(27U, 13U, 2U),
295 TensorShape(9U, 5U, 6U, 4U),
296 TensorShape(3U, 5U, 7U, 2U),
297 TensorShape(32U, 37U, 3U) } ),
298 framework::dataset::make("StrideX", { 1, 3, 1, 1 })),
299 framework::dataset::make("StrideY", { 1, 3, 2, 1 })),
300 framework::dataset::make("PadX", { 1, 3, 0, 4 })),
301 framework::dataset::make("PadY", { 1, 3, 0, 4 })),
302 framework::dataset::make("KernelSize", { 3, 8, 1, 9 })),
303 framework::dataset::make("NumKernels", { 7, 3, 1, 3 })),
304 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
305 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
306 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
307 framework::dataset::make("DataLayout", DataLayout::NHWC)))
308{
309 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
310}
311
312FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
313 combine(combine(combine(combine(zip(zip(zip(zip(zip(zip(
314 framework::dataset::make("InputShape", { TensorShape(800U, 800U, 3U) } ),
315 framework::dataset::make("StrideX", { 1 })),
316 framework::dataset::make("StrideY", { 1 })),
317 framework::dataset::make("PadX", { 1 })),
318 framework::dataset::make("PadY", { 1 })),
319 framework::dataset::make("KernelSize", { 9 })),
320 framework::dataset::make("NumKernels", { 3 })),
321 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
322 framework::dataset::make("QuantizationInfo", QuantizationInfo(2.f / 255, 10))),
323 framework::dataset::make("ActivationInfo", ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU) )),
324 framework::dataset::make("DataLayout", DataLayout::NHWC)))
325{
326 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
327}
328TEST_SUITE_END() // QASYMM8_SIGNED
329TEST_SUITE_END() // Quantized
330TEST_SUITE_END() // NHWC
331
332// clang-format on
333// *INDENT-ON*
334TEST_SUITE(NCHW)
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100335TEST_SUITE(Float)
336TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000337FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
338 ActivationFunctionsDataset),
339 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100340{
341 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100342 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100343}
Michalis Spyrou064add62018-11-01 18:14:27 +0000344FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
345 ActivationFunctionsDataset),
346 framework::dataset::make("DataLayout", DataLayout::NCHW)))
347{
348 // Validate output
349 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
350}
351TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100352
353TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000354FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
355 DataType::F32)),
356 ActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000357 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100358{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100359 validate(CLAccessor(_target), _reference, tolerance_fp32);
360}
Michalis Spyrou064add62018-11-01 18:14:27 +0000361FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
362 ActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000363 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000364{
365 validate(CLAccessor(_target), _reference, tolerance_fp32);
366}
367TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000368
369TEST_SUITE(FP32_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000370FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000371 framework::dataset::make("DataType", DataType::F32)),
372 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000373{
374 // Validate output
375 validate(CLAccessor(_target), _reference, tolerance_fp32);
376}
Michalis Spyrou064add62018-11-01 18:14:27 +0000377TEST_SUITE_END() // FP32_CustomDataset
378TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100379
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000380const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
381{
382 ActivationLayerInfo(),
383 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
384 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
385});
Chunosovd621bca2017-11-03 17:33:15 +0700386TEST_SUITE(Quantized)
387TEST_SUITE(QASYMM8)
Giorgio Arenae620a832020-02-17 16:33:20 +0000388FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit,
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100389 framework::dataset::make("DataType",
390 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100391 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000392 QuantizedActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000393 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100394{
395 // Validate output
396 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
397}
Giorgio Arenae620a832020-02-17 16:33:20 +0000398FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit_9x9,
399 framework::dataset::make("DataType",
400 DataType::QASYMM8)),
Manuel Bottini136174a2020-11-24 13:04:19 +0000401 framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000402 QuantizedActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000403 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000404{
405 // Validate output
406 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
407}
Giorgio Arenae620a832020-02-17 16:33:20 +0000408FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data_nightly, framework::dataset::make("DataType",
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100409 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100410 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000411 QuantizedActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000412 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Giorgio Arenae620a832020-02-17 16:33:20 +0000413{
414 // Validate output
415 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
416}
417FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data_nightly_9x9,
418 framework::dataset::make("DataType",
419 DataType::QASYMM8)),
Manuel Bottini136174a2020-11-24 13:04:19 +0000420 framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000421 QuantizedActivationFunctionsDataset),
422 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100423{
424 // Validate output
425 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
426}
427
Michalis Spyrou064add62018-11-01 18:14:27 +0000428TEST_SUITE_END() // QASYMM8
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000429
430TEST_SUITE(QASYMM8_CustomDataset)
Giorgio Arenae620a832020-02-17 16:33:20 +0000431FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
432 combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
433 framework::dataset::make("DataType", DataType::QASYMM8)),
434 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
435 QuantizedActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000436 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000437{
438 // Validate output
439 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
440}
Michalis Spyrou064add62018-11-01 18:14:27 +0000441TEST_SUITE_END() // QASYMM8_CustomDataset
Sheri Zhang681f2d42020-02-20 11:23:08 +0000442
443TEST_SUITE(QASYMM8_SIGNED)
444
Giorgio Arenae620a832020-02-17 16:33:20 +0000445FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit, framework::dataset::make("DataType",
Sheri Zhang681f2d42020-02-20 11:23:08 +0000446 DataType::QASYMM8_SIGNED)),
447 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, -10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000448 QuantizedActivationFunctionsDataset),
449 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000450{
451 // Validate output
452 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
453}
454
Giorgio Arenae620a832020-02-17 16:33:20 +0000455FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit_9x9,
Sheri Zhang681f2d42020-02-20 11:23:08 +0000456 framework::dataset::make("DataType",
457 DataType::QASYMM8_SIGNED)),
458 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000459 QuantizedActivationFunctionsDataset),
460 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000461{
462 // Validate output
463 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
464}
465
466FIXTURE_DATA_TEST_CASE(RunCustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
Giorgio Arenae620a832020-02-17 16:33:20 +0000467 combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
468 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
469 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
470 QuantizedActivationFunctionsDataset),
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000471 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000472{
473 // Validate output
474 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
475}
476
477TEST_SUITE_END() // QASYMM8_SIGNED
Michalis Spyrou064add62018-11-01 18:14:27 +0000478TEST_SUITE_END() // Quantized
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000479TEST_SUITE_END() // NCHW
Michalis Spyrou064add62018-11-01 18:14:27 +0000480TEST_SUITE_END() // DirectConvolutionLayer
Gian Marco Iodice0841ca02021-02-01 14:37:02 +0000481TEST_SUITE_END() // CL
482
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100483} // namespace validation
484} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000485} // namespace arm_compute