blob: 8c40b7e36698c15efe40f6ed2bc27ed33578f6f9 [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,
Michalis Spyrou80943252019-01-10 17:19:50 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010022 * 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/CLConvolutionLayer.h"
Isabella Gottardif07d28d2018-02-06 14:52:43 +000028#include "arm_compute/runtime/CL/functions/CLGEMMConvolutionLayer.h"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010029#include "tests/CL/CLAccessor.h"
30#include "tests/PaddingCalculator.h"
Moritz Pflanzera09de0c2017-09-01 20:41:12 +010031#include "tests/datasets/LargeConvolutionLayerDataset.h"
32#include "tests/datasets/SmallConvolutionLayerDataset.h"
Anthony Barbier1c0d0ff2018-01-31 13:05:09 +000033#include "tests/datasets/TinyConvolutionLayerDataset.h"
Moritz Pflanzera09de0c2017-09-01 20:41:12 +010034#include "tests/framework/Asserts.h"
35#include "tests/framework/Macros.h"
36#include "tests/framework/datasets/Datasets.h"
37#include "tests/validation/Validation.h"
38#include "tests/validation/fixtures/ConvolutionLayerFixture.h"
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010039
40namespace arm_compute
41{
42namespace test
43{
44namespace validation
45{
46namespace
47{
Georgios Pinitas8be91482019-03-26 17:23:28 +000048RelativeTolerance<float> tolerance_f32(0.1f); /**< Tolerance value for comparing reference's output against implementation's output for DataType::F32 */
steniu01f81652d2017-09-11 15:29:12 +010049RelativeTolerance<half_float::half> tolerance_f16(half_float::half(0.2)); /**< Tolerance value for comparing reference's output against implementation's output for DataType::F16 */
Georgios Pinitas51e53a32018-10-22 13:49:08 +010050constexpr AbsoluteTolerance<float> tolerance_qasymm8(1); /**< Tolerance value for comparing reference's output against implementation's output for quantized data types */
steniu01f81652d2017-09-11 15:29:12 +010051constexpr float tolerance_num = 0.07f; /**< Tolerance number */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010052
53/** CNN data types */
54const auto CNNDataTypes = framework::dataset::make("DataType",
55{
56 DataType::F16,
57 DataType::F32,
Chunosov5124be52017-11-22 20:42:13 +070058 DataType::QASYMM8,
Sang-Hoon Park4715cf92020-01-08 16:02:47 +000059 DataType::QASYMM8_SIGNED,
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010060});
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +010061
62/** Grouped CNN data types */
63const auto GroupedCNNDataTypes = framework::dataset::make("DataType",
64{
65 DataType::F16,
66 DataType::F32
67});
68
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000069const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
70{
71 ActivationLayerInfo(),
72 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
73 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 0.5f),
74 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
75});
Michalis Spyrou80943252019-01-10 17:19:50 +000076const auto ActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
77{
78 ActivationLayerInfo(),
79 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
80});
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010081} // namespace
82
83TEST_SUITE(CL)
84TEST_SUITE(ConvolutionLayer)
85
Michalis Spyrou80943252019-01-10 17:19:50 +000086// *INDENT-OFF*
87// clang-format off
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +010088DATA_TEST_CASE(ValidateConvolutionMethod, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(zip(
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +000089 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
90 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
91 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Select GEMM
92 TensorInfo(TensorShape(23U, 27U, 31U, 4U), 1, DataType::F32), // Select WINOGRAD
93 TensorInfo(TensorShape(3U, 3U, 2U, 1U), 1, DataType::F32), // Select GEMM
94 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32), // Select GEMM
95 TensorInfo(TensorShape(17U, 31U, 32U), 1, DataType::F32), // Select WINOGRAD
96 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
97 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::QASYMM8_SIGNED), // Select GEMM
Michalis Spyrou80943252019-01-10 17:19:50 +000098 }),
99 framework::dataset::make("WeightsInfo", { TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
100 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
101 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
102 TensorInfo(TensorShape(3U, 3U, 31U, 21U), 1, DataType::F32),
103 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
104 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16),
105 TensorInfo(TensorShape(5U, 5U, 32U, 19U), 1, DataType::F32),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000106 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
107 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::QASYMM8_SIGNED),
Michalis Spyrou80943252019-01-10 17:19:50 +0000108 })),
109 framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
110 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
111 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
112 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
113 TensorInfo(TensorShape(11U, 25U, 21U), 1, DataType::F32),
114 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32),
115 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F32),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000116 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F32),
117 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::QASYMM8_SIGNED),
Michalis Spyrou80943252019-01-10 17:19:50 +0000118 })),
119 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 2, 1, 1),
120 PadStrideInfo(1, 2, 1, 1),
121 PadStrideInfo(1, 1, 0, 0),
122 PadStrideInfo(1, 1, 0, 0),
123 PadStrideInfo(2, 1, 0, 0),
124 PadStrideInfo(3, 2, 1, 0),
125 PadStrideInfo(1, 1, 2, 2),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000126 PadStrideInfo(1, 1, 2, 2),
127 PadStrideInfo(1, 1, 2, 2),
Michalis Spyrou80943252019-01-10 17:19:50 +0000128 })),
129 framework::dataset::make("GpuTarget", { GPUTarget::BIFROST,
130 GPUTarget::MIDGARD,
131 GPUTarget::G71,
132 GPUTarget::G71,
133 GPUTarget::MIDGARD,
134 GPUTarget::BIFROST,
135 GPUTarget::BIFROST,
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000136 GPUTarget::BIFROST,
137 GPUTarget::BIFROST,
Michalis Spyrou80943252019-01-10 17:19:50 +0000138 })),
139 framework::dataset::make("Dilation", { Size2D(1U, 1U),
140 Size2D(1U, 1U),
141 Size2D(1U, 1U),
142 Size2D(1U, 1U),
143 Size2D(1U, 1U),
144 Size2D(1U, 1U),
145 Size2D(1U, 1U),
146 Size2D(2U, 1U),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000147 Size2D(2U, 1U),
Michalis Spyrou80943252019-01-10 17:19:50 +0000148 })),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000149 framework::dataset::make("EnableFastMath", { false, false, false, false, false, false, true, true, true })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000150 framework::dataset::make("Expected",{ ConvolutionMethod::GEMM,
151 ConvolutionMethod::GEMM,
152 ConvolutionMethod::GEMM,
153 ConvolutionMethod::WINOGRAD,
154 ConvolutionMethod::GEMM,
155 ConvolutionMethod::GEMM,
156 ConvolutionMethod::WINOGRAD,
157 ConvolutionMethod::GEMM,
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000158 ConvolutionMethod::GEMM,
Michalis Spyrou80943252019-01-10 17:19:50 +0000159 })),
160 input_info, weights_info, output_info, conv_info, gpu_target, dilation, enable_fast_math, expected)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100161{
162 ConvolutionMethod is_valid = CLConvolutionLayer::get_convolution_method(&input_info.clone()->set_is_resizable(true),
163 &weights_info.clone()->set_is_resizable(true),
164 &output_info.clone()->set_is_resizable(true), conv_info,
165 WeightsInfo(),
166 ActivationLayerInfo(),
167 gpu_target,
168 dilation,
169 enable_fast_math);
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000170 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
171}
Michalis Spyrou80943252019-01-10 17:19:50 +0000172// clang-format on
173// *INDENT-ON*
174TEST_SUITE_END() // ConvolutionLayer
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000175
176TEST_SUITE(GEMMConvolutionLayer)
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100177template <typename T>
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000178using CLGEMMConvolutionLayerFixture = ConvolutionValidationFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100179
180TEST_SUITE(Float)
181TEST_SUITE(FP16)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000182
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100183FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
184 framework::dataset::make("ReshapeWeights", { true })),
185 framework::dataset::make("DataType",
186 DataType::F16)),
187 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
188 ActivationFunctionsSmallDataset))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100189{
190 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100191 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100192}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100193TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100194
195TEST_SUITE(FP32)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000196
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100197FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
198 framework::dataset::make("ReshapeWeights", { true })),
199 framework::dataset::make("DataType",
200 DataType::F32)),
201 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
202 ActivationFunctionsSmallDataset))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100203{
204 // Validate output
205 validate(CLAccessor(_target), _reference, tolerance_f32);
206}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100207TEST_SUITE_END() // FP32
208TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100209
210template <typename T>
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000211using CLGEMMConvolutionLayerQuantizedFixture = ConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000212template <typename T>
213using CLGEMMConvolutionLayerQuantizedPerChannelFixture = ConvolutionValidationQuantizedPerChannelFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T, int8_t>;
Chunosov5124be52017-11-22 20:42:13 +0700214
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000215const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
216{
217 ActivationLayerInfo(),
218 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
219 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
220});
Michalis Spyrou80943252019-01-10 17:19:50 +0000221const auto QuantizedActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
222{
223 ActivationLayerInfo(),
224 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
225});
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000226
Chunosov5124be52017-11-22 20:42:13 +0700227TEST_SUITE(Quantized)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000228
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000229const auto QuantizationData = framework::dataset::make("QuantizationInfo",
230{
231 QuantizationInfo(0.5f, 10),
232 QuantizationInfo(0.3f, 3),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100233 QuantizationInfo(1.1f, 10),
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000234});
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000235TEST_SUITE(QASYMM8)
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000236
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100237FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::ALL,
238 combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000239 framework::dataset::make("ReshapeWeights", { true })),
240 framework::dataset::make("DataType", DataType::QASYMM8)),
241 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
242 QuantizationData),
243 QuantizedActivationFunctionsSmallDataset))
Chunosov5124be52017-11-22 20:42:13 +0700244{
245 // Validate output
246 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
247}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100248TEST_SUITE_END() // QASYMM8
Sang-Hoon Park4715cf92020-01-08 16:02:47 +0000249TEST_SUITE(QASYMM8_SIGNED)
250
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100251FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL,
252 combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
Sang-Hoon Park4715cf92020-01-08 16:02:47 +0000253 framework::dataset::make("ReshapeWeights", { true })),
254 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
255 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
256 QuantizationData),
257 QuantizedActivationFunctionsSmallDataset))
258{
259 // Validate output
260 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
261}
262TEST_SUITE_END() // QASYMM8_SIGNED
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000263TEST_SUITE(QSYMM8_PER_CHANNEL)
264
morgolockd13931d2020-06-23 15:49:35 +0100265FIXTURE_DATA_TEST_CASE(RunSmallSigned, CLGEMMConvolutionLayerQuantizedPerChannelFixture<int8_t>, framework::DatasetMode::ALL,
266 combine(combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
267 framework::dataset::make("ReshapeWeights", { true })),
268 framework::dataset::make("DataType", { DataType::QASYMM8_SIGNED })),
269 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
270 QuantizationData),
271 QuantizedActivationFunctionsSmallDataset),
272 framework::dataset::make("WeightsDataType", { DataType::QSYMM8_PER_CHANNEL })))
273{
274 // Validate output
275 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
276}
277
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100278FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedPerChannelFixture<uint8_t>, framework::DatasetMode::ALL,
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000279 combine(combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
280 framework::dataset::make("ReshapeWeights", { true })),
281 framework::dataset::make("DataType", { DataType::QASYMM8 })),
282 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
283 QuantizationData),
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100284 QuantizedActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000285 framework::dataset::make("WeightsDataType", { DataType::QSYMM8_PER_CHANNEL })))
286{
287 // Validate output
288 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
289}
290TEST_SUITE_END() // QSYMM8_PER_CHANNEL
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100291TEST_SUITE_END() // Quantized
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100292
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100293TEST_SUITE_END() // GEMMConvolutionLayer
294
295template <typename T>
296using CLGEMMGroupedConvolutionLayerFixture = ConvolutionValidationFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
297
298TEST_SUITE(GroupedGEMMConvolutionLayer)
299
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100300TEST_SUITE(Float)
301TEST_SUITE(FP32)
302
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100303FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMGroupedConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallGroupedConvolutionLayerDataset(),
304 framework::dataset::make("ReshapeWeights", { true })),
305 framework::dataset::make("DataType", DataType::F32)),
306 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
307 ActivationFunctionsSmallDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100308{
309 // Validate output
310 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
311}
312
Michalis Spyrou80943252019-01-10 17:19:50 +0000313FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMGroupedConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY,
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100314 combine(combine(combine(combine(datasets::LargeGroupedConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000315 framework::dataset::make("ReshapeWeights", { true })),
316 framework::dataset::make("DataType", DataType::F32)),
317 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
318 ActivationFunctionsDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100319{
320 // Validate output
321 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
322}
323TEST_SUITE_END() // FP32
324
325TEST_SUITE(FP16)
326
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100327FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMGroupedConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallGroupedConvolutionLayerDataset(),
328 framework::dataset::make("ReshapeWeights", { true })),
329 framework::dataset::make("DataType", DataType::F16)),
330 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
331 ActivationFunctionsSmallDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100332{
333 // Validate output
334 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
335}
336
Michalis Spyrou80943252019-01-10 17:19:50 +0000337FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMGroupedConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY,
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100338 combine(combine(combine(combine(datasets::LargeGroupedConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000339 framework::dataset::make("ReshapeWeights", { true })),
340 framework::dataset::make("DataType", DataType::F16)),
341 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
342 ActivationFunctionsDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100343{
344 // Validate output
345 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
346}
347TEST_SUITE_END() // FP16
348TEST_SUITE_END() // Float
349
350TEST_SUITE_END() // GroupedGEMMConvolutionLayer
351TEST_SUITE_END() // CL
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100352} // namespace validation
353} // namespace test
354} // namespace arm_compute