blob: efa049f5abbd4a4b2b19fb76ffe05e1003135133 [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();
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100142
143//Activation Functions
144const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
145{
146 ActivationLayerInfo(),
147 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
148 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU),
149 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU),
150 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU),
151 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::SOFT_RELU)
152});
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000153} // namespace
154
155using namespace arm_compute::misc::shape_calculator;
156
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000157TEST_SUITE(CL)
158TEST_SUITE(Winograd)
159
160TEST_SUITE(InputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000161DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000162 framework::dataset::make("InputInfo",{
163 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F16), // F16 not supported
164 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
165 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
166 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Strides not supported
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000167 TensorInfo(TensorShape(53U, 33U, 4U), 1, DataType::F32), // Padding needed
168 TensorInfo(TensorShape(34U, 42U, 7U, 3U), 1, DataType::F32), // Padding needed
169 TensorInfo(TensorShape(31U, 37U, 37U), 1, DataType::F32) // Padding needed
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000170 }),
171 framework::dataset::make("OutputInfo", {
172 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F16),
173 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::QASYMM8),
174 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F32),
175 TensorInfo(TensorShape(5U, 1U, 16U, 3U), 1, DataType::F32),
176 TensorInfo(TensorShape(4U, 442U, 16U), 1, DataType::F32),
177 TensorInfo(TensorShape(7U, 320U, 16U, 3U), 1, DataType::F32),
178 TensorInfo(TensorShape(37U, 304U, 16U), 1, DataType::F32)
179 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000180 framework::dataset::make("WinogradInfo", {
181 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 0), DataLayout::NCHW),
182 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
183 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
184 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(2, 1, 1, 1), DataLayout::NCHW),
185 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 33U), PadStrideInfo(1, 1, 0, 1), DataLayout::NCHW),
186 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(34U, 42U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
187 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(31U, 37U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000188 })),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000189 framework::dataset::make("Expected", { false, false, false, false, false, false, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000190 input_info, output_info, winograd_info, expected)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000191{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000192 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 +0000193}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000194
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100195using CLWinogradInputTransformFixtureFP32 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, float>;
196using CLWinogradInputTransformFixtureFP16 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, half>;
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000197
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100198TEST_SUITE(NCHW)
199DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNCHW,
200 LargeWinogradInputTransformDatasetNCHW),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000201 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100202 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000203 shape_in, winograd_info, data_layout, data_type)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000204{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100205 TensorInfo tensor_info_in(shape_in, 1, data_type);
206 tensor_info_in.set_data_layout(data_layout);
207
208 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000209
210 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100211 CLTensor in = create_tensor<CLTensor>(shape_in, data_type, 1, QuantizationInfo(), data_layout);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000212 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
213
214 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
215 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
216
217 // Create and configure function
218 CLWinogradInputTransform winograd_input_transform;
219
220 // Configure the function
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000221 winograd_input_transform.configure(&in, &out, winograd_info);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000222}
223
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100224TEST_SUITE(FP32)
225FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100226 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
227 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000228{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100229 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000230}
231
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100232FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100233 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
234 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000235{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100236 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000237}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100238TEST_SUITE_END() // FP32
239
240TEST_SUITE(FP16)
241FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
242 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
243 framework::dataset::make("DataType", { DataType::F16 })))
244{
245 validate(CLAccessor(_target), _reference, tolerance_f16);
246}
247
248FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
249 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
250 framework::dataset::make("DataType", { DataType::F16 })))
251{
252 validate(CLAccessor(_target), _reference, tolerance_f16);
253}
254TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100255TEST_SUITE_END() // NCHW
256
257TEST_SUITE(NHWC)
258DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(SmallWinogradInputTransformDatasetNHWC,
259 LargeWinogradInputTransformDatasetNHWC),
260 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100261 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100262 shape_in, winograd_info, data_layout, data_type)
263{
264 TensorShape shape_in_nhwc(shape_in);
265
266 // Convert the shape to NHWC
267 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
268
269 // TensorInfo
270 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
271 tensor_info_in.set_data_layout(data_layout);
272
273 TensorShape shape_out = compute_winograd_input_transform_shape(tensor_info_in, winograd_info);
274
275 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100276 CLTensor in = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100277 CLTensor out = create_tensor<CLTensor>(shape_out, data_type);
278
279 ARM_COMPUTE_EXPECT(in.info()->is_resizable(), framework::LogLevel::ERRORS);
280 ARM_COMPUTE_EXPECT(out.info()->is_resizable(), framework::LogLevel::ERRORS);
281
282 // Create and configure function
283 CLWinogradInputTransform winograd_input_transform;
284
285 // Configure the function
286 winograd_input_transform.configure(&in, &out, winograd_info);
287}
288
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100289TEST_SUITE(FP16)
290FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
291 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
292 framework::dataset::make("DataType", { DataType::F16 })))
293{
294 validate(CLAccessor(_target), _reference, tolerance_f16);
295}
296
297FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
298 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
299 framework::dataset::make("DataType", { DataType::F16 })))
300{
301 validate(CLAccessor(_target), _reference, tolerance_f16);
302}
303TEST_SUITE_END() // FP16
304TEST_SUITE(FP32)
305FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100306 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
307 framework::dataset::make("DataType", { DataType::F32 })))
308{
309 validate(CLAccessor(_target), _reference, tolerance_f32);
310}
311
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100312FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100313 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
314 framework::dataset::make("DataType", { DataType::F32 })))
315{
316 validate(CLAccessor(_target), _reference, tolerance_f32);
317}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100318TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100319TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000320TEST_SUITE_END() // InputTransform
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000321
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000322TEST_SUITE(FilterTransform)
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000323DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000324 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100325 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F16), // F16 supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000326 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
327 TensorInfo(TensorShape(5U, 5U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000328 TensorInfo(TensorShape(3U, 3U), 1, DataType::F32), // Output tile not supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000329 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F32), // valid
330 TensorInfo(TensorShape(3U, 3U, 37U, 2U), 1, DataType::F32), // valid
331 TensorInfo(TensorShape(3U, 3U, 37U, 22U), 1, DataType::F32) // valid
332 }),
333 framework::dataset::make("OutputInfo", {
334 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F16),
335 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::QASYMM8),
336 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
337 TensorInfo(TensorShape(1U, 1U, 16U), 1, DataType::F32),
338 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
339 TensorInfo(TensorShape(2U, 37U, 16U), 1, DataType::F32),
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000340 TensorInfo(TensorShape(22U, 37U, 36U), 1, DataType::F32)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000341 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000342 framework::dataset::make("WinogradInfo", {
343 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
344 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
345 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
346 WinogradInfo(Size2D(3U, 3U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
347 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
348 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
349 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ )
350 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100351 framework::dataset::make("Expected", { true, false, false, false, true, true, true })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000352 input_info, output_info, winograd_info, expected)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000353{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000354 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 +0000355}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000356
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000357using CLWinogradFilterTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradFilterTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100358using CLWinogradFilterTransformFixtureFP32 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, float>;
359using CLWinogradFilterTransformFixtureFP16 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, half>;
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000360
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100361TEST_SUITE(NCHW)
362DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
363 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNCHW,
364 LargeWinogradFilterTransformDatasetNCHW),
365 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100366 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000367 shape_a, output_tile, data_layout, data_type)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000368{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100369 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 +0000370
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000371 TensorShape shape_b = compute_winograd_filter_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000372
373 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100374 CLTensor a = create_tensor<CLTensor>(shape_a, data_type, 1, QuantizationInfo(), data_layout);
375 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000376
377 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
378 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
379
380 // Create and configure function
381 CLWinogradFilterTransform winograd_filter_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000382 winograd_filter_transform.configure(&a, &b, winograd_info);
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000383}
384
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100385TEST_SUITE(FP32)
386FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100387 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
388 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
389 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000390{
391 // Validate output
392 validate(CLAccessor(_target), _reference, tolerance_f32);
393}
394
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100395FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100396 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
397 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
398 framework::dataset::make("DataType", { DataType::F32 })))
399{
400 // Validate output
401 validate(CLAccessor(_target), _reference, tolerance_f32);
402}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100403TEST_SUITE_END() // FP32
404TEST_SUITE(FP16)
405FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
406 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
407 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
408 framework::dataset::make("DataType", { DataType::F16 })))
409{
410 // Validate output
411 validate(CLAccessor(_target), _reference, tolerance_f16);
412}
413
414FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
415 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
416 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
417 framework::dataset::make("DataType", { DataType::F16 })))
418{
419 // Validate output
420 validate(CLAccessor(_target), _reference, tolerance_f16);
421}
422TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100423TEST_SUITE_END() // NCHW
424
425TEST_SUITE(NHWC)
426DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL,
427 combine(combine(framework::dataset::concat(SmallWinogradFilterTransformDatasetNHWC,
428 LargeWinogradFilterTransformDatasetNHWC),
429 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100430 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100431 shape_in, output_tile, data_layout, data_type)
432{
433 TensorShape shape_in_nhwc(shape_in);
434
435 // Convert the shape to NHWC
436 permute(shape_in_nhwc, PermutationVector(2U, 0U, 1U));
437
438 // TensorInfo
439 TensorInfo tensor_info_in(shape_in_nhwc, 1, data_type);
440 tensor_info_in.set_data_layout(data_layout);
441
442 WinogradInfo winograd_info(output_tile, Size2D(shape_in[0], shape_in[1]), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, data_layout /* Not needed */);
443
444 TensorShape shape_b = compute_winograd_filter_transform_shape(tensor_info_in, winograd_info);
445
446 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100447 CLTensor a = create_tensor<CLTensor>(shape_in_nhwc, data_type, 1, QuantizationInfo(), data_layout);
448 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100449
450 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
451 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
452
453 // Create and configure function
454 CLWinogradFilterTransform winograd_filter_transform;
455 winograd_filter_transform.configure(&a, &b, winograd_info);
456}
457
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100458TEST_SUITE(FP16)
459FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
460 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
461 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
462 framework::dataset::make("DataType", { DataType::F16 })))
463{
464 // Validate output
465 validate(CLAccessor(_target), _reference, tolerance_f16);
466}
467
468FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
469 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
470 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
471 framework::dataset::make("DataType", { DataType::F16 })))
472{
473 // Validate output
474 validate(CLAccessor(_target), _reference, tolerance_f16);
475}
476TEST_SUITE_END() // FP16
477TEST_SUITE(FP32)
478FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100479 combine(combine(SmallWinogradFilterTransformDatasetNHWC,
480 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
481 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000482{
483 // Validate output
484 validate(CLAccessor(_target), _reference, tolerance_f32);
485}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000486
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100487FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100488 combine(combine(LargeWinogradFilterTransformDatasetNHWC,
489 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
490 framework::dataset::make("DataType", { DataType::F32 })))
491{
492 // Validate output
493 validate(CLAccessor(_target), _reference, tolerance_f32);
494}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100495TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100496TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000497TEST_SUITE_END() // FilterTransform
498
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000499TEST_SUITE(OutputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000500DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000501 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100502 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F16), // F16 supported
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000503 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::QASYMM8), // QASYMM8 not supported
504 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Kernel size not supported
505 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Valid
506 TensorInfo(TensorShape(13U, 108U, 16U, 4U), 1, DataType::F32), // Padding needed
507 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Valid
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100508 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Wrong WinogradInfo
509 TensorInfo(TensorShape(7U, 256U, 36U, 3U), 1, DataType::F32), // Valid
510 TensorInfo(TensorShape(7U, 256U, 16U, 3U), 1, DataType::F32) // Wrong number of batches
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000511 }),
512 framework::dataset::make("BiasInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000513 TensorInfo(TensorShape(512U), 1, DataType::F16),
514 TensorInfo(TensorShape(512U), 1, DataType::QASYMM8),
515 TensorInfo(TensorShape(512U), 1, DataType::F32),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000516 TensorInfo(TensorShape(512U), 1, DataType::F32),
517 TensorInfo(TensorShape(13U), 1, DataType::F32),
518 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100519 TensorInfo(TensorShape(7U), 1, DataType::F32),
520 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000521 TensorInfo(TensorShape(7U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000522 })),
523 framework::dataset::make("OutputInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000524 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F16),
525 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::QASYMM8),
526 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
527 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
528 TensorInfo(TensorShape(17U, 23U, 13U, 4U), 1, DataType::F32),
529 TensorInfo(TensorShape(8U, 10U, 7U, 7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100530 TensorInfo(TensorShape(7U, 9U, 7U, 7U), 1, DataType::F32),
531 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32),
532 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000533 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000534 framework::dataset::make("WinogradInfo", {
535 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
536 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
537 WinogradInfo(Size2D(2U, 2U), Size2D(5U, 5U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
538 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
539 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(17U, 23U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
540 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
541 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 +0100542 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
543 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 +0000544 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100545 framework::dataset::make("Expected", { true, false, false, true, false, true, false, true, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000546 input_info, bias_info, output_info, winograd_info, expected)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000547{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000548 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 +0000549}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000550
551using CLWinogradOutputTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradOutputTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100552using CLWinogradOutputTransformFixtureFP32 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, float>;
553using CLWinogradOutputTransformFixtureFP16 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, half>;
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000554
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100555TEST_SUITE(NCHW)
556DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNCHW,
557 LargeWinogradOutputTransformDatasetNCHW),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100558 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000559 shape_a, winograd_info, data_type)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000560{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000561 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000562
563 // Create tensors
564 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100565 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000566
567 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
568 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
569
570 // Create and configure function
571 CLWinogradOutputTransform winograd_output_transform;
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000572 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000573}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100574TEST_SUITE(FP16)
575FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100576 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
577 framework::dataset::make("DataType", { DataType::F16 })),
578 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100579{
580 // Validate output
581 validate(CLAccessor(_target), _reference, tolerance_f16);
582}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000583
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100584FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100585 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
586 framework::dataset::make("DataType", { DataType::F16 })),
587 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100588{
589 // Validate output
590 validate(CLAccessor(_target), _reference, tolerance_f16);
591}
592TEST_SUITE_END() // FP16
593TEST_SUITE(FP32)
594FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100595 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
596 framework::dataset::make("DataType", { DataType::F32 })),
597 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000598{
599 // Validate output
600 validate(CLAccessor(_target), _reference, tolerance_f32);
601}
602
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100603FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100604 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
605 framework::dataset::make("DataType", { DataType::F32 })),
606 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100607{
608 // Validate output
609 validate(CLAccessor(_target), _reference, tolerance_f32);
610}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100611TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100612TEST_SUITE_END() // NCHW
613
614TEST_SUITE(NHWC)
615DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(SmallWinogradOutputTransformDatasetNHWC,
616 LargeWinogradOutputTransformDatasetNHWC),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100617 framework::dataset::make("DataType", { DataType::F32, DataType::F16 })),
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100618 shape_a, winograd_info, data_type)
619{
620 TensorShape shape_b = compute_winograd_output_transform_shape(TensorInfo(shape_a, 1, data_type), winograd_info);
621
622 // Create tensors
623 CLTensor a = create_tensor<CLTensor>(shape_a, data_type);
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100624 CLTensor b = create_tensor<CLTensor>(shape_b, data_type, 1, QuantizationInfo(), winograd_info.output_data_layout);
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100625
626 ARM_COMPUTE_EXPECT(a.info()->is_resizable(), framework::LogLevel::ERRORS);
627 ARM_COMPUTE_EXPECT(b.info()->is_resizable(), framework::LogLevel::ERRORS);
628
629 // Create and configure function
630 CLWinogradOutputTransform winograd_output_transform;
631 winograd_output_transform.configure(&a, nullptr, &b, winograd_info);
632}
633
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100634TEST_SUITE(FP16)
635FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100636 combine(combine(SmallWinogradOutputTransformDatasetNHWC,
637 framework::dataset::make("DataType", { DataType::F16 })),
638 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100639{
640 // Validate output
641 validate(CLAccessor(_target), _reference, tolerance_f16);
642}
643
644FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100645 combine(combine(LargeWinogradOutputTransformDatasetNHWC,
646 framework::dataset::make("DataType", { DataType::F16 })),
647 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100648{
649 // Validate output
650 validate(CLAccessor(_target), _reference, tolerance_f16);
651}
652TEST_SUITE_END() // FP16
653TEST_SUITE(FP32)
654FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100655 combine(combine(SmallWinogradOutputTransformDatasetNHWC,
656 framework::dataset::make("DataType", { DataType::F32 })),
657 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000658{
659 // Validate output
660 validate(CLAccessor(_target), _reference, tolerance_f32);
661}
662
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100663FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100664 combine(combine(LargeWinogradOutputTransformDatasetNHWC,
665 framework::dataset::make("DataType", { DataType::F32 })),
666 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100667{
668 // Validate output
669 validate(CLAccessor(_target), _reference, tolerance_f32);
670}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100671TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100672TEST_SUITE_END() // NHWC
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000673TEST_SUITE_END() // OutputTransform
674
675TEST_SUITE(ConvolutionLayer)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000676DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
677 framework::dataset::make("InputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100678 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F16), // Insufficient padding
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000679 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Datatype mismatch
680 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Stride y not supported
681 TensorInfo(TensorShape(16U, 16U, 8U), 1, DataType::F32), // Padding needed
682 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32) // Kernel size not supported
683 }),
684 framework::dataset::make("WeightsInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100685 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000686 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::QASYMM8),
687 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
688 TensorInfo(TensorShape(3U, 3U, 8U, 16U), 1, DataType::F32),
689 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16)
690 })),
691 framework::dataset::make("BiasesInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100692 TensorInfo(TensorShape(19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000693 TensorInfo(TensorShape(19U), 1, DataType::F32),
694 TensorInfo(TensorShape(21U), 1, DataType::F32),
695 TensorInfo(TensorShape(16U), 1, DataType::F32),
696 TensorInfo(TensorShape(16U), 1, DataType::F32)
697 })),
698 framework::dataset::make("OutputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100699 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000700 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
701 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
702 TensorInfo(TensorShape(16U, 16U, 16U), 1, DataType::F32),
703 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32)
704 })),
705 framework::dataset::make("ConvInfo", {
706 PadStrideInfo(1, 1, 1, 1),
707 PadStrideInfo(1, 1, 1, 1),
708 PadStrideInfo(1, 2, 0, 0),
709 PadStrideInfo(1, 1, 1, 1),
710 PadStrideInfo(1, 1, 1, 0)
711 })),
712 framework::dataset::make("Expected", { false, false, false, false, false })),
713 input_info, weights_info, bias_info, output_info, conv_info, expected)
714{
715 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);
716}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000717
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100718TEST_SUITE(FP32)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100719using CLWinogradConvolutionLayerFastMathFixture = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, float>;
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100720TEST_SUITE(Conv3x3)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100721FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100722 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
723 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100724 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100725 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100726{
727 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100728 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100729}
730
731FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100732 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
733 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100734 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100735 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100736{
737 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100738 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100739}
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100740TEST_SUITE_END() // Conv3x3
741
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100742TEST_SUITE(Conv3x1)
743FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
744 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
745 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100746 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100747 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco 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::LargeWinogradConvolutionLayer3x1Dataset(),
755 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100756 ActivationFunctionsDataset),
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() // Conv3x1
763
764TEST_SUITE(Conv1x3)
765FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
766 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
767 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100768 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100769 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100770{
771 // Validate output
772 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
773}
774
775FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
776 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
777 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100778 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100779 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100780{
781 // Validate output
782 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
783}
784TEST_SUITE_END() // Conv1x3
785
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100786TEST_SUITE(Conv5x5)
787FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100788 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
789 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100790 ActivationFunctionsDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100791 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100792
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100793{
794 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100795 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100796}
797
798FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100799 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
800 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100801 ActivationFunctionsDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100802 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100803
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100804{
805 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100806 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100807}
808TEST_SUITE_END() // Conv5x5
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100809
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100810TEST_SUITE(Conv5x1)
811FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
812 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
813 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100814 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100815 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100816
817{
818 // Validate output
819 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
820}
821
822FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
823 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
824 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100825 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100826 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100827
828{
829 // Validate output
830 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
831}
832TEST_SUITE_END() // Conv5x1
833
834TEST_SUITE(Conv1x5)
835FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
836 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
837 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100838 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100839 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100840
841{
842 // Validate output
843 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
844}
845
846FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
847 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
848 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100849 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100850 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100851
852{
853 // Validate output
854 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
855}
856TEST_SUITE_END() // Conv1x5
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100857TEST_SUITE_END() // FP32
858
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000859
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100860TEST_SUITE(FP16)
861
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000862using CLWinogradConvolutionLayerFastMathFixture16 = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, half, float>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100863TEST_SUITE(Conv3x3)
864FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
865 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
866 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100867 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100868 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::LargeWinogradConvolutionLayer3x3Dataset(),
876 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100877 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100878 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
879{
880 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000881 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100882}
883TEST_SUITE_END() // Conv3x3
884
885TEST_SUITE(Conv3x1)
886FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
887 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
888 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100889 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100890 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
891{
892 // 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::LargeWinogradConvolutionLayer3x1Dataset(),
898 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100899 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100900 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
901{
902 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000903 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100904}
905TEST_SUITE_END() // Conv3x1
906
907TEST_SUITE(Conv1x3)
908FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
909 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
910 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100911 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100912 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
913{
914 // Validate output
915 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
916}
917
918FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
919 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
920 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100921 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100922 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
923{
924 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000925 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100926}
927TEST_SUITE_END() // Conv1x3
928
929TEST_SUITE(Conv5x5)
930FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
931 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
932 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100933 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100934 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
935
936{
937 // Validate output
938 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
939}
940
941FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
942 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
943 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100944 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100945 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
946
947{
948 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000949 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100950}
951TEST_SUITE_END() // Conv5x5
952
953TEST_SUITE(Conv5x1)
954FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
955 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
956 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100957 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100958 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
959
960{
961 // Validate output
962 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
963}
964
965FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
966 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
967 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100968 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100969 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
970
971{
972 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000973 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100974}
975TEST_SUITE_END() // Conv5x1
976
977TEST_SUITE(Conv1x5)
978FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
979 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
980 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100981 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100982 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
983
984{
985 // Validate output
986 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16);
987}
988
989FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
990 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
991 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100992 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100993 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
994
995{
996 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000997 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100998}
999TEST_SUITE_END() // Conv1x5
1000
1001TEST_SUITE_END() // FP16
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +00001002
Gian Marco Iodiced2fab732018-03-02 11:18:12 +00001003TEST_SUITE_END() // ConvolutionLayer
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +00001004TEST_SUITE_END() // Winograd
1005TEST_SUITE_END() // CL
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00001006} // namespace validation
1007} // namespace test
1008} // namespace arm_compute