blob: 767da943f28e5e8b8bbcc1807f1e159035a82d2b [file] [log] [blame]
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2017-2020 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{
Michalis Spyrou064add62018-11-01 18:14:27 +000046// COMPMID-517 Investigate the mismatch to see whether it is a real bug
Pablo Tellod041a832018-10-03 17:11:09 +010047RelativeTolerance<half> tolerance_fp16(half(0.2)); /**< Tolerance for floating point tests */
Michele Di Giorgio954051f2020-07-20 10:31:09 +010048RelativeTolerance<float> tolerance_fp32(0.03f); /**< Tolerance for floating point tests */
Pablo Tellod041a832018-10-03 17:11:09 +010049constexpr float tolerance_num = 0.07f; /**< Tolerance number */
50constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1); /**< Tolerance for quantized tests */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010051
Michalis Spyrou45091732019-05-13 17:41:01 +010052const auto data_strides = combine(framework::dataset::make("StrideX", 1, 3), framework::dataset::make("StrideY", 1, 3));
53const auto data_strides_small = combine(framework::dataset::make("StrideX", 1), framework::dataset::make("StrideY", 1));
54const auto data_ksize_one = combine(framework::dataset::make("PadX", 0, 1), combine(framework::dataset::make("PadY", 0, 1), framework::dataset::make("KernelSize", 1)));
55const auto data_ksize_one_small = combine(framework::dataset::make("PadX", 0), combine(framework::dataset::make("PadY", 0), framework::dataset::make("KernelSize", 1)));
56const auto data_ksize_three = combine(framework::dataset::make("PadX", 0, 2), combine(framework::dataset::make("PadY", 0, 2), framework::dataset::make("KernelSize", 3)));
57const auto data_ksize_five = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 5)));
58const auto data_ksize_nine = combine(framework::dataset::make("PadX", 0, 3), combine(framework::dataset::make("PadY", 0, 3), framework::dataset::make("KernelSize", 9)));
59const 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 +010060
Michalis Spyrou45091732019-05-13 17:41:01 +010061const auto data_all_kernels = concat(concat(data_ksize_one, data_ksize_three), data_ksize_five);
62
63const auto data = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_all_kernels));
64const auto data9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides, data_ksize_nine));
65const auto data_small = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_one_small));
66const auto data_small9x9 = combine(datasets::SmallDirectConvolutionShapes(), combine(data_strides_small, data_ksize_nine_small));
Michalis Spyrou064add62018-11-01 18:14:27 +000067
68/** Direct convolution nightly data set. */
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +010069const auto data_nightly = combine(data, framework::dataset::make("NumKernels", { 1, 4 }));
70const auto data_nightly_9x9 = combine(data9x9, framework::dataset::make("NumKernels", { 1, 4 }));
71const 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
Michalis Spyrou064add62018-11-01 18:14:27 +000079/** Direct convolution precommit data set. */
Michalis Spyrou45091732019-05-13 17:41:01 +010080const auto data_precommit = combine(data_small, framework::dataset::make("NumKernels", { 1 }));
81const auto data_precommit_9x9 = combine(data_small9x9, framework::dataset::make("NumKernels", { 1 }));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010082
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000083/** Activation function Dataset*/
84const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
Michalis Spyrou5ce99a22019-01-25 14:17:49 +000085{ ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f) });
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010086} // namespace
87
88TEST_SUITE(CL)
89TEST_SUITE(DirectConvolutionLayer)
90
91//TODO(COMPMID-415): Configuration tests?
92
Georgios Pinitas30902ed2017-11-14 15:32:57 +000093// *INDENT-OFF*
94// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000095DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010096 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
97 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
98 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
99 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
100 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
101 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
102 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
103 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
104 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
105 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
106 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000107 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100108 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
109 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
Michalis Spyrou45091732019-05-13 17:41:01 +0100110 TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100111 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
112 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 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(3U, 3U, 2U, 4U), 1, DataType::F32),
117 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
118 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000119 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100120 framework::dataset::make("BiasesInfo",{ 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(4U), 1, DataType::F32),
125 TensorInfo(TensorShape(4U), 1, DataType::F32),
126 TensorInfo(TensorShape(3U), 1, DataType::F32),
127 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
128 TensorInfo(TensorShape(4U), 1, DataType::F32),
129 TensorInfo(TensorShape(4U), 1, DataType::F32),
130 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000131 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100132 framework::dataset::make("OutputInfo",{ 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(25U, 11U, 4U), 1, DataType::F32),
139 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
140 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
141 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
142 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000143 })),
144 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
145 PadStrideInfo(1, 1, 0, 0),
146 PadStrideInfo(1, 1, 0, 0),
147 PadStrideInfo(1, 1, 0, 0),
148 PadStrideInfo(1, 1, 0, 0),
149 PadStrideInfo(3, 3, 0, 0),
150 PadStrideInfo(1, 1, 0, 0),
151 PadStrideInfo(1, 1, 0, 0),
152 PadStrideInfo(1, 1, 0, 0),
153 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000154 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000155 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000156 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000157{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000158 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
159})),
160 framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
161 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
162{
163 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 +0000164 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000165}
166// clang-format on
167// *INDENT-ON*
168
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100169template <typename T>
170using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000171template <typename T>
172using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100173
174TEST_SUITE(Float)
175TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000176FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
177 ActivationFunctionsDataset),
178 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100179{
180 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100181 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100182}
Michalis Spyrou064add62018-11-01 18:14:27 +0000183FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
184 ActivationFunctionsDataset),
185 framework::dataset::make("DataLayout", DataLayout::NCHW)))
186{
187 // Validate output
188 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
189}
Michalis Spyrou45091732019-05-13 17:41:01 +0100190FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
191 DataType::F16)),
192 ActivationFunctionsDataset),
193 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
194{
195 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
196}
197FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
198 DataType::F16)),
199 ActivationFunctionsDataset),
200 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
201{
202 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
203}
Michalis Spyrou064add62018-11-01 18:14:27 +0000204TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100205
206TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000207FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
208 DataType::F32)),
209 ActivationFunctionsDataset),
210 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100211{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100212 validate(CLAccessor(_target), _reference, tolerance_fp32);
213}
Michalis Spyrou064add62018-11-01 18:14:27 +0000214FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
215 ActivationFunctionsDataset),
216 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
217{
218 validate(CLAccessor(_target), _reference, tolerance_fp32);
219}
Michalis Spyrou45091732019-05-13 17:41:01 +0100220FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
221 DataType::F32)),
222 ActivationFunctionsDataset),
223 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
224{
225 validate(CLAccessor(_target), _reference, tolerance_fp32);
226}
227FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
228 DataType::F32)),
229 ActivationFunctionsDataset),
230 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
231{
232 validate(CLAccessor(_target), _reference, tolerance_fp32);
233}
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +0100234
235FIXTURE_DATA_TEST_CASE(RunLargeUsecase, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_usecase, framework::dataset::make("DataType",
236 DataType::F32)),
237 framework::dataset::make("ActivationInfo", { ActivationLayerInfo() })),
238 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
239{
240 // Validate output
241 validate(CLAccessor(_target), _reference, tolerance_fp32);
242}
Michalis Spyrou064add62018-11-01 18:14:27 +0000243TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000244
245TEST_SUITE(FP32_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000246FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000247 framework::dataset::make("DataType", DataType::F32)),
248 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000249{
250 // Validate output
251 validate(CLAccessor(_target), _reference, tolerance_fp32);
252}
Michalis Spyrou064add62018-11-01 18:14:27 +0000253TEST_SUITE_END() // FP32_CustomDataset
254TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100255
Michalis Spyroudef665a2017-08-14 11:26:37 +0100256template <typename T>
Chunosovd621bca2017-11-03 17:33:15 +0700257using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000258template <typename T>
259using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Chunosovd621bca2017-11-03 17:33:15 +0700260
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000261const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
262{
263 ActivationLayerInfo(),
264 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
265 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
266});
Chunosovd621bca2017-11-03 17:33:15 +0700267TEST_SUITE(Quantized)
268TEST_SUITE(QASYMM8)
Giorgio Arenae620a832020-02-17 16:33:20 +0000269FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit,
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100270 framework::dataset::make("DataType",
271 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100272 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000273 QuantizedActivationFunctionsDataset),
274 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100275{
276 // Validate output
277 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
278}
Giorgio Arenae620a832020-02-17 16:33:20 +0000279FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit_9x9,
280 framework::dataset::make("DataType",
281 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100282 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000283 QuantizedActivationFunctionsDataset),
Georgios Pinitasaa95ddc2020-07-21 22:45:13 +0100284 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000285{
286 // Validate output
287 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
288}
Giorgio Arenae620a832020-02-17 16:33:20 +0000289FIXTURE_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 +0100290 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100291 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000292 QuantizedActivationFunctionsDataset),
293 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
294{
295 // Validate output
296 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
297}
298FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(data_nightly_9x9,
299 framework::dataset::make("DataType",
300 DataType::QASYMM8)),
301 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
302 QuantizedActivationFunctionsDataset),
303 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100304{
305 // Validate output
306 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
307}
308
Michalis Spyrou064add62018-11-01 18:14:27 +0000309TEST_SUITE_END() // QASYMM8
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000310
311TEST_SUITE(QASYMM8_CustomDataset)
Giorgio Arenae620a832020-02-17 16:33:20 +0000312FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
313 combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
314 framework::dataset::make("DataType", DataType::QASYMM8)),
315 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
316 QuantizedActivationFunctionsDataset),
317 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000318{
319 // Validate output
320 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
321}
Michalis Spyrou064add62018-11-01 18:14:27 +0000322TEST_SUITE_END() // QASYMM8_CustomDataset
Sheri Zhang681f2d42020-02-20 11:23:08 +0000323
324TEST_SUITE(QASYMM8_SIGNED)
325
Giorgio Arenae620a832020-02-17 16:33:20 +0000326FIXTURE_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 +0000327 DataType::QASYMM8_SIGNED)),
328 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, -10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000329 QuantizedActivationFunctionsDataset),
330 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000331{
332 // Validate output
333 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
334}
335
Giorgio Arenae620a832020-02-17 16:33:20 +0000336FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit_9x9,
Sheri Zhang681f2d42020-02-20 11:23:08 +0000337 framework::dataset::make("DataType",
338 DataType::QASYMM8_SIGNED)),
339 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000340 QuantizedActivationFunctionsDataset),
341 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000342{
343 // Validate output
344 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
345}
346
347FIXTURE_DATA_TEST_CASE(RunCustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
Giorgio Arenae620a832020-02-17 16:33:20 +0000348 combine(combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
349 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
350 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127), QuantizationInfo(1.1f, 10) })),
351 QuantizedActivationFunctionsDataset),
352 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000353{
354 // Validate output
355 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
356}
357
358TEST_SUITE_END() // QASYMM8_SIGNED
359
Michalis Spyrou064add62018-11-01 18:14:27 +0000360TEST_SUITE_END() // Quantized
Chunosovd621bca2017-11-03 17:33:15 +0700361
Michalis Spyrou064add62018-11-01 18:14:27 +0000362TEST_SUITE_END() // DirectConvolutionLayer
363TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100364} // namespace validation
365} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000366} // namespace arm_compute