blob: 930f7aa8ceaac939499a7dd9ce39fe0667c6a2e2 [file] [log] [blame]
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00001/*
2 * Copyright (c) 2018 ARM Limited.
3 *
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
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +010057constexpr AbsoluteTolerance<float> tolerance_f32(0.001f);
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));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010061
62// Input transform
63const auto SmallWinogradInputTransformDatasetNCHW =
64 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x2_3x3(),
65 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_3x1(),
66 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x2_1x3(),
67 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
68 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
69 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010070 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
71 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
72 datasets::SmallWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010073
74const auto SmallWinogradInputTransformDatasetNHWC = framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
Giorgio Arena149fdf32018-07-04 17:03:33 +010075 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
76 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010077 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
78 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
79 datasets::SmallWinogradInputTransformDataset1x4_1x5())))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010080
81const auto LargeWinogradInputTransformDatasetNCHW =
82 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x2_3x3(),
83 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x1_3x1(),
84 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x2_1x3(),
85 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
86 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_3x1(),
87 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010088 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
89 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
90 datasets::LargeWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010091
92const auto LargeWinogradInputTransformDatasetNHWC =
93 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010094 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
95 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
96 datasets::LargeWinogradInputTransformDataset1x4_1x5())));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010097
98// Filter transform
99const auto SmallWinogradFilterTransformDatasetNCHW =
100 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
101 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
102 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100103 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
104 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
105 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100106
107const auto SmallWinogradFilterTransformDatasetNHWC =
108 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Giorgio Arena149fdf32018-07-04 17:03:33 +0100109 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
110 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100111 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
112 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
113 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100114
115const auto LargeWinogradFilterTransformDatasetNCHW =
116 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
117 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
118 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100119 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
120 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
121 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100122
123const auto LargeWinogradFilterTransformDatasetNHWC =
124 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100125 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
126 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
127 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
128 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
129 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100130
131// Output transform
132const auto SmallWinogradOutputTransformDatasetNCHW = datasets::SmallWinogradOutputTransformDatasetNCHW();
133
134const auto SmallWinogradOutputTransformDatasetNHWC = datasets::SmallWinogradOutputTransformDatasetNHWC();
135
136const auto LargeWinogradOutputTransformDatasetNCHW = datasets::LargeWinogradOutputTransformDatasetNCHW();
137
138const auto LargeWinogradOutputTransformDatasetNHWC = datasets::LargeWinogradOutputTransformDatasetNHWC();
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000139} // namespace
140
141using namespace arm_compute::misc::shape_calculator;
142
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000143TEST_SUITE(CL)
144TEST_SUITE(Winograd)
145
146TEST_SUITE(InputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000147DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000148 framework::dataset::make("InputInfo",{
149 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F16), // F16 not supported
150 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
151 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
152 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Strides not supported
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000153 TensorInfo(TensorShape(53U, 33U, 4U), 1, DataType::F32), // Padding needed
154 TensorInfo(TensorShape(34U, 42U, 7U, 3U), 1, DataType::F32), // Padding needed
155 TensorInfo(TensorShape(31U, 37U, 37U), 1, DataType::F32) // Padding needed
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000156 }),
157 framework::dataset::make("OutputInfo", {
158 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F16),
159 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::QASYMM8),
160 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F32),
161 TensorInfo(TensorShape(5U, 1U, 16U, 3U), 1, DataType::F32),
162 TensorInfo(TensorShape(4U, 442U, 16U), 1, DataType::F32),
163 TensorInfo(TensorShape(7U, 320U, 16U, 3U), 1, DataType::F32),
164 TensorInfo(TensorShape(37U, 304U, 16U), 1, DataType::F32)
165 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000166 framework::dataset::make("WinogradInfo", {
167 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 0), DataLayout::NCHW),
168 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
169 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
170 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(2, 1, 1, 1), DataLayout::NCHW),
171 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 33U), PadStrideInfo(1, 1, 0, 1), DataLayout::NCHW),
172 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(34U, 42U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
173 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(31U, 37U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000174 })),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000175 framework::dataset::make("Expected", { false, false, false, false, false, false, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000176 input_info, output_info, winograd_info, expected)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000177{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000178 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 +0000179}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000180
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100181using CLWinogradInputTransformFixtureFP32 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, float>;
182using CLWinogradInputTransformFixtureFP16 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, half>;
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000183
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100184TEST_SUITE(NCHW)
185DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNCHW,
186 LargeWinogradInputTransformDatasetNCHW),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000187 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100188 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000189 shape_in, winograd_info, data_layout, data_type)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000190{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100191 TensorInfo tensor_info_in(shape_in, 1, data_type);
192 tensor_info_in.set_data_layout(data_layout);
193
194 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000195
196 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100197 CLTensor in = create_tensor<CLTensor>(shape_in, data_type, 1, QuantizationInfo(), data_layout);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000198 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
199
200 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
201 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
202
203 // Create and configure function
204 CLWinogradInputTransform winograd_input_transform;
205
206 // Configure the function
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000207 winograd_input_transform.configure(&in, &out, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000208}
209
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100210TEST_SUITE(FP32)
211FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100212 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
213 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000214{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100215 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000216}
217
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100218FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100219 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
220 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000221{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100222 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000223}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100224TEST_SUITE_END() // FP32
225
226TEST_SUITE(FP16)
227FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
228 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
229 framework::dataset::make("DataType", { DataType::F16 })))
230{
231 validate(CLAccessor(_target), _reference, tolerance_f16);
232}
233
234FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
235 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
236 framework::dataset::make("DataType", { DataType::F16 })))
237{
238 validate(CLAccessor(_target), _reference, tolerance_f16);
239}
240TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100241TEST_SUITE_END() // NCHW
242
243TEST_SUITE(NHWC)
244DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNHWC,
245 LargeWinogradInputTransformDatasetNHWC),
246 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100247 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100248 shape_in, winograd_info, data_layout, data_type)
249{
250 TensorShape shape_in_nhwc(shape_in);
251
252 // Convert the shape to NHWC
253 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
254
255 // TensorInfo
256 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
257 tensor_info_in.set_data_layout(data_layout);
258
259 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
260
261 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100262 CLTensor in = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100263 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
264
265 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
266 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
267
268 // Create and configure function
269 CLWinogradInputTransform winograd_input_transform;
270
271 // Configure the function
272 winograd_input_transform.configure(&in, &out, winograd_info);
273}
274
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100275TEST_SUITE(FP16)
276FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
277 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
278 framework::dataset::make("DataType", { DataType::F16 })))
279{
280 validate(CLAccessor(_target), _reference, tolerance_f16);
281}
282
283FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
284 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
285 framework::dataset::make("DataType", { DataType::F16 })))
286{
287 validate(CLAccessor(_target), _reference, tolerance_f16);
288}
289TEST_SUITE_END() // FP16
290TEST_SUITE(FP32)
291FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100292 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
293 framework::dataset::make("DataType", { DataType::F32 })))
294{
295 validate(CLAccessor(_target), _reference, tolerance_f32);
296}
297
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100298FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100299 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
300 framework::dataset::make("DataType", { DataType::F32 })))
301{
302 validate(CLAccessor(_target), _reference, tolerance_f32);
303}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100304TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100305TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000306TEST_SUITE_END() // InputTransform
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000307
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000308TEST_SUITE(FilterTransform)
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000309DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000310 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100311 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F16), // F16 supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000312 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
313 TensorInfo(TensorShape(5U, 5U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000314 TensorInfo(TensorShape(3U, 3U), 1, DataType::F32), // Output tile not supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000315 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F32), // valid
316 TensorInfo(TensorShape(3U, 3U, 37U, 2U), 1, DataType::F32), // valid
317 TensorInfo(TensorShape(3U, 3U, 37U, 22U), 1, DataType::F32) // valid
318 }),
319 framework::dataset::make("OutputInfo", {
320 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F16),
321 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::QASYMM8),
322 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
323 TensorInfo(TensorShape(1U, 1U, 16U), 1, DataType::F32),
324 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
325 TensorInfo(TensorShape(2U, 37U, 16U), 1, DataType::F32),
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000326 TensorInfo(TensorShape(22U, 37U, 36U), 1, DataType::F32)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000327 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000328 framework::dataset::make("WinogradInfo", {
329 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
330 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
331 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
332 WinogradInfo(Size2D(3U, 3U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
333 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
334 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
335 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ )
336 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100337 framework::dataset::make("Expected", { true, false, false, false, true, true, true })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000338 input_info, output_info, winograd_info, expected)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000339{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000340 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 +0000341}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000342
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000343using CLWinogradFilterTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradFilterTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100344using CLWinogradFilterTransformFixtureFP32 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, float>;
345using CLWinogradFilterTransformFixtureFP16 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, half>;
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000346
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100347TEST_SUITE(NCHW)
348DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
349 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNCHW,
350 LargeWinogradFilterTransformDatasetNCHW),
351 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100352 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000353 shape_a, output_tile, data_layout, data_type)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000354{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100355 WinogradInfo winograd_info(output_tile, Size2D(shape_a[0], shape_a[1]), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, data_layout /* Not needed */);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000356
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000357 TensorShape shape_b = compute_winograd_filter_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000358
359 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100360 CLTensor a = create_tensor<CLTensor>(shape_a, data_type, 1, QuantizationInfo(), data_layout);
361 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000362
363 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
364 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
365
366 // Create and configure function
367 CLWinogradFilterTransform winograd_filter_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000368 winograd_filter_transform.configure(&a, &b, winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000369}
370
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100371TEST_SUITE(FP32)
372FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100373 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
374 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
375 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000376{
377 // Validate output
378 validate(CLAccessor(_target), _reference, tolerance_f32);
379}
380
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100381FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100382 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
383 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
384 framework::dataset::make("DataType", { DataType::F32 })))
385{
386 // Validate output
387 validate(CLAccessor(_target), _reference, tolerance_f32);
388}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100389TEST_SUITE_END() // FP32
390TEST_SUITE(FP16)
391FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
392 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
393 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
394 framework::dataset::make("DataType", { DataType::F16 })))
395{
396 // Validate output
397 validate(CLAccessor(_target), _reference, tolerance_f16);
398}
399
400FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
401 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
402 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
403 framework::dataset::make("DataType", { DataType::F16 })))
404{
405 // Validate output
406 validate(CLAccessor(_target), _reference, tolerance_f16);
407}
408TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100409TEST_SUITE_END() // NCHW
410
411TEST_SUITE(NHWC)
412DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
413 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNHWC,
414 LargeWinogradFilterTransformDatasetNHWC),
415 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100416 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100417 shape_in, output_tile, data_layout, data_type)
418{
419 TensorShape shape_in_nhwc(shape_in);
420
421 // Convert the shape to NHWC
422 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
423
424 // TensorInfo
425 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
426 tensor_info_in.set_data_layout(data_layout);
427
428 WinogradInfo winograd_info(output_tile, Size2D(shape_in[0], shape_in[1]), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, data_layout /* Not needed */);
429
430 TensorShape shape_b = compute_winograd_filter_transform_shape(tensor_info_in, winograd_info);
431
432 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100433 CLTensor a = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
434 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100435
436 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
437 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
438
439 // Create and configure function
440 CLWinogradFilterTransform winograd_filter_transform;
441 winograd_filter_transform.configure(&a, &b, winograd_info);
442}
443
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100444TEST_SUITE(FP16)
445FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
446 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
447 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
448 framework::dataset::make("DataType", { DataType::F16 })))
449{
450 // Validate output
451 validate(CLAccessor(_target), _reference, tolerance_f16);
452}
453
454FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
455 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
456 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
457 framework::dataset::make("DataType", { DataType::F16 })))
458{
459 // Validate output
460 validate(CLAccessor(_target), _reference, tolerance_f16);
461}
462TEST_SUITE_END() // FP16
463TEST_SUITE(FP32)
464FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100465 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
466 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
467 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000468{
469 // Validate output
470 validate(CLAccessor(_target), _reference, tolerance_f32);
471}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000472
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100473FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100474 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
475 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
476 framework::dataset::make("DataType", { DataType::F32 })))
477{
478 // Validate output
479 validate(CLAccessor(_target), _reference, tolerance_f32);
480}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100481TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100482TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000483TEST_SUITE_END() // FilterTransform
484
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000485TEST_SUITE(OutputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000486DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000487 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100488 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F16), // F16 supported
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000489 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::QASYMM8), // QASYMM8 not supported
490 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Kernel size not supported
491 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Valid
492 TensorInfo(TensorShape(13U, 108U, 16U, 4U), 1, DataType::F32), // Padding needed
493 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Valid
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100494 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Wrong WinogradInfo
495 TensorInfo(TensorShape(7U, 256U, 36U, 3U), 1, DataType::F32), // Valid
496 TensorInfo(TensorShape(7U, 256U, 16U, 3U), 1, DataType::F32) // Wrong number of batches
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000497 }),
498 framework::dataset::make("BiasInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000499 TensorInfo(TensorShape(512U), 1, DataType::F16),
500 TensorInfo(TensorShape(512U), 1, DataType::QASYMM8),
501 TensorInfo(TensorShape(512U), 1, DataType::F32),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000502 TensorInfo(TensorShape(512U), 1, DataType::F32),
503 TensorInfo(TensorShape(13U), 1, DataType::F32),
504 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100505 TensorInfo(TensorShape(7U), 1, DataType::F32),
506 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000507 TensorInfo(TensorShape(7U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000508 })),
509 framework::dataset::make("OutputInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000510 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F16),
511 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::QASYMM8),
512 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
513 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
514 TensorInfo(TensorShape(17U, 23U, 13U, 4U), 1, DataType::F32),
515 TensorInfo(TensorShape(8U, 10U, 7U, 7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100516 TensorInfo(TensorShape(7U, 9U, 7U, 7U), 1, DataType::F32),
517 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32),
518 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000519 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000520 framework::dataset::make("WinogradInfo", {
521 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
522 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
523 WinogradInfo(Size2D(2U, 2U), Size2D(5U, 5U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
524 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
525 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(17U, 23U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
526 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
527 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 +0100528 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
529 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 +0000530 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100531 framework::dataset::make("Expected", { true, false, false, true, false, true, false, true, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000532 input_info, bias_info, output_info, winograd_info, expected)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000533{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000534 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 +0000535}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000536
537using CLWinogradOutputTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradOutputTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100538using CLWinogradOutputTransformFixtureFP32 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, float>;
539using CLWinogradOutputTransformFixtureFP16 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, half>;
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000540
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100541TEST_SUITE(NCHW)
542DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNCHW,
543 LargeWinogradOutputTransformDatasetNCHW),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100544 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000545 shape_a, winograd_info, data_type)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000546{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000547 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000548
549 // Create tensors
550 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100551 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000552
553 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
554 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
555
556 // Create and configure function
557 CLWinogradOutputTransform winograd_output_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000558 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000559}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100560TEST_SUITE(FP16)
561FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
562 combine(SmallWinogradOutputTransformDatasetNCHW,
563 framework::dataset::make("DataType", { DataType::F16 })))
564{
565 // Validate output
566 validate(CLAccessor(_target), _reference, tolerance_f16);
567}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000568
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100569FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
570 combine(LargeWinogradOutputTransformDatasetNCHW,
571 framework::dataset::make("DataType", { DataType::F16 })))
572{
573 // Validate output
574 validate(CLAccessor(_target), _reference, tolerance_f16);
575}
576TEST_SUITE_END() // FP16
577TEST_SUITE(FP32)
578FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100579 combine(SmallWinogradOutputTransformDatasetNCHW,
580 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000581{
582 // Validate output
583 validate(CLAccessor(_target), _reference, tolerance_f32);
584}
585
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100586FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100587 combine(LargeWinogradOutputTransformDatasetNCHW,
588 framework::dataset::make("DataType", { DataType::F32 })))
589{
590 // Validate output
591 validate(CLAccessor(_target), _reference, tolerance_f32);
592}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100593TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100594TEST_SUITE_END() // NCHW
595
596TEST_SUITE(NHWC)
597DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNHWC,
598 LargeWinogradOutputTransformDatasetNHWC),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100599 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100600 shape_a, winograd_info, data_type)
601{
602 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
603
604 // Create tensors
605 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100606 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100607
608 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
609 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
610
611 // Create and configure function
612 CLWinogradOutputTransform winograd_output_transform;
613 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
614}
615
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100616TEST_SUITE(FP16)
617FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
618 combine(SmallWinogradOutputTransformDatasetNHWC,
619 framework::dataset::make("DataType", { DataType::F16 })))
620{
621 // Validate output
622 validate(CLAccessor(_target), _reference, tolerance_f16);
623}
624
625FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
626 combine(LargeWinogradOutputTransformDatasetNHWC,
627 framework::dataset::make("DataType", { DataType::F16 })))
628{
629 // Validate output
630 validate(CLAccessor(_target), _reference, tolerance_f16);
631}
632TEST_SUITE_END() // FP16
633TEST_SUITE(FP32)
634FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100635 combine(SmallWinogradOutputTransformDatasetNHWC,
636 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000637{
638 // Validate output
639 validate(CLAccessor(_target), _reference, tolerance_f32);
640}
641
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100642FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100643 combine(LargeWinogradOutputTransformDatasetNHWC,
644 framework::dataset::make("DataType", { DataType::F32 })))
645{
646 // Validate output
647 validate(CLAccessor(_target), _reference, tolerance_f32);
648}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100649TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100650TEST_SUITE_END() // NHWC
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000651TEST_SUITE_END() // OutputTransform
652
653TEST_SUITE(ConvolutionLayer)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000654DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
655 framework::dataset::make("InputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100656 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F16), // Insufficient padding
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000657 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Datatype mismatch
658 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Stride y not supported
659 TensorInfo(TensorShape(16U, 16U, 8U), 1, DataType::F32), // Padding needed
660 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32) // Kernel size not supported
661 }),
662 framework::dataset::make("WeightsInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100663 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000664 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::QASYMM8),
665 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
666 TensorInfo(TensorShape(3U, 3U, 8U, 16U), 1, DataType::F32),
667 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16)
668 })),
669 framework::dataset::make("BiasesInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100670 TensorInfo(TensorShape(19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000671 TensorInfo(TensorShape(19U), 1, DataType::F32),
672 TensorInfo(TensorShape(21U), 1, DataType::F32),
673 TensorInfo(TensorShape(16U), 1, DataType::F32),
674 TensorInfo(TensorShape(16U), 1, DataType::F32)
675 })),
676 framework::dataset::make("OutputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100677 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000678 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
679 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
680 TensorInfo(TensorShape(16U, 16U, 16U), 1, DataType::F32),
681 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32)
682 })),
683 framework::dataset::make("ConvInfo", {
684 PadStrideInfo(1, 1, 1, 1),
685 PadStrideInfo(1, 1, 1, 1),
686 PadStrideInfo(1, 2, 0, 0),
687 PadStrideInfo(1, 1, 1, 1),
688 PadStrideInfo(1, 1, 1, 0)
689 })),
690 framework::dataset::make("Expected", { false, false, false, false, false })),
691 input_info, weights_info, bias_info, output_info, conv_info, expected)
692{
693 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);
694}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000695
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100696TEST_SUITE(FP32)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100697using CLWinogradConvolutionLayerFastMathFixture = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, float>;
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100698TEST_SUITE(Conv3x3)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100699FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100700 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
701 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100702 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100703 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100704{
705 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100706 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100707}
708
709FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100710 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
711 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100712 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100713 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100714{
715 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100716 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100717}
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100718TEST_SUITE_END() // Conv3x3
719
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100720TEST_SUITE(Conv3x1)
721FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
722 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
723 framework::dataset::make("DataType", { DataType::F32 })),
724 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100725 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100726{
727 // Validate output
728 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
729}
730
731FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
732 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
733 framework::dataset::make("DataType", { DataType::F32 })),
734 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100735 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100736{
737 // Validate output
738 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
739}
740TEST_SUITE_END() // Conv3x1
741
742TEST_SUITE(Conv1x3)
743FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
744 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
745 framework::dataset::make("DataType", { DataType::F32 })),
746 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100747 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100748{
749 // Validate output
750 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
751}
752
753FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
754 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
755 framework::dataset::make("DataType", { DataType::F32 })),
756 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100757 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100758{
759 // Validate output
760 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
761}
762TEST_SUITE_END() // Conv1x3
763
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100764TEST_SUITE(Conv5x5)
765FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100766 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
767 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100768 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100769 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100770
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100771{
772 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100773 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100774}
775
776FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100777 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
778 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100779 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100780 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100781
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100782{
783 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100784 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100785}
786TEST_SUITE_END() // Conv5x5
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100787
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100788TEST_SUITE(Conv5x1)
789FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
790 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
791 framework::dataset::make("DataType", { DataType::F32 })),
792 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100793 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100794
795{
796 // Validate output
797 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
798}
799
800FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
801 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
802 framework::dataset::make("DataType", { DataType::F32 })),
803 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100804 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100805
806{
807 // Validate output
808 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
809}
810TEST_SUITE_END() // Conv5x1
811
812TEST_SUITE(Conv1x5)
813FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
814 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
815 framework::dataset::make("DataType", { DataType::F32 })),
816 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100817 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100818
819{
820 // Validate output
821 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
822}
823
824FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
825 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
826 framework::dataset::make("DataType", { DataType::F32 })),
827 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100828 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100829
830{
831 // Validate output
832 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
833}
834TEST_SUITE_END() // Conv1x5
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100835TEST_SUITE_END() // FP32
836
Vidhya Sudhan Loganathand307f062018-10-04 09:21:15 +0100837#ifdef WINOGRAD_F16_SUPPORT //to be reintroduced after COMPMID-1266 is resolved
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100838TEST_SUITE(FP16)
839
840using CLWinogradConvolutionLayerFastMathFixture16 = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, half>;
841TEST_SUITE(Conv3x3)
842FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
843 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
844 framework::dataset::make("DataType", { DataType::F16 })),
845 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
846 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
847{
848 // Validate output
849 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
850}
851
852FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
853 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
854 framework::dataset::make("DataType", { DataType::F16 })),
855 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
856 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
857{
858 // Validate output
859 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
860}
861TEST_SUITE_END() // Conv3x3
862
863TEST_SUITE(Conv3x1)
864FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
865 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
866 framework::dataset::make("DataType", { DataType::F16 })),
867 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
868 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
869{
870 // Validate output
871 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
872}
873
874FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
875 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
876 framework::dataset::make("DataType", { DataType::F16 })),
877 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
878 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
879{
880 // Validate output
881 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
882}
883TEST_SUITE_END() // Conv3x1
884
885TEST_SUITE(Conv1x3)
886FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
887 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
888 framework::dataset::make("DataType", { DataType::F16 })),
889 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
890 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
891{
892 // Validate output
893 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
894}
895
896FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
897 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
898 framework::dataset::make("DataType", { DataType::F16 })),
899 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
900 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
901{
902 // Validate output
903 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
904}
905TEST_SUITE_END() // Conv1x3
906
907TEST_SUITE(Conv5x5)
908FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
909 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
910 framework::dataset::make("DataType", { DataType::F16 })),
911 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
912 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
913
914{
915 // Validate output
916 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
917}
918
919FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
920 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
921 framework::dataset::make("DataType", { DataType::F16 })),
922 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
923 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
924
925{
926 // Validate output
927 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
928}
929TEST_SUITE_END() // Conv5x5
930
931TEST_SUITE(Conv5x1)
932FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
933 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
934 framework::dataset::make("DataType", { DataType::F16 })),
935 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
936 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
937
938{
939 // Validate output
940 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
941}
942
943FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
944 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
945 framework::dataset::make("DataType", { DataType::F16 })),
946 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
947 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
948
949{
950 // Validate output
951 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
952}
953TEST_SUITE_END() // Conv5x1
954
955TEST_SUITE(Conv1x5)
956FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
957 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
958 framework::dataset::make("DataType", { DataType::F16 })),
959 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
960 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
961
962{
963 // Validate output
964 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
965}
966
967FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
968 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
969 framework::dataset::make("DataType", { DataType::F16 })),
970 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
971 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
972
973{
974 // Validate output
975 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
976}
977TEST_SUITE_END() // Conv1x5
978
979TEST_SUITE_END() // FP16
Vidhya Sudhan Loganathand307f062018-10-04 09:21:15 +0100980#endif /*#ifdef WINOGRAD_F16_SUPPORT*/
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000981TEST_SUITE_END() // ConvolutionLayer
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000982TEST_SUITE_END() // Winograd
983TEST_SUITE_END() // CL
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000984} // namespace validation
985} // namespace test
986} // namespace arm_compute