blob: 090bd22ed94241474dee47596df715d41926d666 [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{
Manuel Bottinidc125192020-08-11 13:18:29 +010046RelativeTolerance<half> tolerance_fp16(half(0.2)); /**< Tolerance for floating point tests */
47RelativeTolerance<float> tolerance_fp32(0.05f); /**< Tolerance for floating point tests */
48AbsoluteTolerance<float> tolerance_fp32_abs(0.0003f); /**< Absolute Tolerance for floating point tests */
49constexpr 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
Georgios Pinitas30902ed2017-11-14 15:32:57 +000091// *INDENT-OFF*
92// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000093DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010094 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),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000105 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100106 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
107 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
Michalis Spyrou45091732019-05-13 17:41:01 +0100108 TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100109 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),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000117 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100118 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),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000129 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100130 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),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000141 })),
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),
Giorgio Arena59486342017-12-01 10:42:47 +0000152 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000153 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000154 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000155{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000156 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));
Georgios Pinitas631c41a2017-12-06 11:53:03 +0000162 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000163}
164// clang-format on
165// *INDENT-ON*
166
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100167template <typename T>
168using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000169template <typename T>
170using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100171
172TEST_SUITE(Float)
173TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000174FIXTURE_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)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100177{
178 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100179 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100180}
Michalis Spyrou064add62018-11-01 18:14:27 +0000181FIXTURE_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}
Michalis Spyrou45091732019-05-13 17:41:01 +0100188FIXTURE_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}
195FIXTURE_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}
Michalis Spyrou064add62018-11-01 18:14:27 +0000202TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100203
204TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000205FIXTURE_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 })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100209{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100210 validate(CLAccessor(_target), _reference, tolerance_fp32);
211}
Michalis Spyrou064add62018-11-01 18:14:27 +0000212FIXTURE_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}
Michalis Spyrou45091732019-05-13 17:41:01 +0100218FIXTURE_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}
225FIXTURE_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}
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +0100232
233FIXTURE_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
Manuel Bottinidc125192020-08-11 13:18:29 +0100239 validate(CLAccessor(_target), _reference, tolerance_fp32, 0.f, tolerance_fp32_abs);
Michele Di Giorgioba2cc1a2020-07-15 17:39:30 +0100240}
Michalis Spyrou064add62018-11-01 18:14:27 +0000241TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000242
243TEST_SUITE(FP32_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000244FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000245 framework::dataset::make("DataType", DataType::F32)),
246 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000247{
248 // Validate output
249 validate(CLAccessor(_target), _reference, tolerance_fp32);
250}
Michalis Spyrou064add62018-11-01 18:14:27 +0000251TEST_SUITE_END() // FP32_CustomDataset
252TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100253
Michalis Spyroudef665a2017-08-14 11:26:37 +0100254template <typename T>
Chunosovd621bca2017-11-03 17:33:15 +0700255using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000256template <typename T>
257using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Chunosovd621bca2017-11-03 17:33:15 +0700258
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000259const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
260{
261 ActivationLayerInfo(),
262 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
263 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
264});
Chunosovd621bca2017-11-03 17:33:15 +0700265TEST_SUITE(Quantized)
266TEST_SUITE(QASYMM8)
Giorgio Arenae620a832020-02-17 16:33:20 +0000267FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(data_precommit,
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100268 framework::dataset::make("DataType",
269 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100270 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000271 QuantizedActivationFunctionsDataset),
272 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100273{
274 // Validate output
275 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
276}
Giorgio Arenae620a832020-02-17 16:33:20 +0000277FIXTURE_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)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100280 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000281 QuantizedActivationFunctionsDataset),
Georgios Pinitasaa95ddc2020-07-21 22:45:13 +0100282 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Michalis Spyrou064add62018-11-01 18:14:27 +0000283{
284 // Validate output
285 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
286}
Giorgio Arenae620a832020-02-17 16:33:20 +0000287FIXTURE_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 +0100288 DataType::QASYMM8)),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100289 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000290 QuantizedActivationFunctionsDataset),
291 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
292{
293 // Validate output
294 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
295}
296FIXTURE_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(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
300 QuantizedActivationFunctionsDataset),
301 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sang-Hoon Parkab5b1a22019-10-15 09:29:13 +0100302{
303 // Validate output
304 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
305}
306
Michalis Spyrou064add62018-11-01 18:14:27 +0000307TEST_SUITE_END() // QASYMM8
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000308
309TEST_SUITE(QASYMM8_CustomDataset)
Giorgio Arenae620a832020-02-17 16:33:20 +0000310FIXTURE_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 })))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000316{
317 // Validate output
318 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
319}
Michalis Spyrou064add62018-11-01 18:14:27 +0000320TEST_SUITE_END() // QASYMM8_CustomDataset
Sheri Zhang681f2d42020-02-20 11:23:08 +0000321
322TEST_SUITE(QASYMM8_SIGNED)
323
Giorgio Arenae620a832020-02-17 16:33:20 +0000324FIXTURE_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 +0000325 DataType::QASYMM8_SIGNED)),
326 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, -10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000327 QuantizedActivationFunctionsDataset),
328 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000329{
330 // Validate output
331 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
332}
333
Giorgio Arenae620a832020-02-17 16:33:20 +0000334FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL, combine(combine(combine(combine(data_precommit_9x9,
Sheri Zhang681f2d42020-02-20 11:23:08 +0000335 framework::dataset::make("DataType",
336 DataType::QASYMM8_SIGNED)),
337 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10), QuantizationInfo(1.1f, 10) })),
Giorgio Arenae620a832020-02-17 16:33:20 +0000338 QuantizedActivationFunctionsDataset),
339 framework::dataset::make("DataLayout", { DataLayout::NCHW })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000340{
341 // Validate output
342 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
343}
344
345FIXTURE_DATA_TEST_CASE(RunCustomDataset, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<int8_t>, framework::DatasetMode::NIGHTLY,
Giorgio Arenae620a832020-02-17 16:33:20 +0000346 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 })))
Sheri Zhang681f2d42020-02-20 11:23:08 +0000351{
352 // Validate output
353 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
354}
355
356TEST_SUITE_END() // QASYMM8_SIGNED
357
Michalis Spyrou064add62018-11-01 18:14:27 +0000358TEST_SUITE_END() // Quantized
Chunosovd621bca2017-11-03 17:33:15 +0700359
Michalis Spyrou064add62018-11-01 18:14:27 +0000360TEST_SUITE_END() // DirectConvolutionLayer
361TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100362} // namespace validation
363} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000364} // namespace arm_compute