blob: 6c46374b545080eae67ccef5f5f150d7eefc944b [file] [log] [blame]
Moritz Pflanzerb3d25792017-07-26 11:49:37 +01001/*
Michalis Spyrou80943252019-01-10 17:19:50 +00002 * Copyright (c) 2017-2019 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 */
48RelativeTolerance<float> tolerance_fp32(0.02f); /**< 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. */
Michalis Spyrou45091732019-05-13 17:41:01 +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 }));
Michalis Spyrou064add62018-11-01 18:14:27 +000071/** Direct convolution precommit data set. */
Michalis Spyrou45091732019-05-13 17:41:01 +010072const auto data_precommit = combine(data_small, framework::dataset::make("NumKernels", { 1 }));
73const auto data_precommit_9x9 = combine(data_small9x9, framework::dataset::make("NumKernels", { 1 }));
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010074
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000075/** Activation function Dataset*/
76const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
Michalis Spyrou5ce99a22019-01-25 14:17:49 +000077{ ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f) });
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010078} // namespace
79
80TEST_SUITE(CL)
81TEST_SUITE(DirectConvolutionLayer)
82
83//TODO(COMPMID-415): Configuration tests?
84
Georgios Pinitas30902ed2017-11-14 15:32:57 +000085// *INDENT-OFF*
86// clang-format off
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000087DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +010088 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching data type input/weights
89 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Mismatching input feature maps
90 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Unsupported kernel width
91 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Non-rectangular weights dimensions
92 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid weights dimensions
93 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid stride
94 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases size
95 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid biases dimensions
96 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Invalid output size
97 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::F32), // Window shrink
98 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +000099 }),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100100 framework::dataset::make("WeightsInfo",{ TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F16),
101 TensorInfo(TensorShape(3U, 3U, 3U, 4U), 1, DataType::F32),
Michalis Spyrou45091732019-05-13 17:41:01 +0100102 TensorInfo(TensorShape(11U, 11U, 2U, 4U), 1, DataType::F32),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100103 TensorInfo(TensorShape(5U, 3U, 2U, 4U), 1, DataType::F32),
104 TensorInfo(TensorShape(3U, 3U, 2U, 4U, 3U), 1, DataType::F32),
105 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
106 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
107 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
108 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
109 TensorInfo(TensorShape(3U, 3U, 2U, 4U), 1, DataType::F32),
110 TensorInfo(TensorShape(1U, 1U, 2U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000111 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100112 framework::dataset::make("BiasesInfo",{ TensorInfo(TensorShape(4U), 1, DataType::F32),
113 TensorInfo(TensorShape(4U), 1, DataType::F32),
114 TensorInfo(TensorShape(4U), 1, DataType::F32),
115 TensorInfo(TensorShape(4U), 1, DataType::F32),
116 TensorInfo(TensorShape(4U), 1, DataType::F32),
117 TensorInfo(TensorShape(4U), 1, DataType::F32),
118 TensorInfo(TensorShape(3U), 1, DataType::F32),
119 TensorInfo(TensorShape(4U, 2U), 1, DataType::F32),
120 TensorInfo(TensorShape(4U), 1, DataType::F32),
121 TensorInfo(TensorShape(4U), 1, DataType::F32),
122 TensorInfo(TensorShape(4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000123 })),
Vidhya Sudhan Loganathan7485d5a2018-07-04 09:34:00 +0100124 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
125 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
126 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
127 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
128 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
129 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
130 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
131 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
132 TensorInfo(TensorShape(26U, 11U, 4U), 1, DataType::F32),
133 TensorInfo(TensorShape(25U, 11U, 4U), 1, DataType::F32),
134 TensorInfo(TensorShape(32U, 16U, 4U), 1, DataType::F32),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000135 })),
136 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 1, 0, 0),
137 PadStrideInfo(1, 1, 0, 0),
138 PadStrideInfo(1, 1, 0, 0),
139 PadStrideInfo(1, 1, 0, 0),
140 PadStrideInfo(1, 1, 0, 0),
141 PadStrideInfo(3, 3, 0, 0),
142 PadStrideInfo(1, 1, 0, 0),
143 PadStrideInfo(1, 1, 0, 0),
144 PadStrideInfo(1, 1, 0, 0),
145 PadStrideInfo(1, 1, 0, 0),
Giorgio Arena59486342017-12-01 10:42:47 +0000146 PadStrideInfo(1, 1, 0, 0),
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000147 })),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000148 framework::dataset::make("ActivationInfo",
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000149{
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000150 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU)
151})),
152 framework::dataset::make("Expected", { false, false, false, false, false, false, false, false, false, false, true })),
153 input_info, weights_info, biases_info, output_info, conv_info, act_info, expected)
154{
155 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 +0000156 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
Georgios Pinitas30902ed2017-11-14 15:32:57 +0000157}
158// clang-format on
159// *INDENT-ON*
160
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100161template <typename T>
162using CLDirectConvolutionLayerFixture = DirectConvolutionValidationFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000163template <typename T>
164using CLDirectConvolutionValidationWithTensorShapesFixture = DirectConvolutionValidationWithTensorShapesFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100165
166TEST_SUITE(Float)
167TEST_SUITE(FP16)
Michalis Spyrou064add62018-11-01 18:14:27 +0000168FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType", DataType::F16)),
169 ActivationFunctionsDataset),
170 framework::dataset::make("DataLayout", DataLayout::NCHW)))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100171{
172 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100173 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100174}
Michalis Spyrou064add62018-11-01 18:14:27 +0000175FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F16)),
176 ActivationFunctionsDataset),
177 framework::dataset::make("DataLayout", DataLayout::NCHW)))
178{
179 // Validate output
180 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
181}
Michalis Spyrou45091732019-05-13 17:41:01 +0100182FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
183 DataType::F16)),
184 ActivationFunctionsDataset),
185 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
186{
187 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
188}
189FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
190 DataType::F16)),
191 ActivationFunctionsDataset),
192 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
193{
194 validate(CLAccessor(_target), _reference, tolerance_fp16, tolerance_num);
195}
Michalis Spyrou064add62018-11-01 18:14:27 +0000196TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100197
198TEST_SUITE(FP32)
Michalis Spyrou064add62018-11-01 18:14:27 +0000199FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
200 DataType::F32)),
201 ActivationFunctionsDataset),
202 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100203{
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100204 validate(CLAccessor(_target), _reference, tolerance_fp32);
205}
Michalis Spyrou064add62018-11-01 18:14:27 +0000206FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType", DataType::F32)),
207 ActivationFunctionsDataset),
208 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
209{
210 validate(CLAccessor(_target), _reference, tolerance_fp32);
211}
Michalis Spyrou45091732019-05-13 17:41:01 +0100212FIXTURE_DATA_TEST_CASE(RunLarge9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly_9x9, framework::dataset::make("DataType",
213 DataType::F32)),
214 ActivationFunctionsDataset),
215 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
216{
217 validate(CLAccessor(_target), _reference, tolerance_fp32);
218}
219FIXTURE_DATA_TEST_CASE(RunSmall9x9, CLDirectConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit_9x9, framework::dataset::make("DataType",
220 DataType::F32)),
221 ActivationFunctionsDataset),
222 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
223{
224 validate(CLAccessor(_target), _reference, tolerance_fp32);
225}
Michalis Spyrou064add62018-11-01 18:14:27 +0000226TEST_SUITE_END() // FP32
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000227
228TEST_SUITE(FP32_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000229FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::DirectConvolutionLayerDataset(),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000230 framework::dataset::make("DataType", DataType::F32)),
231 ActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000232{
233 // Validate output
234 validate(CLAccessor(_target), _reference, tolerance_fp32);
235}
Michalis Spyrou064add62018-11-01 18:14:27 +0000236TEST_SUITE_END() // FP32_CustomDataset
237TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100238
Michalis Spyroudef665a2017-08-14 11:26:37 +0100239template <typename T>
Chunosovd621bca2017-11-03 17:33:15 +0700240using CLDirectConvolutionLayerQuantizedFixture = DirectConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000241template <typename T>
242using CLDirectConvolutionValidationWithTensorShapesQuantizedFixture = DirectConvolutionValidationWithTensorShapesQuantizedFixture<CLTensor, CLAccessor, CLDirectConvolutionLayer, T>;
Chunosovd621bca2017-11-03 17:33:15 +0700243
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000244const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
245{
246 ActivationLayerInfo(),
247 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
248 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
249});
Chunosovd621bca2017-11-03 17:33:15 +0700250TEST_SUITE(Quantized)
251TEST_SUITE(QASYMM8)
Michalis Spyrou064add62018-11-01 18:14:27 +0000252FIXTURE_DATA_TEST_CASE(RunSmall, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(data_precommit, framework::dataset::make("DataType",
253 DataType::QASYMM8)),
254 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })),
255 QuantizedActivationFunctionsDataset))
Chunosovd621bca2017-11-03 17:33:15 +0700256{
257 // Validate output
258 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
259}
Michalis Spyrou064add62018-11-01 18:14:27 +0000260FIXTURE_DATA_TEST_CASE(RunLarge, CLDirectConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(data_nightly, framework::dataset::make("DataType",
261 DataType::QASYMM8)),
262 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 10) })),
263 QuantizedActivationFunctionsDataset))
264{
265 // Validate output
266 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
267}
268TEST_SUITE_END() // QASYMM8
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000269
270TEST_SUITE(QASYMM8_CustomDataset)
Michalis Spyrou80943252019-01-10 17:19:50 +0000271FIXTURE_DATA_TEST_CASE(Run, CLDirectConvolutionValidationWithTensorShapesQuantizedFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::DirectConvolutionLayerDataset(),
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000272 framework::dataset::make("DataType", DataType::QASYMM8)),
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000273 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255, 127) })),
274 QuantizedActivationFunctionsDataset))
Jaroslaw Rzepecki2ecbada2017-11-29 13:51:34 +0000275{
276 // Validate output
277 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
278}
Michalis Spyrou064add62018-11-01 18:14:27 +0000279TEST_SUITE_END() // QASYMM8_CustomDataset
280TEST_SUITE_END() // Quantized
Chunosovd621bca2017-11-03 17:33:15 +0700281
Michalis Spyrou064add62018-11-01 18:14:27 +0000282TEST_SUITE_END() // DirectConvolutionLayer
283TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100284} // namespace validation
285} // namespace test
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +0000286} // namespace arm_compute