blob: f7f06b7f7985f3533e3a2f7a826575c07dd2795e [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));
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 */
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010064
65// Input transform
66const auto SmallWinogradInputTransformDatasetNCHW =
67 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x2_3x3(),
68 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_3x1(),
69 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x2_1x3(),
70 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
71 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
72 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010073 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
74 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
75 datasets::SmallWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010076
77const auto SmallWinogradInputTransformDatasetNHWC = framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
Giorgio Arena149fdf32018-07-04 17:03:33 +010078 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
79 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010080 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
81 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
82 datasets::SmallWinogradInputTransformDataset1x4_1x5())))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010083
84const auto LargeWinogradInputTransformDatasetNCHW =
85 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x2_3x3(),
86 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x1_3x1(),
87 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x2_1x3(),
88 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
89 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_3x1(),
90 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010091 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
92 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
93 datasets::LargeWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010094
95const auto LargeWinogradInputTransformDatasetNHWC =
96 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010097 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
98 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
99 datasets::LargeWinogradInputTransformDataset1x4_1x5())));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100100
101// Filter transform
102const auto SmallWinogradFilterTransformDatasetNCHW =
103 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
104 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
105 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100106 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
107 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
108 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100109
110const auto SmallWinogradFilterTransformDatasetNHWC =
111 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Giorgio Arena149fdf32018-07-04 17:03:33 +0100112 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
113 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100114 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
115 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
116 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100117
118const auto LargeWinogradFilterTransformDatasetNCHW =
119 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
120 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
121 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100122 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
123 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
124 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100125
126const auto LargeWinogradFilterTransformDatasetNHWC =
127 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100128 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
129 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
130 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
131 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
132 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100133
134// Output transform
135const auto SmallWinogradOutputTransformDatasetNCHW = datasets::SmallWinogradOutputTransformDatasetNCHW();
136
137const auto SmallWinogradOutputTransformDatasetNHWC = datasets::SmallWinogradOutputTransformDatasetNHWC();
138
139const auto LargeWinogradOutputTransformDatasetNCHW = datasets::LargeWinogradOutputTransformDatasetNCHW();
140
141const auto LargeWinogradOutputTransformDatasetNHWC = datasets::LargeWinogradOutputTransformDatasetNHWC();
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000142} // namespace
143
144using namespace arm_compute::misc::shape_calculator;
145
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000146TEST_SUITE(CL)
147TEST_SUITE(Winograd)
148
149TEST_SUITE(InputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000150DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000151 framework::dataset::make("InputInfo",{
152 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F16), // F16 not supported
153 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
154 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
155 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Strides not supported
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000156 TensorInfo(TensorShape(53U, 33U, 4U), 1, DataType::F32), // Padding needed
157 TensorInfo(TensorShape(34U, 42U, 7U, 3U), 1, DataType::F32), // Padding needed
158 TensorInfo(TensorShape(31U, 37U, 37U), 1, DataType::F32) // Padding needed
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000159 }),
160 framework::dataset::make("OutputInfo", {
161 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F16),
162 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::QASYMM8),
163 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F32),
164 TensorInfo(TensorShape(5U, 1U, 16U, 3U), 1, DataType::F32),
165 TensorInfo(TensorShape(4U, 442U, 16U), 1, DataType::F32),
166 TensorInfo(TensorShape(7U, 320U, 16U, 3U), 1, DataType::F32),
167 TensorInfo(TensorShape(37U, 304U, 16U), 1, DataType::F32)
168 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000169 framework::dataset::make("WinogradInfo", {
170 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 0), DataLayout::NCHW),
171 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
172 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
173 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(2, 1, 1, 1), DataLayout::NCHW),
174 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 33U), PadStrideInfo(1, 1, 0, 1), DataLayout::NCHW),
175 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(34U, 42U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
176 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(31U, 37U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000177 })),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000178 framework::dataset::make("Expected", { false, false, false, false, false, false, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000179 input_info, output_info, winograd_info, expected)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000180{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000181 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 +0000182}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000183
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100184using CLWinogradInputTransformFixtureFP32 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, float>;
185using CLWinogradInputTransformFixtureFP16 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, half>;
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000186
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100187TEST_SUITE(NCHW)
188DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNCHW,
189 LargeWinogradInputTransformDatasetNCHW),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000190 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100191 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000192 shape_in, winograd_info, data_layout, data_type)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000193{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100194 TensorInfo tensor_info_in(shape_in, 1, data_type);
195 tensor_info_in.set_data_layout(data_layout);
196
197 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000198
199 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100200 CLTensor in = create_tensor<CLTensor>(shape_in, data_type, 1, QuantizationInfo(), data_layout);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000201 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
202
203 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
204 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
205
206 // Create and configure function
207 CLWinogradInputTransform winograd_input_transform;
208
209 // Configure the function
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000210 winograd_input_transform.configure(&in, &out, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000211}
212
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100213TEST_SUITE(FP32)
214FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100215 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
216 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000217{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100218 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000219}
220
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100221FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100222 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
223 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000224{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100225 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000226}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100227TEST_SUITE_END() // FP32
228
229TEST_SUITE(FP16)
230FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
231 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
232 framework::dataset::make("DataType", { DataType::F16 })))
233{
234 validate(CLAccessor(_target), _reference, tolerance_f16);
235}
236
237FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
238 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
239 framework::dataset::make("DataType", { DataType::F16 })))
240{
241 validate(CLAccessor(_target), _reference, tolerance_f16);
242}
243TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100244TEST_SUITE_END() // NCHW
245
246TEST_SUITE(NHWC)
247DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNHWC,
248 LargeWinogradInputTransformDatasetNHWC),
249 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100250 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100251 shape_in, winograd_info, data_layout, data_type)
252{
253 TensorShape shape_in_nhwc(shape_in);
254
255 // Convert the shape to NHWC
256 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
257
258 // TensorInfo
259 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
260 tensor_info_in.set_data_layout(data_layout);
261
262 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
263
264 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100265 CLTensor in = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100266 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
267
268 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
269 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
270
271 // Create and configure function
272 CLWinogradInputTransform winograd_input_transform;
273
274 // Configure the function
275 winograd_input_transform.configure(&in, &out, winograd_info);
276}
277
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100278TEST_SUITE(FP16)
279FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
280 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
281 framework::dataset::make("DataType", { DataType::F16 })))
282{
283 validate(CLAccessor(_target), _reference, tolerance_f16);
284}
285
286FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
287 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
288 framework::dataset::make("DataType", { DataType::F16 })))
289{
290 validate(CLAccessor(_target), _reference, tolerance_f16);
291}
292TEST_SUITE_END() // FP16
293TEST_SUITE(FP32)
294FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100295 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
296 framework::dataset::make("DataType", { DataType::F32 })))
297{
298 validate(CLAccessor(_target), _reference, tolerance_f32);
299}
300
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100301FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100302 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
303 framework::dataset::make("DataType", { DataType::F32 })))
304{
305 validate(CLAccessor(_target), _reference, tolerance_f32);
306}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100307TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100308TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000309TEST_SUITE_END() // InputTransform
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000310
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000311TEST_SUITE(FilterTransform)
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000312DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000313 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100314 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F16), // F16 supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000315 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
316 TensorInfo(TensorShape(5U, 5U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000317 TensorInfo(TensorShape(3U, 3U), 1, DataType::F32), // Output tile not supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000318 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F32), // valid
319 TensorInfo(TensorShape(3U, 3U, 37U, 2U), 1, DataType::F32), // valid
320 TensorInfo(TensorShape(3U, 3U, 37U, 22U), 1, DataType::F32) // valid
321 }),
322 framework::dataset::make("OutputInfo", {
323 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F16),
324 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::QASYMM8),
325 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
326 TensorInfo(TensorShape(1U, 1U, 16U), 1, DataType::F32),
327 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
328 TensorInfo(TensorShape(2U, 37U, 16U), 1, DataType::F32),
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000329 TensorInfo(TensorShape(22U, 37U, 36U), 1, DataType::F32)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000330 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000331 framework::dataset::make("WinogradInfo", {
332 WinogradInfo(Size2D(2U, 2U), 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(3U, 3U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
336 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
337 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
338 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ )
339 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100340 framework::dataset::make("Expected", { true, false, false, false, true, true, true })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000341 input_info, output_info, winograd_info, expected)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000342{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000343 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 +0000344}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000345
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000346using CLWinogradFilterTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradFilterTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100347using CLWinogradFilterTransformFixtureFP32 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, float>;
348using CLWinogradFilterTransformFixtureFP16 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, half>;
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000349
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100350TEST_SUITE(NCHW)
351DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
352 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNCHW,
353 LargeWinogradFilterTransformDatasetNCHW),
354 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100355 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000356 shape_a, output_tile, data_layout, data_type)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000357{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100358 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 +0000359
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000360 TensorShape shape_b = compute_winograd_filter_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000361
362 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100363 CLTensor a = create_tensor<CLTensor>(shape_a, data_type, 1, QuantizationInfo(), data_layout);
364 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000365
366 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
367 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
368
369 // Create and configure function
370 CLWinogradFilterTransform winograd_filter_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000371 winograd_filter_transform.configure(&a, &b, winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000372}
373
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100374TEST_SUITE(FP32)
375FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100376 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
377 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
378 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000379{
380 // Validate output
381 validate(CLAccessor(_target), _reference, tolerance_f32);
382}
383
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100384FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100385 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
386 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
387 framework::dataset::make("DataType", { DataType::F32 })))
388{
389 // Validate output
390 validate(CLAccessor(_target), _reference, tolerance_f32);
391}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100392TEST_SUITE_END() // FP32
393TEST_SUITE(FP16)
394FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
395 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
396 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
397 framework::dataset::make("DataType", { DataType::F16 })))
398{
399 // Validate output
400 validate(CLAccessor(_target), _reference, tolerance_f16);
401}
402
403FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
404 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
405 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
406 framework::dataset::make("DataType", { DataType::F16 })))
407{
408 // Validate output
409 validate(CLAccessor(_target), _reference, tolerance_f16);
410}
411TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100412TEST_SUITE_END() // NCHW
413
414TEST_SUITE(NHWC)
415DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
416 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNHWC,
417 LargeWinogradFilterTransformDatasetNHWC),
418 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100419 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100420 shape_in, output_tile, data_layout, data_type)
421{
422 TensorShape shape_in_nhwc(shape_in);
423
424 // Convert the shape to NHWC
425 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
426
427 // TensorInfo
428 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
429 tensor_info_in.set_data_layout(data_layout);
430
431 WinogradInfo winograd_info(output_tile, Size2D(shape_in[0], shape_in[1]), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, data_layout /* Not needed */);
432
433 TensorShape shape_b = compute_winograd_filter_transform_shape(tensor_info_in, winograd_info);
434
435 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100436 CLTensor a = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
437 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100438
439 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
440 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
441
442 // Create and configure function
443 CLWinogradFilterTransform winograd_filter_transform;
444 winograd_filter_transform.configure(&a, &b, winograd_info);
445}
446
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100447TEST_SUITE(FP16)
448FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
449 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
450 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
451 framework::dataset::make("DataType", { DataType::F16 })))
452{
453 // Validate output
454 validate(CLAccessor(_target), _reference, tolerance_f16);
455}
456
457FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
458 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
459 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
460 framework::dataset::make("DataType", { DataType::F16 })))
461{
462 // Validate output
463 validate(CLAccessor(_target), _reference, tolerance_f16);
464}
465TEST_SUITE_END() // FP16
466TEST_SUITE(FP32)
467FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100468 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
469 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
470 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000471{
472 // Validate output
473 validate(CLAccessor(_target), _reference, tolerance_f32);
474}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000475
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100476FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100477 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
478 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
479 framework::dataset::make("DataType", { DataType::F32 })))
480{
481 // Validate output
482 validate(CLAccessor(_target), _reference, tolerance_f32);
483}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100484TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100485TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000486TEST_SUITE_END() // FilterTransform
487
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000488TEST_SUITE(OutputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000489DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000490 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100491 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F16), // F16 supported
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000492 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::QASYMM8), // QASYMM8 not supported
493 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Kernel size not supported
494 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Valid
495 TensorInfo(TensorShape(13U, 108U, 16U, 4U), 1, DataType::F32), // Padding needed
496 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Valid
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100497 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Wrong WinogradInfo
498 TensorInfo(TensorShape(7U, 256U, 36U, 3U), 1, DataType::F32), // Valid
499 TensorInfo(TensorShape(7U, 256U, 16U, 3U), 1, DataType::F32) // Wrong number of batches
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000500 }),
501 framework::dataset::make("BiasInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000502 TensorInfo(TensorShape(512U), 1, DataType::F16),
503 TensorInfo(TensorShape(512U), 1, DataType::QASYMM8),
504 TensorInfo(TensorShape(512U), 1, DataType::F32),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000505 TensorInfo(TensorShape(512U), 1, DataType::F32),
506 TensorInfo(TensorShape(13U), 1, DataType::F32),
507 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100508 TensorInfo(TensorShape(7U), 1, DataType::F32),
509 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000510 TensorInfo(TensorShape(7U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000511 })),
512 framework::dataset::make("OutputInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000513 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F16),
514 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::QASYMM8),
515 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
516 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
517 TensorInfo(TensorShape(17U, 23U, 13U, 4U), 1, DataType::F32),
518 TensorInfo(TensorShape(8U, 10U, 7U, 7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100519 TensorInfo(TensorShape(7U, 9U, 7U, 7U), 1, DataType::F32),
520 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32),
521 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000522 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000523 framework::dataset::make("WinogradInfo", {
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(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
526 WinogradInfo(Size2D(2U, 2U), Size2D(5U, 5U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
527 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
528 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(17U, 23U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
529 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
530 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 +0100531 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
532 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 +0000533 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100534 framework::dataset::make("Expected", { true, false, false, true, false, true, false, true, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000535 input_info, bias_info, output_info, winograd_info, expected)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000536{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000537 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 +0000538}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000539
540using CLWinogradOutputTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradOutputTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100541using CLWinogradOutputTransformFixtureFP32 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, float>;
542using CLWinogradOutputTransformFixtureFP16 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, half>;
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000543
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100544TEST_SUITE(NCHW)
545DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNCHW,
546 LargeWinogradOutputTransformDatasetNCHW),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100547 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000548 shape_a, winograd_info, data_type)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000549{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000550 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000551
552 // Create tensors
553 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100554 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000555
556 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
557 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
558
559 // Create and configure function
560 CLWinogradOutputTransform winograd_output_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000561 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000562}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100563TEST_SUITE(FP16)
564FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
565 combine(SmallWinogradOutputTransformDatasetNCHW,
566 framework::dataset::make("DataType", { DataType::F16 })))
567{
568 // Validate output
569 validate(CLAccessor(_target), _reference, tolerance_f16);
570}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000571
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100572FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
573 combine(LargeWinogradOutputTransformDatasetNCHW,
574 framework::dataset::make("DataType", { DataType::F16 })))
575{
576 // Validate output
577 validate(CLAccessor(_target), _reference, tolerance_f16);
578}
579TEST_SUITE_END() // FP16
580TEST_SUITE(FP32)
581FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100582 combine(SmallWinogradOutputTransformDatasetNCHW,
583 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000584{
585 // Validate output
586 validate(CLAccessor(_target), _reference, tolerance_f32);
587}
588
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100589FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100590 combine(LargeWinogradOutputTransformDatasetNCHW,
591 framework::dataset::make("DataType", { DataType::F32 })))
592{
593 // Validate output
594 validate(CLAccessor(_target), _reference, tolerance_f32);
595}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100596TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100597TEST_SUITE_END() // NCHW
598
599TEST_SUITE(NHWC)
600DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNHWC,
601 LargeWinogradOutputTransformDatasetNHWC),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100602 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100603 shape_a, winograd_info, data_type)
604{
605 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
606
607 // Create tensors
608 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100609 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100610
611 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
612 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
613
614 // Create and configure function
615 CLWinogradOutputTransform winograd_output_transform;
616 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
617}
618
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100619TEST_SUITE(FP16)
620FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
621 combine(SmallWinogradOutputTransformDatasetNHWC,
622 framework::dataset::make("DataType", { DataType::F16 })))
623{
624 // Validate output
625 validate(CLAccessor(_target), _reference, tolerance_f16);
626}
627
628FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
629 combine(LargeWinogradOutputTransformDatasetNHWC,
630 framework::dataset::make("DataType", { DataType::F16 })))
631{
632 // Validate output
633 validate(CLAccessor(_target), _reference, tolerance_f16);
634}
635TEST_SUITE_END() // FP16
636TEST_SUITE(FP32)
637FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100638 combine(SmallWinogradOutputTransformDatasetNHWC,
639 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000640{
641 // Validate output
642 validate(CLAccessor(_target), _reference, tolerance_f32);
643}
644
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100645FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100646 combine(LargeWinogradOutputTransformDatasetNHWC,
647 framework::dataset::make("DataType", { DataType::F32 })))
648{
649 // Validate output
650 validate(CLAccessor(_target), _reference, tolerance_f32);
651}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100652TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100653TEST_SUITE_END() // NHWC
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000654TEST_SUITE_END() // OutputTransform
655
656TEST_SUITE(ConvolutionLayer)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000657DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
658 framework::dataset::make("InputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100659 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F16), // Insufficient padding
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000660 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Datatype mismatch
661 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Stride y not supported
662 TensorInfo(TensorShape(16U, 16U, 8U), 1, DataType::F32), // Padding needed
663 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32) // Kernel size not supported
664 }),
665 framework::dataset::make("WeightsInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100666 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000667 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::QASYMM8),
668 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
669 TensorInfo(TensorShape(3U, 3U, 8U, 16U), 1, DataType::F32),
670 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16)
671 })),
672 framework::dataset::make("BiasesInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100673 TensorInfo(TensorShape(19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000674 TensorInfo(TensorShape(19U), 1, DataType::F32),
675 TensorInfo(TensorShape(21U), 1, DataType::F32),
676 TensorInfo(TensorShape(16U), 1, DataType::F32),
677 TensorInfo(TensorShape(16U), 1, DataType::F32)
678 })),
679 framework::dataset::make("OutputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100680 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000681 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
682 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
683 TensorInfo(TensorShape(16U, 16U, 16U), 1, DataType::F32),
684 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32)
685 })),
686 framework::dataset::make("ConvInfo", {
687 PadStrideInfo(1, 1, 1, 1),
688 PadStrideInfo(1, 1, 1, 1),
689 PadStrideInfo(1, 2, 0, 0),
690 PadStrideInfo(1, 1, 1, 1),
691 PadStrideInfo(1, 1, 1, 0)
692 })),
693 framework::dataset::make("Expected", { false, false, false, false, false })),
694 input_info, weights_info, bias_info, output_info, conv_info, expected)
695{
696 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);
697}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000698
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100699TEST_SUITE(FP32)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100700using CLWinogradConvolutionLayerFastMathFixture = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, float>;
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100701TEST_SUITE(Conv3x3)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100702FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100703 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
704 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100705 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100706 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100707{
708 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100709 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100710}
711
712FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100713 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
714 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100715 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100716 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100717{
718 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100719 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100720}
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100721TEST_SUITE_END() // Conv3x3
722
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100723TEST_SUITE(Conv3x1)
724FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
725 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
726 framework::dataset::make("DataType", { DataType::F32 })),
727 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100728 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100729{
730 // Validate output
731 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
732}
733
734FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
735 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
736 framework::dataset::make("DataType", { DataType::F32 })),
737 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100738 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100739{
740 // Validate output
741 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
742}
743TEST_SUITE_END() // Conv3x1
744
745TEST_SUITE(Conv1x3)
746FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
747 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
748 framework::dataset::make("DataType", { DataType::F32 })),
749 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100750 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100751{
752 // Validate output
753 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
754}
755
756FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
757 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
758 framework::dataset::make("DataType", { DataType::F32 })),
759 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100760 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100761{
762 // Validate output
763 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
764}
765TEST_SUITE_END() // Conv1x3
766
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100767TEST_SUITE(Conv5x5)
768FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100769 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
770 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100771 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100772 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100773
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100774{
775 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100776 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100777}
778
779FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100780 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
781 framework::dataset::make("DataType", { DataType::F32 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100782 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100783 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100784
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100785{
786 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100787 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100788}
789TEST_SUITE_END() // Conv5x5
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100790
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100791TEST_SUITE(Conv5x1)
792FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
793 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
794 framework::dataset::make("DataType", { DataType::F32 })),
795 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100796 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100797
798{
799 // Validate output
800 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
801}
802
803FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
804 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
805 framework::dataset::make("DataType", { DataType::F32 })),
806 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100807 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100808
809{
810 // Validate output
811 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
812}
813TEST_SUITE_END() // Conv5x1
814
815TEST_SUITE(Conv1x5)
816FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
817 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
818 framework::dataset::make("DataType", { DataType::F32 })),
819 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100820 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100821
822{
823 // Validate output
824 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
825}
826
827FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
828 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
829 framework::dataset::make("DataType", { DataType::F32 })),
830 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100831 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100832
833{
834 // Validate output
835 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
836}
837TEST_SUITE_END() // Conv1x5
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100838TEST_SUITE_END() // FP32
839
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000840
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100841TEST_SUITE(FP16)
842
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000843using CLWinogradConvolutionLayerFastMathFixture16 = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, half, float>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100844TEST_SUITE(Conv3x3)
845FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
846 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
847 framework::dataset::make("DataType", { DataType::F16 })),
848 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
849 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
850{
851 // Validate output
852 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
853}
854
855FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
856 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
857 framework::dataset::make("DataType", { DataType::F16 })),
858 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
859 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
860{
861 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000862 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100863}
864TEST_SUITE_END() // Conv3x3
865
866TEST_SUITE(Conv3x1)
867FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
868 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
869 framework::dataset::make("DataType", { DataType::F16 })),
870 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
871 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
872{
873 // Validate output
874 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
875}
876
877FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
878 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
879 framework::dataset::make("DataType", { DataType::F16 })),
880 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
881 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
882{
883 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000884 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100885}
886TEST_SUITE_END() // Conv3x1
887
888TEST_SUITE(Conv1x3)
889FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
890 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
891 framework::dataset::make("DataType", { DataType::F16 })),
892 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
893 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
894{
895 // Validate output
896 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
897}
898
899FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
900 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
901 framework::dataset::make("DataType", { DataType::F16 })),
902 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
903 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
904{
905 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000906 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100907}
908TEST_SUITE_END() // Conv1x3
909
910TEST_SUITE(Conv5x5)
911FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
912 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
913 framework::dataset::make("DataType", { DataType::F16 })),
914 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
915 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
916
917{
918 // Validate output
919 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
920}
921
922FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
923 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
924 framework::dataset::make("DataType", { DataType::F16 })),
925 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
926 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
927
928{
929 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000930 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100931}
932TEST_SUITE_END() // Conv5x5
933
934TEST_SUITE(Conv5x1)
935FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
936 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
937 framework::dataset::make("DataType", { DataType::F16 })),
938 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
939 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
940
941{
942 // Validate output
943 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
944}
945
946FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
947 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
948 framework::dataset::make("DataType", { DataType::F16 })),
949 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
950 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
951
952{
953 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000954 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100955}
956TEST_SUITE_END() // Conv5x1
957
958TEST_SUITE(Conv1x5)
959FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
960 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
961 framework::dataset::make("DataType", { DataType::F16 })),
962 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
963 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
964
965{
966 // Validate output
967 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
968}
969
970FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
971 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
972 framework::dataset::make("DataType", { DataType::F16 })),
973 framework::dataset::make("ActivationLayerInfo", { ActivationLayerInfo() })),
974 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
975
976{
977 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000978 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100979}
980TEST_SUITE_END() // Conv1x5
981
982TEST_SUITE_END() // FP16
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000983
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000984TEST_SUITE_END() // ConvolutionLayer
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000985TEST_SUITE_END() // Winograd
986TEST_SUITE_END() // CL
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000987} // namespace validation
988} // namespace test
989} // namespace arm_compute