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