blob: d1522f3e7f326b4a625e3e648c55119d54f67ddc [file] [log] [blame]
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00001/*
Gian Marco Iodicebc6c3742020-10-19 12:49:44 +01002 * Copyright (c) 2018-2020 Arm Limited.
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00003 *
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,
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000022 * SOFTWARE.
23 */
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000024#include "arm_compute/core/CL/kernels/CLWinogradFilterTransformKernel.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000025#include "arm_compute/core/CL/kernels/CLWinogradOutputTransformKernel.h"
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010026#include "arm_compute/core/Helpers.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000027#include "arm_compute/core/Types.h"
28#include "arm_compute/core/utils/misc/ShapeCalculator.h"
29#include "arm_compute/runtime/CL/CLTensor.h"
30#include "arm_compute/runtime/CL/CLTensorAllocator.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000031#include "arm_compute/runtime/CL/functions/CLWinogradConvolutionLayer.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000032#include "arm_compute/runtime/CL/functions/CLWinogradInputTransform.h"
33#include "tests/CL/CLAccessor.h"
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000034#include "tests/CL/Helper.h"
35#include "tests/PaddingCalculator.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000036#include "tests/datasets/LargeConvolutionLayerDataset.h"
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000037#include "tests/datasets/ShapeDatasets.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000038#include "tests/datasets/SmallConvolutionLayerDataset.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000039#include "tests/datasets/WinogradInputTransformDataset.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000040#include "tests/datasets/WinogradOutputTransformDataset.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000041#include "tests/framework/Asserts.h"
42#include "tests/framework/Macros.h"
43#include "tests/framework/datasets/Datasets.h"
44#include "tests/validation/Validation.h"
Georgios Pinitas9fb11592018-04-26 20:34:58 +010045#include "tests/validation/fixtures/WinogradConvolutionLayerFixture.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000046
47namespace arm_compute
48{
49namespace test
50{
51namespace validation
52{
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000053namespace
54{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010055// *INDENT-OFF*
56// clang-format off
Michele Di Giorgio875a7512019-02-27 14:26:51 +000057constexpr AbsoluteTolerance<float> tolerance_f32(0.002f);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +010058const AbsoluteTolerance<half> tolerance_f16(half(0.5f));
Gian Marco Iodice4497e812018-05-08 16:36:52 +010059constexpr AbsoluteTolerance<float> tolerance_convolution_layer_f32(0.1f);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +010060const AbsoluteTolerance<half> tolerance_convolution_layer_f16(half(0.4f));
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +000061RelativeTolerance<half_float::half> rel_tolerance_f16(half(0.2)); /**< Tolerance value for comparing reference's output against implementation's output for FP16 data types */
62constexpr float tolerance_num = 0.05f; /**< Tolerance number */
63constexpr float abs_tolerance_convolution_layer_f16 = 2.5f; /**< Tolerance number */
Pablo Tellof1cf3942019-09-19 16:39:04 +010064constexpr float tolerance_num_f16 = 0.15f; /**< Tolerance number */
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010065
66// Input transform
67const auto SmallWinogradInputTransformDatasetNCHW =
68 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x2_3x3(),
69 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_3x1(),
70 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x2_1x3(),
71 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
72 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
73 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010074 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
75 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
76 datasets::SmallWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010077
78const auto SmallWinogradInputTransformDatasetNHWC = framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
Giorgio Arena149fdf32018-07-04 17:03:33 +010079 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
80 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010081 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
82 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
Pablo Tellof1cf3942019-09-19 16:39:04 +010083 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x5(),
84 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_7x1(),
85 datasets::SmallWinogradInputTransformDataset1x2_1x7())))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010086
Michele Di Giorgiof955d512019-02-27 14:26:51 +000087const auto SmallWinogradInputTransformDatasetNHWC_FP32 = framework::dataset::concat(SmallWinogradInputTransformDatasetNHWC,
Pablo Tellof1cf3942019-09-19 16:39:04 +010088 datasets::SmallWinogradInputTransformDataset2x2_7x7());
Michele Di Giorgiof955d512019-02-27 14:26:51 +000089
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010090const auto LargeWinogradInputTransformDatasetNCHW =
91 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x2_3x3(),
92 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x1_3x1(),
93 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x2_1x3(),
94 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
95 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_3x1(),
96 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010097 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
98 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
Georgios Pinitas0c816842019-12-20 15:07:43 +000099 datasets::LargeWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100100
101const auto LargeWinogradInputTransformDatasetNHWC =
102 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100103 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
104 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
105 datasets::LargeWinogradInputTransformDataset1x4_1x5())));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100106
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000107const auto LargeWinogradInputTransformDatasetNHWC_FP32 =
108 framework::dataset::concat(LargeWinogradInputTransformDatasetNHWC,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100109 (datasets::LargeWinogradInputTransformDataset2x2_7x7()));
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000110
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100111// Filter transform
112const auto SmallWinogradFilterTransformDatasetNCHW =
113 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
114 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
115 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100116 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
117 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
118 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100119
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000120const auto SmallWinogradFilterTransformDatasetNHWC_F16 =
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100121 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Giorgio Arena149fdf32018-07-04 17:03:33 +0100122 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
123 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100124 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
125 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
Pablo Tellof1cf3942019-09-19 16:39:04 +0100126 framework::dataset::concat(combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
127 framework::dataset::concat(combine(datasets::Small1x7Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U) })),
128 combine(datasets::Small7x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U) })))))))));
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000129
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000130const auto SmallWinogradFilterTransformDatasetNHWC_F32 =
131 framework::dataset::concat(SmallWinogradFilterTransformDatasetNHWC_F16,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100132 combine(datasets::Small7x7Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U) })));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100133
134const auto LargeWinogradFilterTransformDatasetNCHW =
135 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
136 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
137 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100138 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
139 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
140 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100141
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000142const auto LargeWinogradFilterTransformDatasetNHWC_F16 =
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100143 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100144 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
145 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
146 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
147 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
Pablo Tellof1cf3942019-09-19 16:39:04 +0100148 framework::dataset::concat(combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
149 framework::dataset::concat(combine(datasets::Large7x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U) })),
150 combine(datasets::Large1x7Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U) })))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100151
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000152const auto LargeWinogradFilterTransformDatasetNHWC_F32 =
153 framework::dataset::concat(LargeWinogradFilterTransformDatasetNHWC_F16,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100154 combine(datasets::Large7x7Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U) })));
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000155
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100156// Output transform
157const auto SmallWinogradOutputTransformDatasetNCHW = datasets::SmallWinogradOutputTransformDatasetNCHW();
158
giuros013bfacb22019-04-01 12:07:02 +0100159const auto SmallWinogradOutputTransformDatasetNHWC_F16 = datasets::SmallWinogradOutputTransformDatasetNHWC_F16();
160
161const auto SmallWinogradOutputTransformDatasetNHWC_F32 = datasets::SmallWinogradOutputTransformDatasetNHWC_F32();
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100162
163const auto LargeWinogradOutputTransformDatasetNCHW = datasets::LargeWinogradOutputTransformDatasetNCHW();
164
giuros013bfacb22019-04-01 12:07:02 +0100165const auto LargeWinogradOutputTransformDatasetNHWC_F16 = datasets::LargeWinogradOutputTransformDatasetNHWC_F16();
166
167const auto LargeWinogradOutputTransformDatasetNHWC_F32 = datasets::LargeWinogradOutputTransformDatasetNHWC_F32();
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100168
169//Activation Functions
170const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
171{
172 ActivationLayerInfo(),
173 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
174 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU),
175 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU),
Georgios Pinitas9d6a31c2019-02-25 14:33:25 +0000176 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU)
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100177});
Michalis Spyrou80943252019-01-10 17:19:50 +0000178const auto ActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
179{
180 ActivationLayerInfo(),
181 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU),
Georgios Pinitas9d6a31c2019-02-25 14:33:25 +0000182 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU),
183 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::SOFT_RELU)
Michalis Spyrou80943252019-01-10 17:19:50 +0000184});
Gian Marco Iodicebc6c3742020-10-19 12:49:44 +0100185
186/** Zero padding test */
187bool validate_zero_padding(unsigned int width, unsigned height)
188{
189 TensorShape shape(width, height, 11, 1);
190
191 WinogradInfo winograd_info = WinogradInfo(Size2D(4U, 4U), Size2D(5U, 5U), Size2D(width, height), PadStrideInfo(), DataLayout::NHWC);
192
193 // Create tensors
194 CLTensor src = create_tensor<CLTensor>(shape, DataType::F32, 1, QuantizationInfo(), DataLayout::NHWC);
195 CLTensor dst;
196
197 src.info()->set_quantization_info(QuantizationInfo(1.f / 256.f, 0));
198 dst.info()->set_quantization_info(QuantizationInfo(1.f / 256.f, 0));
199
200 CLWinogradInputTransform input_transform;
201
202 input_transform.configure(&src, &dst, winograd_info);
203
204 // Padding can be added along rhs and bias's X dimension
205 return src.info()->padding().empty() && dst.info()->padding().empty();
206}
207
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000208} // namespace
209
210using namespace arm_compute::misc::shape_calculator;
211
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000212TEST_SUITE(CL)
213TEST_SUITE(Winograd)
214
215TEST_SUITE(InputTransform)
Gian Marco Iodicebc6c3742020-10-19 12:49:44 +0100216
217/** Validate zero padding tests
218 *
219 * A series of validation tests to check that no padding is added
220 */
221DATA_TEST_CASE(ValidateZeroPadding, framework::DatasetMode::ALL, zip(
222framework::dataset::make("Width", { 32U, 37U, 12U, 1U }),
223framework::dataset::make("Height", { 13U, 27U, 19U, 1U })),
224width, height)
225{
226 bool status = validate_zero_padding(width, height);
227 ARM_COMPUTE_EXPECT(status, framework::LogLevel::ERRORS);
228}
229
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000230DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000231 framework::dataset::make("InputInfo",{
232 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F16), // F16 not supported
233 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
234 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
235 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Strides not supported
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000236 TensorInfo(TensorShape(53U, 33U, 4U), 1, DataType::F32), // Padding needed
237 TensorInfo(TensorShape(34U, 42U, 7U, 3U), 1, DataType::F32), // Padding needed
238 TensorInfo(TensorShape(31U, 37U, 37U), 1, DataType::F32) // Padding needed
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000239 }),
240 framework::dataset::make("OutputInfo", {
241 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F16),
242 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::QASYMM8),
243 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F32),
244 TensorInfo(TensorShape(5U, 1U, 16U, 3U), 1, DataType::F32),
245 TensorInfo(TensorShape(4U, 442U, 16U), 1, DataType::F32),
246 TensorInfo(TensorShape(7U, 320U, 16U, 3U), 1, DataType::F32),
247 TensorInfo(TensorShape(37U, 304U, 16U), 1, DataType::F32)
248 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000249 framework::dataset::make("WinogradInfo", {
250 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 0), DataLayout::NCHW),
251 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
252 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
253 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(2, 1, 1, 1), DataLayout::NCHW),
254 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 33U), PadStrideInfo(1, 1, 0, 1), DataLayout::NCHW),
255 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(34U, 42U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
256 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(31U, 37U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000257 })),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000258 framework::dataset::make("Expected", { false, false, false, false, false, false, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000259 input_info, output_info, winograd_info, expected)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000260{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000261 ARM_COMPUTE_EXPECT(bool(CLWinogradInputTransform::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), winograd_info)) == expected, framework::LogLevel::ERRORS);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000262}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000263
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100264using CLWinogradInputTransformFixtureFP32 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, float>;
265using CLWinogradInputTransformFixtureFP16 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, half>;
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000266
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100267TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100268TEST_SUITE(FP32)
269FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100270 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
271 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000272{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100273 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000274}
275
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100276FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100277 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
278 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000279{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100280 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000281}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100282TEST_SUITE_END() // FP32
283
284TEST_SUITE(FP16)
285FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
286 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
287 framework::dataset::make("DataType", { DataType::F16 })))
288{
289 validate(CLAccessor(_target), _reference, tolerance_f16);
290}
291
292FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
293 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
294 framework::dataset::make("DataType", { DataType::F16 })))
295{
296 validate(CLAccessor(_target), _reference, tolerance_f16);
297}
298TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100299TEST_SUITE_END() // NCHW
300
301TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100302TEST_SUITE(FP16)
303FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
304 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
305 framework::dataset::make("DataType", { DataType::F16 })))
306{
Pablo Tellof1cf3942019-09-19 16:39:04 +0100307 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100308}
309
310FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
311 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
312 framework::dataset::make("DataType", { DataType::F16 })))
313{
Pablo Tellof1cf3942019-09-19 16:39:04 +0100314 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100315}
316TEST_SUITE_END() // FP16
317TEST_SUITE(FP32)
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000318FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC_FP32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100319 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
320 framework::dataset::make("DataType", { DataType::F32 })))
321{
322 validate(CLAccessor(_target), _reference, tolerance_f32);
323}
324
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000325FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC_FP32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100326 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
327 framework::dataset::make("DataType", { DataType::F32 })))
328{
329 validate(CLAccessor(_target), _reference, tolerance_f32);
330}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100331TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100332TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000333TEST_SUITE_END() // InputTransform
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000334
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000335TEST_SUITE(FilterTransform)
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000336DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000337 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100338 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F16), // F16 supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000339 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
340 TensorInfo(TensorShape(5U, 5U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000341 TensorInfo(TensorShape(3U, 3U), 1, DataType::F32), // Output tile not supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000342 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F32), // valid
343 TensorInfo(TensorShape(3U, 3U, 37U, 2U), 1, DataType::F32), // valid
344 TensorInfo(TensorShape(3U, 3U, 37U, 22U), 1, DataType::F32) // valid
345 }),
346 framework::dataset::make("OutputInfo", {
347 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F16),
348 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::QASYMM8),
349 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
350 TensorInfo(TensorShape(1U, 1U, 16U), 1, DataType::F32),
351 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
352 TensorInfo(TensorShape(2U, 37U, 16U), 1, DataType::F32),
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000353 TensorInfo(TensorShape(22U, 37U, 36U), 1, DataType::F32)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000354 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000355 framework::dataset::make("WinogradInfo", {
356 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
357 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
358 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
359 WinogradInfo(Size2D(3U, 3U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
360 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
361 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
362 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ )
363 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100364 framework::dataset::make("Expected", { true, false, false, false, true, true, true })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000365 input_info, output_info, winograd_info, expected)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000366{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000367 ARM_COMPUTE_EXPECT(bool(CLWinogradFilterTransformKernel::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), winograd_info)) == expected, framework::LogLevel::ERRORS);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000368}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000369
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000370using CLWinogradFilterTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradFilterTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100371using CLWinogradFilterTransformFixtureFP32 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, float>;
372using CLWinogradFilterTransformFixtureFP16 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, half>;
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000373
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100374TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100375TEST_SUITE(FP32)
376FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100377 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
378 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
379 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000380{
381 // Validate output
382 validate(CLAccessor(_target), _reference, tolerance_f32);
383}
384
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100385FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100386 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
387 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
388 framework::dataset::make("DataType", { DataType::F32 })))
389{
390 // Validate output
391 validate(CLAccessor(_target), _reference, tolerance_f32);
392}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100393TEST_SUITE_END() // FP32
394TEST_SUITE(FP16)
395FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
396 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
397 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
398 framework::dataset::make("DataType", { DataType::F16 })))
399{
400 // Validate output
401 validate(CLAccessor(_target), _reference, tolerance_f16);
402}
403
404FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
405 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
406 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
407 framework::dataset::make("DataType", { DataType::F16 })))
408{
409 // Validate output
410 validate(CLAccessor(_target), _reference, tolerance_f16);
411}
412TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100413TEST_SUITE_END() // NCHW
414
415TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100416TEST_SUITE(FP16)
417FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000418 combine(combine(SmallWinogradFilterTransformDatasetNHWC_F16,
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100419 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
420 framework::dataset::make("DataType", { DataType::F16 })))
421{
422 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100423 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100424}
425
426FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000427 combine(combine(LargeWinogradFilterTransformDatasetNHWC_F16,
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100428 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
429 framework::dataset::make("DataType", { DataType::F16 })))
430{
431 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100432 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100433}
434TEST_SUITE_END() // FP16
435TEST_SUITE(FP32)
436FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000437 combine(combine(SmallWinogradFilterTransformDatasetNHWC_F32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100438 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
439 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000440{
441 // Validate output
442 validate(CLAccessor(_target), _reference, tolerance_f32);
443}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000444
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100445FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000446 combine(combine(LargeWinogradFilterTransformDatasetNHWC_F32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100447 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
448 framework::dataset::make("DataType", { DataType::F32 })))
449{
450 // Validate output
451 validate(CLAccessor(_target), _reference, tolerance_f32);
452}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100453TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100454TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000455TEST_SUITE_END() // FilterTransform
456
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000457TEST_SUITE(OutputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000458DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000459 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100460 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F16), // F16 supported
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000461 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::QASYMM8), // QASYMM8 not supported
462 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Kernel size not supported
463 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Valid
464 TensorInfo(TensorShape(13U, 108U, 16U, 4U), 1, DataType::F32), // Padding needed
465 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Valid
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100466 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Wrong WinogradInfo
467 TensorInfo(TensorShape(7U, 256U, 36U, 3U), 1, DataType::F32), // Valid
468 TensorInfo(TensorShape(7U, 256U, 16U, 3U), 1, DataType::F32) // Wrong number of batches
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000469 }),
470 framework::dataset::make("BiasInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000471 TensorInfo(TensorShape(512U), 1, DataType::F16),
472 TensorInfo(TensorShape(512U), 1, DataType::QASYMM8),
473 TensorInfo(TensorShape(512U), 1, DataType::F32),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000474 TensorInfo(TensorShape(512U), 1, DataType::F32),
475 TensorInfo(TensorShape(13U), 1, DataType::F32),
476 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100477 TensorInfo(TensorShape(7U), 1, DataType::F32),
478 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000479 TensorInfo(TensorShape(7U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000480 })),
481 framework::dataset::make("OutputInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000482 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F16),
483 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::QASYMM8),
484 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
485 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
486 TensorInfo(TensorShape(17U, 23U, 13U, 4U), 1, DataType::F32),
487 TensorInfo(TensorShape(8U, 10U, 7U, 7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100488 TensorInfo(TensorShape(7U, 9U, 7U, 7U), 1, DataType::F32),
489 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32),
490 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000491 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000492 framework::dataset::make("WinogradInfo", {
493 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
494 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
495 WinogradInfo(Size2D(2U, 2U), Size2D(5U, 5U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
496 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
497 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(17U, 23U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
498 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
499 WinogradInfo(Size2D(2U, 3U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100500 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
501 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000502 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100503 framework::dataset::make("Expected", { true, false, false, true, false, true, false, true, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000504 input_info, bias_info, output_info, winograd_info, expected)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000505{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000506 ARM_COMPUTE_EXPECT(bool(CLWinogradOutputTransformKernel::validate(&input_info.clone()->set_is_resizable(false), &bias_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), winograd_info)) == expected, framework::LogLevel::ERRORS);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000507}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000508
509using CLWinogradOutputTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradOutputTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100510using CLWinogradOutputTransformFixtureFP32 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, float>;
511using CLWinogradOutputTransformFixtureFP16 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, half>;
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000512
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100513TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100514TEST_SUITE(FP16)
515FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100516 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
517 framework::dataset::make("DataType", { DataType::F16 })),
518 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100519{
520 // Validate output
521 validate(CLAccessor(_target), _reference, tolerance_f16);
522}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000523
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100524FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100525 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
526 framework::dataset::make("DataType", { DataType::F16 })),
527 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100528{
529 // Validate output
530 validate(CLAccessor(_target), _reference, tolerance_f16);
531}
532TEST_SUITE_END() // FP16
533TEST_SUITE(FP32)
534FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100535 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
536 framework::dataset::make("DataType", { DataType::F32 })),
537 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000538{
539 // Validate output
540 validate(CLAccessor(_target), _reference, tolerance_f32);
541}
542
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100543FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100544 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
545 framework::dataset::make("DataType", { DataType::F32 })),
546 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100547{
548 // Validate output
549 validate(CLAccessor(_target), _reference, tolerance_f32);
550}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100551TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100552TEST_SUITE_END() // NCHW
553
554TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100555TEST_SUITE(FP16)
556FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
giuros013bfacb22019-04-01 12:07:02 +0100557 combine(combine(SmallWinogradOutputTransformDatasetNHWC_F16,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100558 framework::dataset::make("DataType", { DataType::F16 })),
559 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100560{
561 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100562 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100563}
564
565FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
giuros013bfacb22019-04-01 12:07:02 +0100566 combine(combine(LargeWinogradOutputTransformDatasetNHWC_F16,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100567 framework::dataset::make("DataType", { DataType::F16 })),
568 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100569{
570 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100571 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100572}
573TEST_SUITE_END() // FP16
574TEST_SUITE(FP32)
575FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
giuros013bfacb22019-04-01 12:07:02 +0100576 combine(combine(SmallWinogradOutputTransformDatasetNHWC_F32,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100577 framework::dataset::make("DataType", { DataType::F32 })),
578 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000579{
580 // Validate output
581 validate(CLAccessor(_target), _reference, tolerance_f32);
582}
583
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100584FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
giuros013bfacb22019-04-01 12:07:02 +0100585 combine(combine(LargeWinogradOutputTransformDatasetNHWC_F32,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100586 framework::dataset::make("DataType", { DataType::F32 })),
587 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100588{
589 // Validate output
590 validate(CLAccessor(_target), _reference, tolerance_f32);
591}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100592TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100593TEST_SUITE_END() // NHWC
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000594TEST_SUITE_END() // OutputTransform
595
596TEST_SUITE(ConvolutionLayer)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000597DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
598 framework::dataset::make("InputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100599 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F16), // Insufficient padding
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000600 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Datatype mismatch
601 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Stride y not supported
602 TensorInfo(TensorShape(16U, 16U, 8U), 1, DataType::F32), // Padding needed
603 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32) // Kernel size not supported
604 }),
605 framework::dataset::make("WeightsInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100606 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000607 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::QASYMM8),
608 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
609 TensorInfo(TensorShape(3U, 3U, 8U, 16U), 1, DataType::F32),
610 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16)
611 })),
612 framework::dataset::make("BiasesInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100613 TensorInfo(TensorShape(19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000614 TensorInfo(TensorShape(19U), 1, DataType::F32),
615 TensorInfo(TensorShape(21U), 1, DataType::F32),
616 TensorInfo(TensorShape(16U), 1, DataType::F32),
617 TensorInfo(TensorShape(16U), 1, DataType::F32)
618 })),
619 framework::dataset::make("OutputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100620 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000621 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
622 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
623 TensorInfo(TensorShape(16U, 16U, 16U), 1, DataType::F32),
624 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32)
625 })),
626 framework::dataset::make("ConvInfo", {
627 PadStrideInfo(1, 1, 1, 1),
628 PadStrideInfo(1, 1, 1, 1),
629 PadStrideInfo(1, 2, 0, 0),
630 PadStrideInfo(1, 1, 1, 1),
631 PadStrideInfo(1, 1, 1, 0)
632 })),
633 framework::dataset::make("Expected", { false, false, false, false, false })),
634 input_info, weights_info, bias_info, output_info, conv_info, expected)
635{
636 ARM_COMPUTE_EXPECT(bool(CLWinogradConvolutionLayer::validate(&input_info.clone()->set_is_resizable(false), &weights_info.clone()->set_is_resizable(false), &bias_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), conv_info)) == expected, framework::LogLevel::ERRORS);
637}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000638
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100639TEST_SUITE(FP32)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100640using CLWinogradConvolutionLayerFastMathFixture = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, float>;
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100641TEST_SUITE(Conv3x3)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100642FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100643 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
644 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000645 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100646 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100647{
648 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100649 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100650}
651
652FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100653 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
654 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100655 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100656 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100657{
658 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100659 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100660}
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100661TEST_SUITE_END() // Conv3x3
662
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100663TEST_SUITE(Conv3x1)
664FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
665 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
666 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000667 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100668 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100669{
670 // Validate output
671 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
672}
673
674FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
675 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
676 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100677 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100678 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100679{
680 // Validate output
681 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
682}
683TEST_SUITE_END() // Conv3x1
684
685TEST_SUITE(Conv1x3)
686FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
687 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
688 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000689 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100690 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100691{
692 // Validate output
693 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
694}
695
696FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
697 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
698 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100699 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100700 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100701{
702 // Validate output
703 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
704}
705TEST_SUITE_END() // Conv1x3
706
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100707TEST_SUITE(Conv5x5)
708FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100709 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
710 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000711 ActivationFunctionsSmallDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100712 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100713
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100714{
715 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100716 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100717}
718
719FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100720 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
721 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100722 ActivationFunctionsDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100723 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100724
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100725{
726 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100727 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100728}
729TEST_SUITE_END() // Conv5x5
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100730
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100731TEST_SUITE(Conv5x1)
732FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
733 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
734 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000735 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100736 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100737
738{
739 // Validate output
740 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
741}
742
743FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
744 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
745 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100746 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100747 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100748
749{
750 // Validate output
751 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
752}
753TEST_SUITE_END() // Conv5x1
754
755TEST_SUITE(Conv1x5)
756FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
757 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
758 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000759 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100760 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100761
762{
763 // Validate output
764 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
765}
766
767FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
768 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
769 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100770 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100771 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100772
773{
774 // Validate output
775 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
776}
777TEST_SUITE_END() // Conv1x5
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100778TEST_SUITE_END() // FP32
779
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000780
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100781TEST_SUITE(FP16)
782
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000783using CLWinogradConvolutionLayerFastMathFixture16 = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, half, float>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100784TEST_SUITE(Conv3x3)
785FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
786 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
787 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000788 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100789 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
790{
791 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100792 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100793}
794
795FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
796 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
797 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100798 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100799 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
800{
801 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000802 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100803}
804TEST_SUITE_END() // Conv3x3
805
806TEST_SUITE(Conv3x1)
807FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
808 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
809 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000810 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100811 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
812{
813 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100814 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100815}
816
817FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
818 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
819 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100820 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100821 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
822{
823 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000824 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100825}
826TEST_SUITE_END() // Conv3x1
827
828TEST_SUITE(Conv1x3)
829FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
830 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
831 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000832 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100833 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
834{
835 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100836 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100837}
838
839FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
840 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
841 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100842 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100843 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
844{
845 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000846 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100847}
848TEST_SUITE_END() // Conv1x3
849
850TEST_SUITE(Conv5x5)
851FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
852 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
853 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000854 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100855 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
856
857{
858 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100859 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100860}
861
862FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
863 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
864 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100865 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100866 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
867
868{
869 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000870 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100871}
872TEST_SUITE_END() // Conv5x5
873
874TEST_SUITE(Conv5x1)
875FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
876 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
877 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000878 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100879 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
880
881{
882 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100883 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100884}
885
886FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
887 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
888 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100889 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100890 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
891
892{
893 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000894 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100895}
896TEST_SUITE_END() // Conv5x1
897
898TEST_SUITE(Conv1x5)
899FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
900 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
901 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000902 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100903 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
904
905{
906 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100907 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100908}
909
910FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
911 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
912 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100913 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100914 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
915
916{
917 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000918 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100919}
920TEST_SUITE_END() // Conv1x5
921
Pablo Tellof1cf3942019-09-19 16:39:04 +0100922TEST_SUITE(Conv1x7)
923FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
924 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x7Dataset(),
925 framework::dataset::make("DataType", { DataType::F16 })),
926 ActivationFunctionsSmallDataset),
927 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
928
929{
930 // Validate output
931 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
932}
933
934FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
935 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x7Dataset(),
936 framework::dataset::make("DataType", { DataType::F16 })),
937 ActivationFunctionsDataset),
938 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
939
940{
941 // Validate output
942 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
943}
944TEST_SUITE_END() // Conv1x7
945
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100946TEST_SUITE_END() // FP16
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000947
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000948TEST_SUITE_END() // ConvolutionLayer
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000949TEST_SUITE_END() // Winograd
950TEST_SUITE_END() // CL
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000951} // namespace validation
952} // namespace test
953} // namespace arm_compute