• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2020 Arm Limited.
3  *
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"
28 #include "tests/CL/CLAccessor.h"
29 #include "tests/PaddingCalculator.h"
30 #include "tests/datasets/DirectConvolutionLayerDataset.h"
31 #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"
37 
38 namespace arm_compute
39 {
40 namespace test
41 {
42 namespace validation
43 {
44 namespace
45 {
46 RelativeTolerance<half>              tolerance_fp16(half(0.2));   /**< Tolerance for floating point tests */
47 RelativeTolerance<float>             tolerance_fp32(0.05f);       /**< Tolerance for floating point tests */
48 AbsoluteTolerance<float>             tolerance_fp32_abs(0.0003f); /**< Absolute Tolerance for floating point tests */
49 constexpr float                      tolerance_num = 0.07f;       /**< Tolerance number */
50 constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1);        /**< Tolerance for quantized tests */
51 
52 const auto data_strides          = combine(framework::dataset::make("StrideX", 1, 3), framework::dataset::make("StrideY", 1, 3));
53 const auto data_strides_small    = combine(framework::dataset::make("StrideX", 1), framework::dataset::make("StrideY", 1));
54 const auto data_ksize_one        = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 1)));
55 const auto data_ksize_one_small  = combine(framework::dataset::make("PadX", 0), combine(framework::dataset::make("PadY", 0), framework::dataset::make("KernelSize", 1)));
56 const auto data_ksize_three      = combine(framework::dataset::make("PadX", 0, 2), combine(framework::dataset::make("PadY", 0, 2), framework::dataset::make("KernelSize", 3)));
57 const auto data_ksize_five       = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 5)));
58 const auto data_ksize_nine       = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 9)));
59 const auto data_ksize_nine_small = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 9)));
60 
61 const auto data_all_kernels = concat(concat(data_ksize_one, data_ksize_three), data_ksize_five);
62 
63 const auto data          = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_all_kernels));
64 const auto data9x9       = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_ksize_nine));
65 const auto data_small    = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_one_small));
66 const auto data_small9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_nine_small));
67 
68 /** Direct convolution nightly data set. */
69 const auto data_nightly         = combine(data, framework::dataset::make("NumKernels", { 1, 4 }));
70 const auto data_nightly_9x9     = combine(data9x9, framework::dataset::make("NumKernels", { 1, 4 }));
71 const auto data_nightly_usecase = combine(framework::dataset::make("InputShape", { TensorShape{ 3U, 800U, 800U } }),
72                                           combine(framework::dataset::make("StrideX", { 1 }),
73                                                   combine(framework::dataset::make("StrideY", { 1 }),
74                                                           combine(framework::dataset::make("PadX", { 4 }),
75                                                                   combine(framework::dataset::make("PadY", { 4 }),
76                                                                           combine(framework::dataset::make("KernelSize", 9),
77                                                                                   framework::dataset::make("NumKernels", { 16 })))))));
78 
79 /** Direct convolution precommit data set. */
80 const auto data_precommit     = combine(data_small, framework::dataset::make("NumKernels", { 1 }));
81 const auto data_precommit_9x9 = combine(data_small9x9, framework::dataset::make("NumKernels", { 1 }));
82 
83 /** Activation function Dataset*/
84 const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
85 { ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f) });
86 } // namespace
87 
88 TEST_SUITE(CL)
TEST_SUITE(DirectConvolutionLayer)89 TEST_SUITE(DirectConvolutionLayer)
90 
91 // *INDENT-OFF*
92 // clang-format off
93 DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
94                framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
95                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
96                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
97                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
98                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
99                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
100                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
101                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
102                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
103                                                        TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
104                                                        TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
105                                                      }),
106                framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
107                                                         TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
108                                                         TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32),
109                                                         TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
110                                                         TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 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(3U, 3U, 2U, 4U), 1, DataType::F32),
116                                                         TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
117                                                      })),
118                framework::dataset::make("BiasesInfo",{ 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(4U), 1, DataType::F32),
124                                                        TensorInfo(TensorShape(3U), 1, DataType::F32),
125                                                        TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
126                                                        TensorInfo(TensorShape(4U), 1, DataType::F32),
127                                                        TensorInfo(TensorShape(4U), 1, DataType::F32),
128                                                        TensorInfo(TensorShape(4U), 1, DataType::F32),
129                                                      })),
130                framework::dataset::make("OutputInfo",{ 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(25U, 11U, 4U), 1, DataType::F32),
138                                                        TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
139                                                        TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
140                                                        TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
141                                                      })),
142                framework::dataset::make("ConvInfo",  { 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(1, 1, 0, 0),
147                                                        PadStrideInfo(3, 3, 0, 0),
148                                                        PadStrideInfo(1, 1, 0, 0),
149                                                        PadStrideInfo(1, 1, 0, 0),
150                                                        PadStrideInfo(1, 1, 0, 0),
151                                                        PadStrideInfo(1, 1, 0, 0),
152                                                        PadStrideInfo(1, 1, 0, 0),
153                                                       })),
154                        framework::dataset::make("ActivationInfo",
155 {
156     ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
157 })),
158                framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
159                input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
160 {
161     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));
162     ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
163 }
164 // clang-format on
165 // *INDENT-ON*
166 
167 template <typename T>
168 using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
169 template <typename T>
170 using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
171 
172 TEST_SUITE(Float)
TEST_SUITE(FP16)173 TEST_SUITE(FP16)
174 FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
175                                                                                                                    ActivationFunctionsDataset),
176                                                                                                                    framework::dataset::make("DataLayout", DataLayout::NCHW)))
177 {
178     // Validate output
179     validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
180 }
181 FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
182                                                                                                                  ActivationFunctionsDataset),
183                                                                                                                  framework::dataset::make("DataLayout", DataLayout::NCHW)))
184 {
185     // Validate output
186     validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
187 }
188 FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
189                                                                                                                     DataType::F16)),
190                                                                                                                     ActivationFunctionsDataset),
191                                                                                                                     framework::dataset::make("DataLayout", { DataLayout::NHWC })))
192 {
193     validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
194 }
195 FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
196                                                                                                                       DataType::F16)),
197                                                                                                                       ActivationFunctionsDataset),
198                                                                                                                       framework::dataset::make("DataLayout", { DataLayout::NHWC })))
199 {
200     validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
201 }
202 TEST_SUITE_END() // FP16
203 
TEST_SUITE(FP32)204 TEST_SUITE(FP32)
205 FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
206                                                                                                                     DataType::F32)),
207                                                                                                                     ActivationFunctionsDataset),
208                                                                                                                     framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
209 {
210     validate(CLAccessor(_target), _reference, tolerance_fp32);
211 }
212 FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
213                                                                                                                   ActivationFunctionsDataset),
214                                                                                                                   framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
215 {
216     validate(CLAccessor(_target), _reference, tolerance_fp32);
217 }
218 FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
219                                                                                                                      DataType::F32)),
220                                                                                                                      ActivationFunctionsDataset),
221                                                                                                                      framework::dataset::make("DataLayout", { DataLayout::NHWC })))
222 {
223     validate(CLAccessor(_target), _reference, tolerance_fp32);
224 }
225 FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
226                                                                                                                        DataType::F32)),
227                                                                                                                        ActivationFunctionsDataset),
228                                                                                                                        framework::dataset::make("DataLayout", { DataLayout::NHWC })))
229 {
230     validate(CLAccessor(_target), _reference, tolerance_fp32);
231 }
232 
233 FIXTURE_DATA_TEST_CASE(RunLargeUsecase, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_usecase, framework::dataset::make("DataType",
234                        DataType::F32)),
235                        framework::dataset::make("ActivationInfo", { ActivationLayerInfo() })),
236                        framework::dataset::make("DataLayout", { DataLayout::NHWC })))
237 {
238     // Validate output
239     validate(CLAccessor(_target), _reference, tolerance_fp32, 0.f, tolerance_fp32_abs);
240 }
241 TEST_SUITE_END() // FP32
242 
TEST_SUITE(FP32_CustomDataset)243 TEST_SUITE(FP32_CustomDataset)
244 FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
245                        framework::dataset::make("DataType", DataType::F32)),
246                        ActivationFunctionsDataset))
247 {
248     // Validate output
249     validate(CLAccessor(_target), _reference, tolerance_fp32);
250 }
251 TEST_SUITE_END() // FP32_CustomDataset
252 TEST_SUITE_END() // Float
253 
254 template <typename T>
255 using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
256 template <typename T>
257 using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
258 
259 const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
260 {
261     ActivationLayerInfo(),
262     ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
263     ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
264 });
265 TEST_SUITE(Quantized)
TEST_SUITE(QASYMM8)266 TEST_SUITE(QASYMM8)
267 FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit,
268                        framework::dataset::make("DataType",
269                                                 DataType::QASYMM8)),
270                        framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
271                        QuantizedActivationFunctionsDataset),
272                        framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
273 {
274     // Validate output
275     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
276 }
277 FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit_9x9,
278                        framework::dataset::make("DataType",
279                                                 DataType::QASYMM8)),
280                        framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) })),
281                        QuantizedActivationFunctionsDataset),
282                        framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
283 {
284     // Validate output
285     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
286 }
287 FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data_nightly, framework::dataset::make("DataType",
288                        DataType::QASYMM8)),
289                        framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
290                        QuantizedActivationFunctionsDataset),
291                        framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
292 {
293     // Validate output
294     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
295 }
296 FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data_nightly_9x9,
297                        framework::dataset::make("DataType",
298                                                 DataType::QASYMM8)),
299                        framework::dataset::make("QuantizationInfo", { QuantizationInfo(3.f / 255, 10), QuantizationInfo(1.1f, 10) })),
300                        QuantizedActivationFunctionsDataset),
301                        framework::dataset::make("DataLayout", { DataLayout::NCHW })))
302 {
303     // Validate output
304     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
305 }
306 
307 TEST_SUITE_END() // QASYMM8
308 
TEST_SUITE(QASYMM8_CustomDataset)309 TEST_SUITE(QASYMM8_CustomDataset)
310 FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
311                        combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
312                                                        framework::dataset::make("DataType", DataType::QASYMM8)),
313                                                framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
314                                        QuantizedActivationFunctionsDataset),
315                                framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
316 {
317     // Validate output
318     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
319 }
320 TEST_SUITE_END() // QASYMM8_CustomDataset
321 
TEST_SUITE(QASYMM8_SIGNED)322 TEST_SUITE(QASYMM8_SIGNED)
323 
324 FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit, framework::dataset::make("DataType",
325                                                                                                                         DataType::QASYMM8_SIGNED)),
326                                                                                                                         framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, -10) })),
327                                                                                                                         QuantizedActivationFunctionsDataset),
328                                                                                                                         framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
329 {
330     // Validate output
331     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
332 }
333 
334 FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit_9x9,
335                        framework::dataset::make("DataType",
336                                                 DataType::QASYMM8_SIGNED)),
337                        framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
338                        QuantizedActivationFunctionsDataset),
339                        framework::dataset::make("DataLayout", { DataLayout::NCHW })))
340 {
341     // Validate output
342     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
343 }
344 
345 FIXTURE_DATA_TEST_CASE(RunCustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
346                        combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
347                                                        framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
348                                                framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
349                                        QuantizedActivationFunctionsDataset),
350                                framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
351 {
352     // Validate output
353     validate(CLAccessor(_target), _reference, tolerance_qasymm8);
354 }
355 
356 TEST_SUITE_END() // QASYMM8_SIGNED
357 
358 TEST_SUITE_END() // Quantized
359 
360 TEST_SUITE_END() // DirectConvolutionLayer
361 TEST_SUITE_END() // Float
362 } // namespace validation
363 } // namespace test
364 } // namespace arm_compute
365