blob: b66cfd97e72fd5d9663e42564f645223a3d68636 [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{
Manuel Bottini28a46c92020-11-11 15:05:29 +000048class SmallConvolutionLayerDatasetCases final : public datasets::ConvolutionLayerDataset
49{
50public:
51 SmallConvolutionLayerDatasetCases()
52 {
53 // 1D Kernel
54 add_config(TensorShape(1U, 130U, 2000U), TensorShape(1U, 1U, 2000U, 2000U), TensorShape(2000U), TensorShape(1U, 130U, 2000U), PadStrideInfo(1, 1, 0, 0));
55 }
56};
57
Georgios Pinitas8be91482019-03-26 17:23:28 +000058RelativeTolerance<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 +010059RelativeTolerance<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 +010060constexpr 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 +010061constexpr float tolerance_num = 0.07f; /**< Tolerance number */
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010062
63/** CNN data types */
64const auto CNNDataTypes = framework::dataset::make("DataType",
65{
66 DataType::F16,
67 DataType::F32,
Chunosov5124be52017-11-22 20:42:13 +070068 DataType::QASYMM8,
Sang-Hoon Park4715cf92020-01-08 16:02:47 +000069 DataType::QASYMM8_SIGNED,
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010070});
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +010071
72/** Grouped CNN data types */
73const auto GroupedCNNDataTypes = framework::dataset::make("DataType",
74{
75 DataType::F16,
76 DataType::F32
77});
78
Isabella Gottardi3f217ec2018-02-12 14:59:19 +000079const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
80{
81 ActivationLayerInfo(),
82 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
83 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 0.5f),
84 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
85});
Michalis Spyrou80943252019-01-10 17:19:50 +000086const auto ActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
87{
88 ActivationLayerInfo(),
89 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
90});
Moritz Pflanzerb3d25792017-07-26 11:49:37 +010091} // namespace
92
93TEST_SUITE(CL)
94TEST_SUITE(ConvolutionLayer)
95
Michalis Spyrou80943252019-01-10 17:19:50 +000096// *INDENT-OFF*
97// clang-format off
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +010098DATA_TEST_CASE(ValidateConvolutionMethod, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(zip(zip(
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +000099 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
100 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
101 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Select GEMM
102 TensorInfo(TensorShape(23U, 27U, 31U, 4U), 1, DataType::F32), // Select WINOGRAD
103 TensorInfo(TensorShape(3U, 3U, 2U, 1U), 1, DataType::F32), // Select GEMM
104 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32), // Select GEMM
105 TensorInfo(TensorShape(17U, 31U, 32U), 1, DataType::F32), // Select WINOGRAD
106 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Select GEMM
107 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::QASYMM8_SIGNED), // Select GEMM
Michalis Spyrou80943252019-01-10 17:19:50 +0000108 }),
109 framework::dataset::make("WeightsInfo", { TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
110 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
111 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
112 TensorInfo(TensorShape(3U, 3U, 31U, 21U), 1, DataType::F32),
113 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
114 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16),
115 TensorInfo(TensorShape(5U, 5U, 32U, 19U), 1, DataType::F32),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000116 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::F32),
117 TensorInfo(TensorShape(5U, 5U, 2U, 19U), 1, DataType::QASYMM8_SIGNED),
Michalis Spyrou80943252019-01-10 17:19:50 +0000118 })),
119 framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
120 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
121 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
122 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
123 TensorInfo(TensorShape(11U, 25U, 21U), 1, DataType::F32),
124 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32),
125 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F32),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000126 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F32),
127 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::QASYMM8_SIGNED),
Michalis Spyrou80943252019-01-10 17:19:50 +0000128 })),
129 framework::dataset::make("ConvInfo", { PadStrideInfo(1, 2, 1, 1),
130 PadStrideInfo(1, 2, 1, 1),
131 PadStrideInfo(1, 1, 0, 0),
132 PadStrideInfo(1, 1, 0, 0),
133 PadStrideInfo(2, 1, 0, 0),
134 PadStrideInfo(3, 2, 1, 0),
135 PadStrideInfo(1, 1, 2, 2),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000136 PadStrideInfo(1, 1, 2, 2),
137 PadStrideInfo(1, 1, 2, 2),
Michalis Spyrou80943252019-01-10 17:19:50 +0000138 })),
139 framework::dataset::make("GpuTarget", { GPUTarget::BIFROST,
140 GPUTarget::MIDGARD,
141 GPUTarget::G71,
142 GPUTarget::G71,
143 GPUTarget::MIDGARD,
144 GPUTarget::BIFROST,
145 GPUTarget::BIFROST,
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000146 GPUTarget::BIFROST,
147 GPUTarget::BIFROST,
Michalis Spyrou80943252019-01-10 17:19:50 +0000148 })),
149 framework::dataset::make("Dilation", { Size2D(1U, 1U),
150 Size2D(1U, 1U),
151 Size2D(1U, 1U),
152 Size2D(1U, 1U),
153 Size2D(1U, 1U),
154 Size2D(1U, 1U),
155 Size2D(1U, 1U),
156 Size2D(2U, 1U),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000157 Size2D(2U, 1U),
Michalis Spyrou80943252019-01-10 17:19:50 +0000158 })),
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000159 framework::dataset::make("EnableFastMath", { false, false, false, false, false, false, true, true, true })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000160 framework::dataset::make("Expected",{ ConvolutionMethod::GEMM,
161 ConvolutionMethod::GEMM,
162 ConvolutionMethod::GEMM,
163 ConvolutionMethod::WINOGRAD,
164 ConvolutionMethod::GEMM,
165 ConvolutionMethod::GEMM,
166 ConvolutionMethod::WINOGRAD,
167 ConvolutionMethod::GEMM,
Sang-Hoon Park70d33bd2020-01-08 16:29:15 +0000168 ConvolutionMethod::GEMM,
Michalis Spyrou80943252019-01-10 17:19:50 +0000169 })),
170 input_info, weights_info, output_info, conv_info, gpu_target, dilation, enable_fast_math, expected)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100171{
172 ConvolutionMethod is_valid = CLConvolutionLayer::get_convolution_method(&input_info.clone()->set_is_resizable(true),
173 &weights_info.clone()->set_is_resizable(true),
174 &output_info.clone()->set_is_resizable(true), conv_info,
175 WeightsInfo(),
176 ActivationLayerInfo(),
177 gpu_target,
178 dilation,
179 enable_fast_math);
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000180 ARM_COMPUTE_EXPECT(is_valid == expected, framework::LogLevel::ERRORS);
181}
Michalis Spyrou80943252019-01-10 17:19:50 +0000182// clang-format on
183// *INDENT-ON*
184TEST_SUITE_END() // ConvolutionLayer
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000185
186TEST_SUITE(GEMMConvolutionLayer)
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100187template <typename T>
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000188using CLGEMMConvolutionLayerFixture = ConvolutionValidationFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100189
190TEST_SUITE(Float)
191TEST_SUITE(FP16)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000192
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100193FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
194 framework::dataset::make("ReshapeWeights", { true })),
195 framework::dataset::make("DataType",
196 DataType::F16)),
197 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
198 ActivationFunctionsSmallDataset))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100199{
200 // Validate output
steniu013e05e4e2017-08-25 17:18:01 +0100201 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num);
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100202}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100203TEST_SUITE_END() // FP16
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100204
205TEST_SUITE(FP32)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000206
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100207FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
208 framework::dataset::make("ReshapeWeights", { true })),
209 framework::dataset::make("DataType",
210 DataType::F32)),
211 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
212 ActivationFunctionsSmallDataset))
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100213{
214 // Validate output
215 validate(CLAccessor(_target), _reference, tolerance_f32);
216}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100217TEST_SUITE_END() // FP32
218TEST_SUITE_END() // Float
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100219
220template <typename T>
Isabella Gottardif07d28d2018-02-06 14:52:43 +0000221using CLGEMMConvolutionLayerQuantizedFixture = ConvolutionValidationQuantizedFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000222template <typename T>
223using CLGEMMConvolutionLayerQuantizedPerChannelFixture = ConvolutionValidationQuantizedPerChannelFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T, int8_t>;
Chunosov5124be52017-11-22 20:42:13 +0700224
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000225const auto QuantizedActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
226{
227 ActivationLayerInfo(),
228 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
229 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
230});
Michalis Spyrou80943252019-01-10 17:19:50 +0000231const auto QuantizedActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
232{
233 ActivationLayerInfo(),
234 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 6.f)
235});
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000236
Chunosov5124be52017-11-22 20:42:13 +0700237TEST_SUITE(Quantized)
Isabella Gottardi3f217ec2018-02-12 14:59:19 +0000238
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000239const auto QuantizationData = framework::dataset::make("QuantizationInfo",
240{
241 QuantizationInfo(0.5f, 10),
242 QuantizationInfo(0.3f, 3),
Michele Di Giorgio14cbfb22019-10-23 10:53:10 +0100243 QuantizationInfo(1.1f, 10),
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000244});
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000245TEST_SUITE(QASYMM8)
Gian Marco Iodice3139f032018-11-05 14:26:32 +0000246
Manuel Bottini28a46c92020-11-11 15:05:29 +0000247FIXTURE_DATA_TEST_CASE(RunSmallCases, CLGEMMConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::ALL,
248 combine(combine(combine(combine(combine(SmallConvolutionLayerDatasetCases(),
249 framework::dataset::make("ReshapeWeights", { true })),
250 framework::dataset::make("DataType", DataType::QASYMM8)),
251 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
252 QuantizationData),
253 QuantizedActivationFunctionsSmallDataset))
254{
255 // Validate output
256 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
257}
258
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100259FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedFixture<uint8_t>, framework::DatasetMode::ALL,
260 combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000261 framework::dataset::make("ReshapeWeights", { true })),
262 framework::dataset::make("DataType", DataType::QASYMM8)),
263 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
264 QuantizationData),
265 QuantizedActivationFunctionsSmallDataset))
Chunosov5124be52017-11-22 20:42:13 +0700266{
267 // Validate output
268 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
269}
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100270TEST_SUITE_END() // QASYMM8
Sang-Hoon Park4715cf92020-01-08 16:02:47 +0000271TEST_SUITE(QASYMM8_SIGNED)
272
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100273FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedFixture<int8_t>, framework::DatasetMode::ALL,
274 combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
Sang-Hoon Park4715cf92020-01-08 16:02:47 +0000275 framework::dataset::make("ReshapeWeights", { true })),
276 framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
277 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
278 QuantizationData),
279 QuantizedActivationFunctionsSmallDataset))
280{
281 // Validate output
282 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
283}
284TEST_SUITE_END() // QASYMM8_SIGNED
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000285TEST_SUITE(QSYMM8_PER_CHANNEL)
286
morgolockd13931d2020-06-23 15:49:35 +0100287FIXTURE_DATA_TEST_CASE(RunSmallSigned, CLGEMMConvolutionLayerQuantizedPerChannelFixture<int8_t>, framework::DatasetMode::ALL,
288 combine(combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
289 framework::dataset::make("ReshapeWeights", { true })),
290 framework::dataset::make("DataType", { DataType::QASYMM8_SIGNED })),
291 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
292 QuantizationData),
293 QuantizedActivationFunctionsSmallDataset),
294 framework::dataset::make("WeightsDataType", { DataType::QSYMM8_PER_CHANNEL })))
295{
296 // Validate output
297 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
298}
299
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100300FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMConvolutionLayerQuantizedPerChannelFixture<uint8_t>, framework::DatasetMode::ALL,
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000301 combine(combine(combine(combine(combine(combine(datasets::SmallConvolutionLayerDataset(),
302 framework::dataset::make("ReshapeWeights", { true })),
303 framework::dataset::make("DataType", { DataType::QASYMM8 })),
304 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
305 QuantizationData),
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100306 QuantizedActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan951b8a42019-11-04 14:42:08 +0000307 framework::dataset::make("WeightsDataType", { DataType::QSYMM8_PER_CHANNEL })))
308{
309 // Validate output
310 validate(CLAccessor(_target), _reference, tolerance_qasymm8);
311}
312TEST_SUITE_END() // QSYMM8_PER_CHANNEL
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100313TEST_SUITE_END() // Quantized
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100314
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100315TEST_SUITE_END() // GEMMConvolutionLayer
316
317template <typename T>
318using CLGEMMGroupedConvolutionLayerFixture = ConvolutionValidationFixture<CLTensor, CLAccessor, CLGEMMConvolutionLayer, T>;
319
320TEST_SUITE(GroupedGEMMConvolutionLayer)
321
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100322TEST_SUITE(Float)
323TEST_SUITE(FP32)
324
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100325FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMGroupedConvolutionLayerFixture<float>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallGroupedConvolutionLayerDataset(),
326 framework::dataset::make("ReshapeWeights", { true })),
327 framework::dataset::make("DataType", DataType::F32)),
328 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
329 ActivationFunctionsSmallDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100330{
331 // Validate output
332 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
333}
334
Michalis Spyrou80943252019-01-10 17:19:50 +0000335FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMGroupedConvolutionLayerFixture<float>, framework::DatasetMode::NIGHTLY,
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100336 combine(combine(combine(combine(datasets::LargeGroupedConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000337 framework::dataset::make("ReshapeWeights", { true })),
338 framework::dataset::make("DataType", DataType::F32)),
339 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
340 ActivationFunctionsDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100341{
342 // Validate output
343 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
344}
345TEST_SUITE_END() // FP32
346
347TEST_SUITE(FP16)
348
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100349FIXTURE_DATA_TEST_CASE(RunSmall, CLGEMMGroupedConvolutionLayerFixture<half>, framework::DatasetMode::ALL, combine(combine(combine(combine(datasets::SmallGroupedConvolutionLayerDataset(),
350 framework::dataset::make("ReshapeWeights", { true })),
351 framework::dataset::make("DataType", DataType::F16)),
352 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
353 ActivationFunctionsSmallDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100354{
355 // Validate output
356 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
357}
358
Michalis Spyrou80943252019-01-10 17:19:50 +0000359FIXTURE_DATA_TEST_CASE(RunLarge, CLGEMMGroupedConvolutionLayerFixture<half>, framework::DatasetMode::NIGHTLY,
Michele Di Giorgioe37662a2020-04-29 15:14:18 +0100360 combine(combine(combine(combine(datasets::LargeGroupedConvolutionLayerDataset(),
Michalis Spyrou80943252019-01-10 17:19:50 +0000361 framework::dataset::make("ReshapeWeights", { true })),
362 framework::dataset::make("DataType", DataType::F16)),
363 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
364 ActivationFunctionsDataset))
Gian Marco Iodice916d1bc2018-08-13 11:20:41 +0100365{
366 // Validate output
367 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
368}
369TEST_SUITE_END() // FP16
370TEST_SUITE_END() // Float
371
372TEST_SUITE_END() // GroupedGEMMConvolutionLayer
373TEST_SUITE_END() // CL
Moritz Pflanzerb3d25792017-07-26 11:49:37 +0100374} // namespace validation
375} // namespace test
376} // namespace arm_compute