blob: 511aa4b77300b142f795352903e3e9f68f6822fc [file] [log] [blame]
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00001/*
Michalis Spyrou80943252019-01-10 17:19:50 +00002 * Copyright (c) 2018-2019 ARM Limited.
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +00003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000022 * SOFTWARE.
23 */
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000024#include "arm_compute/core/CL/kernels/CLWinogradFilterTransformKernel.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000025#include "arm_compute/core/CL/kernels/CLWinogradOutputTransformKernel.h"
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010026#include "arm_compute/core/Helpers.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000027#include "arm_compute/core/Types.h"
28#include "arm_compute/core/utils/misc/ShapeCalculator.h"
29#include "arm_compute/runtime/CL/CLTensor.h"
30#include "arm_compute/runtime/CL/CLTensorAllocator.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000031#include "arm_compute/runtime/CL/functions/CLWinogradConvolutionLayer.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000032#include "arm_compute/runtime/CL/functions/CLWinogradInputTransform.h"
33#include "tests/CL/CLAccessor.h"
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000034#include "tests/CL/Helper.h"
35#include "tests/PaddingCalculator.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000036#include "tests/datasets/LargeConvolutionLayerDataset.h"
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000037#include "tests/datasets/ShapeDatasets.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000038#include "tests/datasets/SmallConvolutionLayerDataset.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000039#include "tests/datasets/WinogradInputTransformDataset.h"
Gian Marco Iodiced2fab732018-03-02 11:18:12 +000040#include "tests/datasets/WinogradOutputTransformDataset.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000041#include "tests/framework/Asserts.h"
42#include "tests/framework/Macros.h"
43#include "tests/framework/datasets/Datasets.h"
44#include "tests/validation/Validation.h"
Georgios Pinitas9fb11592018-04-26 20:34:58 +010045#include "tests/validation/fixtures/WinogradConvolutionLayerFixture.h"
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +000046
47namespace arm_compute
48{
49namespace test
50{
51namespace validation
52{
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +000053namespace
54{
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010055// *INDENT-OFF*
56// clang-format off
Michele Di Giorgio875a7512019-02-27 14:26:51 +000057constexpr AbsoluteTolerance<float> tolerance_f32(0.002f);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +010058const AbsoluteTolerance<half> tolerance_f16(half(0.5f));
Gian Marco Iodice4497e812018-05-08 16:36:52 +010059constexpr AbsoluteTolerance<float> tolerance_convolution_layer_f32(0.1f);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +010060const AbsoluteTolerance<half> tolerance_convolution_layer_f16(half(0.4f));
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +000061RelativeTolerance<half_float::half> rel_tolerance_f16(half(0.2)); /**< Tolerance value for comparing reference's output against implementation's output for FP16 data types */
62constexpr float tolerance_num = 0.05f; /**< Tolerance number */
63constexpr float abs_tolerance_convolution_layer_f16 = 2.5f; /**< Tolerance number */
Pablo Tellof1cf3942019-09-19 16:39:04 +010064constexpr float tolerance_num_f16 = 0.15f; /**< Tolerance number */
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010065
66// Input transform
67const auto SmallWinogradInputTransformDatasetNCHW =
68 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x2_3x3(),
69 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_3x1(),
70 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x2_1x3(),
71 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
72 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
73 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010074 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
75 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
76 datasets::SmallWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010077
78const auto SmallWinogradInputTransformDatasetNHWC = framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_3x3(),
Giorgio Arena149fdf32018-07-04 17:03:33 +010079 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_3x1(),
80 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +010081 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x4_5x5(),
82 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset4x1_5x1(),
Pablo Tellof1cf3942019-09-19 16:39:04 +010083 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset1x4_1x5(),
84 framework::dataset::concat(datasets::SmallWinogradInputTransformDataset2x1_7x1(),
85 datasets::SmallWinogradInputTransformDataset1x2_1x7())))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010086
Michele Di Giorgiof955d512019-02-27 14:26:51 +000087const auto SmallWinogradInputTransformDatasetNHWC_FP32 = framework::dataset::concat(SmallWinogradInputTransformDatasetNHWC,
Pablo Tellof1cf3942019-09-19 16:39:04 +010088 datasets::SmallWinogradInputTransformDataset2x2_7x7());
Michele Di Giorgiof955d512019-02-27 14:26:51 +000089
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +010090const auto LargeWinogradInputTransformDatasetNCHW =
91 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x2_3x3(),
92 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset2x1_3x1(),
93 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x2_1x3(),
94 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
95 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_3x1(),
96 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset1x4_1x3(),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +010097 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
98 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
Georgios Pinitas0c816842019-12-20 15:07:43 +000099 datasets::LargeWinogradInputTransformDataset1x4_1x5()))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100100
101const auto LargeWinogradInputTransformDatasetNHWC =
102 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_3x3(),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100103 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x4_5x5(),
104 framework::dataset::concat(datasets::LargeWinogradInputTransformDataset4x1_5x1(),
105 datasets::LargeWinogradInputTransformDataset1x4_1x5())));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100106
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000107const auto LargeWinogradInputTransformDatasetNHWC_FP32 =
108 framework::dataset::concat(LargeWinogradInputTransformDatasetNHWC,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100109 (datasets::LargeWinogradInputTransformDataset2x2_7x7()));
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000110
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100111// Filter transform
112const auto SmallWinogradFilterTransformDatasetNCHW =
113 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
114 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
115 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100116 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
117 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
118 combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100119
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000120const auto SmallWinogradFilterTransformDatasetNHWC_F16 =
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100121 framework::dataset::concat(combine(datasets::Small3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Giorgio Arena149fdf32018-07-04 17:03:33 +0100122 framework::dataset::concat(combine(datasets::Small3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
123 framework::dataset::concat(combine(datasets::Small1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100124 framework::dataset::concat(combine(datasets::Small5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
125 framework::dataset::concat(combine(datasets::Small5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
Pablo Tellof1cf3942019-09-19 16:39:04 +0100126 framework::dataset::concat(combine(datasets::Small1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
127 framework::dataset::concat(combine(datasets::Small1x7Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U) })),
128 combine(datasets::Small7x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U) })))))))));
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000129
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000130const auto SmallWinogradFilterTransformDatasetNHWC_F32 =
131 framework::dataset::concat(SmallWinogradFilterTransformDatasetNHWC_F16,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100132 combine(datasets::Small7x7Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U) })));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100133
134const auto LargeWinogradFilterTransformDatasetNCHW =
135 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U), Size2D(4U, 4U) })),
136 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U), Size2D(4U, 1U) })),
137 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U), Size2D(1U, 4U) })),
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100138 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
139 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
140 combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100141
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000142const auto LargeWinogradFilterTransformDatasetNHWC_F16 =
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100143 framework::dataset::concat(combine(datasets::Large3x3Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
Gian Marco Iodiced28b7512018-07-06 12:59:28 +0100144 framework::dataset::concat(combine(datasets::Large3x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
145 framework::dataset::concat(combine(datasets::Large1x3Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
146 framework::dataset::concat(combine(datasets::Large5x5Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 4U) })),
147 framework::dataset::concat(combine(datasets::Large5x1Shapes(), framework::dataset::make("OutputTile", { Size2D(4U, 1U) })),
Pablo Tellof1cf3942019-09-19 16:39:04 +0100148 framework::dataset::concat(combine(datasets::Large1x5Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 4U) })),
149 framework::dataset::concat(combine(datasets::Large7x1Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 1U) })),
150 combine(datasets::Large1x7Shapes(), framework::dataset::make("OutputTile", { Size2D(1U, 2U) })))))))));
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100151
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000152const auto LargeWinogradFilterTransformDatasetNHWC_F32 =
153 framework::dataset::concat(LargeWinogradFilterTransformDatasetNHWC_F16,
Pablo Tellof1cf3942019-09-19 16:39:04 +0100154 combine(datasets::Large7x7Shapes(), framework::dataset::make("OutputTile", { Size2D(2U, 2U) })));
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000155
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100156// Output transform
157const auto SmallWinogradOutputTransformDatasetNCHW = datasets::SmallWinogradOutputTransformDatasetNCHW();
158
giuros013bfacb22019-04-01 12:07:02 +0100159const auto SmallWinogradOutputTransformDatasetNHWC_F16 = datasets::SmallWinogradOutputTransformDatasetNHWC_F16();
160
161const auto SmallWinogradOutputTransformDatasetNHWC_F32 = datasets::SmallWinogradOutputTransformDatasetNHWC_F32();
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100162
163const auto LargeWinogradOutputTransformDatasetNCHW = datasets::LargeWinogradOutputTransformDatasetNCHW();
164
giuros013bfacb22019-04-01 12:07:02 +0100165const auto LargeWinogradOutputTransformDatasetNHWC_F16 = datasets::LargeWinogradOutputTransformDatasetNHWC_F16();
166
167const auto LargeWinogradOutputTransformDatasetNHWC_F32 = datasets::LargeWinogradOutputTransformDatasetNHWC_F32();
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100168
169//Activation Functions
170const auto ActivationFunctionsDataset = framework::dataset::make("ActivationInfo",
171{
172 ActivationLayerInfo(),
173 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::RELU),
174 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU),
175 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU),
Georgios Pinitas9d6a31c2019-02-25 14:33:25 +0000176 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU)
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100177});
Michalis Spyrou80943252019-01-10 17:19:50 +0000178const auto ActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
179{
180 ActivationLayerInfo(),
181 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU),
Georgios Pinitas9d6a31c2019-02-25 14:33:25 +0000182 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LEAKY_RELU),
183 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::SOFT_RELU)
Michalis Spyrou80943252019-01-10 17:19:50 +0000184});
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000185} // namespace
186
187using namespace arm_compute::misc::shape_calculator;
188
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000189TEST_SUITE(CL)
190TEST_SUITE(Winograd)
191
192TEST_SUITE(InputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000193DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000194 framework::dataset::make("InputInfo",{
195 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F16), // F16 not supported
196 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
197 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
198 TensorInfo(TensorShape(53U, 21U, 5U, 3U), 1, DataType::F32), // Strides not supported
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000199 TensorInfo(TensorShape(53U, 33U, 4U), 1, DataType::F32), // Padding needed
200 TensorInfo(TensorShape(34U, 42U, 7U, 3U), 1, DataType::F32), // Padding needed
201 TensorInfo(TensorShape(31U, 37U, 37U), 1, DataType::F32) // Padding needed
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000202 }),
203 framework::dataset::make("OutputInfo", {
204 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F16),
205 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::QASYMM8),
206 TensorInfo(TensorShape(5U, 5U, 16U, 3U), 1, DataType::F32),
207 TensorInfo(TensorShape(5U, 1U, 16U, 3U), 1, DataType::F32),
208 TensorInfo(TensorShape(4U, 442U, 16U), 1, DataType::F32),
209 TensorInfo(TensorShape(7U, 320U, 16U, 3U), 1, DataType::F32),
210 TensorInfo(TensorShape(37U, 304U, 16U), 1, DataType::F32)
211 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000212 framework::dataset::make("WinogradInfo", {
213 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 0), DataLayout::NCHW),
214 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
215 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
216 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 21U), PadStrideInfo(2, 1, 1, 1), DataLayout::NCHW),
217 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(53U, 33U), PadStrideInfo(1, 1, 0, 1), DataLayout::NCHW),
218 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(34U, 42U), PadStrideInfo(1, 1, 0, 0), DataLayout::NCHW),
219 WinogradInfo(Size2D(2, 2), Size2D(3, 3), Size2D(31U, 37U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000220 })),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000221 framework::dataset::make("Expected", { false, false, false, false, false, false, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000222 input_info, output_info, winograd_info, expected)
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000223{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000224 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 +0000225}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000226
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100227using CLWinogradInputTransformFixtureFP32 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, float>;
228using CLWinogradInputTransformFixtureFP16 = WinogradInputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradInputTransform, half>;
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000229
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100230TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100231TEST_SUITE(FP32)
232FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
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}
238
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100239FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100240 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
241 framework::dataset::make("DataType", { DataType::F32 })))
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000242{
Giorgio Arenafe5ef382018-04-17 10:14:10 +0100243 validate(CLAccessor(_target), _reference, tolerance_f32);
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000244}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100245TEST_SUITE_END() // FP32
246
247TEST_SUITE(FP16)
248FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNCHW,
249 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
250 framework::dataset::make("DataType", { DataType::F16 })))
251{
252 validate(CLAccessor(_target), _reference, tolerance_f16);
253}
254
255FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNCHW,
256 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
257 framework::dataset::make("DataType", { DataType::F16 })))
258{
259 validate(CLAccessor(_target), _reference, tolerance_f16);
260}
261TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100262TEST_SUITE_END() // NCHW
263
264TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100265TEST_SUITE(FP16)
266FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC,
267 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
268 framework::dataset::make("DataType", { DataType::F16 })))
269{
Pablo Tellof1cf3942019-09-19 16:39:04 +0100270 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100271}
272
273FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP16, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC,
274 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
275 framework::dataset::make("DataType", { DataType::F16 })))
276{
Pablo Tellof1cf3942019-09-19 16:39:04 +0100277 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100278}
279TEST_SUITE_END() // FP16
280TEST_SUITE(FP32)
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000281FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::PRECOMMIT, combine(combine(SmallWinogradInputTransformDatasetNHWC_FP32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100282 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
283 framework::dataset::make("DataType", { DataType::F32 })))
284{
285 validate(CLAccessor(_target), _reference, tolerance_f32);
286}
287
Michele Di Giorgiof955d512019-02-27 14:26:51 +0000288FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradInputTransformFixtureFP32, framework::DatasetMode::NIGHTLY, combine(combine(LargeWinogradInputTransformDatasetNHWC_FP32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100289 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
290 framework::dataset::make("DataType", { DataType::F32 })))
291{
292 validate(CLAccessor(_target), _reference, tolerance_f32);
293}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100294TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100295TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000296TEST_SUITE_END() // InputTransform
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000297
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000298TEST_SUITE(FilterTransform)
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000299DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000300 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100301 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F16), // F16 supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000302 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::QASYMM8), // QASYMM8 not supported
303 TensorInfo(TensorShape(5U, 5U, 5U, 3U), 1, DataType::F32), // Kernel size not supported
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000304 TensorInfo(TensorShape(3U, 3U), 1, DataType::F32), // Output tile not supported
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000305 TensorInfo(TensorShape(3U, 3U, 5U, 3U), 1, DataType::F32), // valid
306 TensorInfo(TensorShape(3U, 3U, 37U, 2U), 1, DataType::F32), // valid
307 TensorInfo(TensorShape(3U, 3U, 37U, 22U), 1, DataType::F32) // valid
308 }),
309 framework::dataset::make("OutputInfo", {
310 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F16),
311 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::QASYMM8),
312 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
313 TensorInfo(TensorShape(1U, 1U, 16U), 1, DataType::F32),
314 TensorInfo(TensorShape(3U, 5U, 16U), 1, DataType::F32),
315 TensorInfo(TensorShape(2U, 37U, 16U), 1, DataType::F32),
Giorgio Arena2d9de0a2018-03-15 17:58:20 +0000316 TensorInfo(TensorShape(22U, 37U, 36U), 1, DataType::F32)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000317 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000318 framework::dataset::make("WinogradInfo", {
319 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
320 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
321 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
322 WinogradInfo(Size2D(3U, 3U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
323 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
324 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ ),
325 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D() /* Not needed */, PadStrideInfo() /* Not needed */, DataLayout::NCHW /* Not needed */ )
326 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100327 framework::dataset::make("Expected", { true, false, false, false, true, true, true })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000328 input_info, output_info, winograd_info, expected)
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000329{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000330 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 +0000331}
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000332
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000333using CLWinogradFilterTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradFilterTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100334using CLWinogradFilterTransformFixtureFP32 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, float>;
335using CLWinogradFilterTransformFixtureFP16 = WinogradFilterTransformValidationFixture<CLTensor, CLAccessor, CLWinogradFilterTransform, half>;
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000336
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100337TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100338TEST_SUITE(FP32)
339FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100340 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
341 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
342 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000343{
344 // Validate output
345 validate(CLAccessor(_target), _reference, tolerance_f32);
346}
347
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100348FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100349 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
350 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
351 framework::dataset::make("DataType", { DataType::F32 })))
352{
353 // Validate output
354 validate(CLAccessor(_target), _reference, tolerance_f32);
355}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100356TEST_SUITE_END() // FP32
357TEST_SUITE(FP16)
358FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
359 combine(combine(SmallWinogradFilterTransformDatasetNCHW,
360 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
361 framework::dataset::make("DataType", { DataType::F16 })))
362{
363 // Validate output
364 validate(CLAccessor(_target), _reference, tolerance_f16);
365}
366
367FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
368 combine(combine(LargeWinogradFilterTransformDatasetNCHW,
369 framework::dataset::make("DataLayout", { DataLayout::NCHW })),
370 framework::dataset::make("DataType", { DataType::F16 })))
371{
372 // Validate output
373 validate(CLAccessor(_target), _reference, tolerance_f16);
374}
375TEST_SUITE_END() // FP16
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100376TEST_SUITE_END() // NCHW
377
378TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100379TEST_SUITE(FP16)
380FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::PRECOMMIT,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000381 combine(combine(SmallWinogradFilterTransformDatasetNHWC_F16,
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100382 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
383 framework::dataset::make("DataType", { DataType::F16 })))
384{
385 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100386 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100387}
388
389FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000390 combine(combine(LargeWinogradFilterTransformDatasetNHWC_F16,
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100391 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
392 framework::dataset::make("DataType", { DataType::F16 })))
393{
394 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100395 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100396}
397TEST_SUITE_END() // FP16
398TEST_SUITE(FP32)
399FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::PRECOMMIT,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000400 combine(combine(SmallWinogradFilterTransformDatasetNHWC_F32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100401 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
402 framework::dataset::make("DataType", { DataType::F32 })))
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000403{
404 // Validate output
405 validate(CLAccessor(_target), _reference, tolerance_f32);
406}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000407
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100408FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradFilterTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Michele Di Giorgio881c6842019-02-27 14:26:51 +0000409 combine(combine(LargeWinogradFilterTransformDatasetNHWC_F32,
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100410 framework::dataset::make("DataLayout", { DataLayout::NHWC })),
411 framework::dataset::make("DataType", { DataType::F32 })))
412{
413 // Validate output
414 validate(CLAccessor(_target), _reference, tolerance_f32);
415}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100416TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100417TEST_SUITE_END() // NHWC
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000418TEST_SUITE_END() // FilterTransform
419
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000420TEST_SUITE(OutputTransform)
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000421DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000422 framework::dataset::make("InputInfo",{
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100423 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F16), // F16 supported
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000424 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::QASYMM8), // QASYMM8 not supported
425 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Kernel size not supported
426 TensorInfo(TensorShape(512U, 49U, 16U, 5U), 1, DataType::F32), // Valid
427 TensorInfo(TensorShape(13U, 108U, 16U, 4U), 1, DataType::F32), // Padding needed
428 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Valid
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100429 TensorInfo(TensorShape(7U, 20U, 16U, 7U), 1, DataType::F32), // Wrong WinogradInfo
430 TensorInfo(TensorShape(7U, 256U, 36U, 3U), 1, DataType::F32), // Valid
431 TensorInfo(TensorShape(7U, 256U, 16U, 3U), 1, DataType::F32) // Wrong number of batches
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000432 }),
433 framework::dataset::make("BiasInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000434 TensorInfo(TensorShape(512U), 1, DataType::F16),
435 TensorInfo(TensorShape(512U), 1, DataType::QASYMM8),
436 TensorInfo(TensorShape(512U), 1, DataType::F32),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000437 TensorInfo(TensorShape(512U), 1, DataType::F32),
438 TensorInfo(TensorShape(13U), 1, DataType::F32),
439 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100440 TensorInfo(TensorShape(7U), 1, DataType::F32),
441 TensorInfo(TensorShape(7U), 1, DataType::F32),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000442 TensorInfo(TensorShape(7U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000443 })),
444 framework::dataset::make("OutputInfo", {
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000445 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F16),
446 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::QASYMM8),
447 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
448 TensorInfo(TensorShape(14U, 14U, 512U, 5U), 1, DataType::F32),
449 TensorInfo(TensorShape(17U, 23U, 13U, 4U), 1, DataType::F32),
450 TensorInfo(TensorShape(8U, 10U, 7U, 7U), 1, DataType::F32),
Gian Marco Iodicee52a3002018-04-11 15:59:10 +0100451 TensorInfo(TensorShape(7U, 9U, 7U, 7U), 1, DataType::F32),
452 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32),
453 TensorInfo(TensorShape(64U, 64U, 7U, 3U), 1, DataType::F32)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000454 })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000455 framework::dataset::make("WinogradInfo", {
456 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
457 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
458 WinogradInfo(Size2D(2U, 2U), Size2D(5U, 5U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
459 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(14U, 14U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
460 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(17U, 23U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
461 WinogradInfo(Size2D(2U, 2U), Size2D(3U, 3U), Size2D(8U, 10U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
462 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 +0100463 WinogradInfo(Size2D(4U, 4U), Size2D(3U, 3U), Size2D(64U, 64U), PadStrideInfo(1, 1, 1, 1), DataLayout::NCHW),
464 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 +0000465 })),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100466 framework::dataset::make("Expected", { true, false, false, true, false, true, false, true, false })),
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000467 input_info, bias_info, output_info, winograd_info, expected)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000468{
Gian Marco Iodice247f52c2018-03-22 11:24:56 +0000469 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 +0000470}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000471
472using CLWinogradOutputTransform = CLSynthetizeFunctionWithZeroConstantBorder<CLWinogradOutputTransformKernel, 0>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100473using CLWinogradOutputTransformFixtureFP32 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, float>;
474using CLWinogradOutputTransformFixtureFP16 = WinogradOutputTransformValidationFixture<CLTensor, CLAccessor, CLWinogradOutputTransform, half>;
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000475
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100476TEST_SUITE(NCHW)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100477TEST_SUITE(FP16)
478FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100479 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
480 framework::dataset::make("DataType", { DataType::F16 })),
481 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100482{
483 // Validate output
484 validate(CLAccessor(_target), _reference, tolerance_f16);
485}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000486
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100487FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100488 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
489 framework::dataset::make("DataType", { DataType::F16 })),
490 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100491{
492 // Validate output
493 validate(CLAccessor(_target), _reference, tolerance_f16);
494}
495TEST_SUITE_END() // FP16
496TEST_SUITE(FP32)
497FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100498 combine(combine(SmallWinogradOutputTransformDatasetNCHW,
499 framework::dataset::make("DataType", { DataType::F32 })),
500 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000501{
502 // Validate output
503 validate(CLAccessor(_target), _reference, tolerance_f32);
504}
505
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100506FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100507 combine(combine(LargeWinogradOutputTransformDatasetNCHW,
508 framework::dataset::make("DataType", { DataType::F32 })),
509 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100510{
511 // Validate output
512 validate(CLAccessor(_target), _reference, tolerance_f32);
513}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100514TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100515TEST_SUITE_END() // NCHW
516
517TEST_SUITE(NHWC)
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100518TEST_SUITE(FP16)
519FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::ALL,
giuros013bfacb22019-04-01 12:07:02 +0100520 combine(combine(SmallWinogradOutputTransformDatasetNHWC_F16,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100521 framework::dataset::make("DataType", { DataType::F16 })),
522 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100523{
524 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100525 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100526}
527
528FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP16, framework::DatasetMode::NIGHTLY,
giuros013bfacb22019-04-01 12:07:02 +0100529 combine(combine(LargeWinogradOutputTransformDatasetNHWC_F16,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100530 framework::dataset::make("DataType", { DataType::F16 })),
531 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100532{
533 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100534 validate(CLAccessor(_target), _reference, tolerance_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100535}
536TEST_SUITE_END() // FP16
537TEST_SUITE(FP32)
538FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::ALL,
giuros013bfacb22019-04-01 12:07:02 +0100539 combine(combine(SmallWinogradOutputTransformDatasetNHWC_F32,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100540 framework::dataset::make("DataType", { DataType::F32 })),
541 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000542{
543 // Validate output
544 validate(CLAccessor(_target), _reference, tolerance_f32);
545}
546
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100547FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradOutputTransformFixtureFP32, framework::DatasetMode::NIGHTLY,
giuros013bfacb22019-04-01 12:07:02 +0100548 combine(combine(LargeWinogradOutputTransformDatasetNHWC_F32,
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100549 framework::dataset::make("DataType", { DataType::F32 })),
550 framework::dataset::make("ActivationInfo",{ ActivationLayerInfo() }) ))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100551{
552 // Validate output
553 validate(CLAccessor(_target), _reference, tolerance_f32);
554}
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100555TEST_SUITE_END() // FP32
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100556TEST_SUITE_END() // NHWC
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000557TEST_SUITE_END() // OutputTransform
558
559TEST_SUITE(ConvolutionLayer)
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000560DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(zip(
561 framework::dataset::make("InputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100562 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F16), // Insufficient padding
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000563 TensorInfo(TensorShape(17U, 31U, 2U), 1, DataType::F32), // Datatype mismatch
564 TensorInfo(TensorShape(23U, 27U, 5U, 4U), 1, DataType::F32), // Stride y not supported
565 TensorInfo(TensorShape(16U, 16U, 8U), 1, DataType::F32), // Padding needed
566 TensorInfo(TensorShape(33U, 27U, 7U, 4U), 1, DataType::F32) // Kernel size not supported
567 }),
568 framework::dataset::make("WeightsInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100569 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000570 TensorInfo(TensorShape(3U, 3U, 2U, 19U), 1, DataType::QASYMM8),
571 TensorInfo(TensorShape(3U, 3U, 5U, 21U), 1, DataType::F32),
572 TensorInfo(TensorShape(3U, 3U, 8U, 16U), 1, DataType::F32),
573 TensorInfo(TensorShape(5U, 5U, 7U, 16U), 1, DataType::F16)
574 })),
575 framework::dataset::make("BiasesInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100576 TensorInfo(TensorShape(19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000577 TensorInfo(TensorShape(19U), 1, DataType::F32),
578 TensorInfo(TensorShape(21U), 1, DataType::F32),
579 TensorInfo(TensorShape(16U), 1, DataType::F32),
580 TensorInfo(TensorShape(16U), 1, DataType::F32)
581 })),
582 framework::dataset::make("OutputInfo", {
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100583 TensorInfo(TensorShape(17U, 31U, 19U), 1, DataType::F16),
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000584 TensorInfo(TensorShape(15U, 15U, 19U), 1, DataType::F32),
585 TensorInfo(TensorShape(21U, 25U, 21U, 4U), 1, DataType::F32),
586 TensorInfo(TensorShape(16U, 16U, 16U), 1, DataType::F32),
587 TensorInfo(TensorShape(11U, 12U, 16U, 4U), 1, DataType::F32)
588 })),
589 framework::dataset::make("ConvInfo", {
590 PadStrideInfo(1, 1, 1, 1),
591 PadStrideInfo(1, 1, 1, 1),
592 PadStrideInfo(1, 2, 0, 0),
593 PadStrideInfo(1, 1, 1, 1),
594 PadStrideInfo(1, 1, 1, 0)
595 })),
596 framework::dataset::make("Expected", { false, false, false, false, false })),
597 input_info, weights_info, bias_info, output_info, conv_info, expected)
598{
599 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);
600}
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000601
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100602TEST_SUITE(FP32)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100603using CLWinogradConvolutionLayerFastMathFixture = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, float>;
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100604TEST_SUITE(Conv3x3)
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100605FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100606 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
607 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000608 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100609 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100610{
611 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100612 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100613}
614
615FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100616 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
617 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100618 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100619 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100620{
621 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100622 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100623}
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100624TEST_SUITE_END() // Conv3x3
625
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100626TEST_SUITE(Conv3x1)
627FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
628 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
629 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000630 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100631 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100632{
633 // Validate output
634 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
635}
636
637FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
638 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
639 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100640 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100641 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100642{
643 // Validate output
644 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
645}
646TEST_SUITE_END() // Conv3x1
647
648TEST_SUITE(Conv1x3)
649FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
650 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
651 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000652 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100653 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100654{
655 // Validate output
656 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
657}
658
659FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
660 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
661 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100662 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100663 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodicef1c2bf02018-06-13 14:05:54 +0100664{
665 // Validate output
666 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
667}
668TEST_SUITE_END() // Conv1x3
669
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100670TEST_SUITE(Conv5x5)
671FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
Pablo Tello7282d562018-06-14 15:35:49 +0100672 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
673 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000674 ActivationFunctionsSmallDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100675 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100676
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100677{
678 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100679 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100680}
681
682FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
Pablo Tello7282d562018-06-14 15:35:49 +0100683 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
684 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100685 ActivationFunctionsDataset ),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100686 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Pablo Tello7282d562018-06-14 15:35:49 +0100687
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100688{
689 // Validate output
Gian Marco Iodice4497e812018-05-08 16:36:52 +0100690 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
Gian Marco Iodice6cf188c2018-05-04 16:36:50 +0100691}
692TEST_SUITE_END() // Conv5x5
Gian Marco Iodice2213d4b2018-04-27 10:39:06 +0100693
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100694TEST_SUITE(Conv5x1)
695FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
696 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
697 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000698 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100699 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100700
701{
702 // Validate output
703 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
704}
705
706FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
707 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
708 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100709 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100710 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100711
712{
713 // Validate output
714 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
715}
716TEST_SUITE_END() // Conv5x1
717
718TEST_SUITE(Conv1x5)
719FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::PRECOMMIT,
720 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
721 framework::dataset::make("DataType", { DataType::F32 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000722 ActivationFunctionsSmallDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100723 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100724
725{
726 // Validate output
727 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
728}
729
730FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture, framework::DatasetMode::NIGHTLY,
731 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
732 framework::dataset::make("DataType", { DataType::F32 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100733 ActivationFunctionsDataset),
Giorgio Arenaea55f912018-07-12 15:41:35 +0100734 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
Gian Marco Iodice876be2a2018-07-03 12:22:09 +0100735
736{
737 // Validate output
738 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f32);
739}
740TEST_SUITE_END() // Conv1x5
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100741TEST_SUITE_END() // FP32
742
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000743
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100744TEST_SUITE(FP16)
745
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000746using CLWinogradConvolutionLayerFastMathFixture16 = WinogradConvolutionLayerFastMathValidationFixture<CLTensor, CLAccessor, CLWinogradConvolutionLayer, half, float>;
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100747TEST_SUITE(Conv3x3)
748FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
749 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x3Dataset(),
750 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000751 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100752 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
753{
754 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100755 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100756}
757
758FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
759 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x3Dataset(),
760 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100761 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100762 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
763{
764 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000765 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100766}
767TEST_SUITE_END() // Conv3x3
768
769TEST_SUITE(Conv3x1)
770FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
771 combine(combine(combine(datasets::SmallWinogradConvolutionLayer3x1Dataset(),
772 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000773 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100774 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
775{
776 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100777 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100778}
779
780FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
781 combine(combine(combine(datasets::LargeWinogradConvolutionLayer3x1Dataset(),
782 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100783 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100784 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
785{
786 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000787 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100788}
789TEST_SUITE_END() // Conv3x1
790
791TEST_SUITE(Conv1x3)
792FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
793 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x3Dataset(),
794 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000795 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100796 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
797{
798 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100799 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100800}
801
802FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
803 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x3Dataset(),
804 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100805 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100806 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
807{
808 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000809 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100810}
811TEST_SUITE_END() // Conv1x3
812
813TEST_SUITE(Conv5x5)
814FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
815 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x5Dataset(),
816 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000817 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100818 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
819
820{
821 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100822 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100823}
824
825FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
826 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x5Dataset(),
827 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100828 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100829 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
830
831{
832 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000833 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100834}
835TEST_SUITE_END() // Conv5x5
836
837TEST_SUITE(Conv5x1)
838FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
839 combine(combine(combine(datasets::SmallWinogradConvolutionLayer5x1Dataset(),
840 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000841 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100842 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
843
844{
845 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100846 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100847}
848
849FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
850 combine(combine(combine(datasets::LargeWinogradConvolutionLayer5x1Dataset(),
851 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100852 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100853 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
854
855{
856 // Validate output
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000857 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100858}
859TEST_SUITE_END() // Conv5x1
860
861TEST_SUITE(Conv1x5)
862FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
863 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x5Dataset(),
864 framework::dataset::make("DataType", { DataType::F16 })),
Michalis Spyrou80943252019-01-10 17:19:50 +0000865 ActivationFunctionsSmallDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100866 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
867
868{
869 // Validate output
Pablo Tellof1cf3942019-09-19 16:39:04 +0100870 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100871}
872
873FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
874 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x5Dataset(),
875 framework::dataset::make("DataType", { DataType::F16 })),
Manuel Bottini0d0028c2018-10-02 16:41:52 +0100876 ActivationFunctionsDataset),
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100877 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })))
878
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() // Conv1x5
884
Pablo Tellof1cf3942019-09-19 16:39:04 +0100885TEST_SUITE(Conv1x7)
886FIXTURE_DATA_TEST_CASE(RunSmall, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::PRECOMMIT,
887 combine(combine(combine(datasets::SmallWinogradConvolutionLayer1x7Dataset(),
888 framework::dataset::make("DataType", { DataType::F16 })),
889 ActivationFunctionsSmallDataset),
890 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
891
892{
893 // Validate output
894 validate(CLAccessor(_target), _reference, tolerance_convolution_layer_f16, tolerance_num_f16);
895}
896
897FIXTURE_DATA_TEST_CASE(RunLarge, CLWinogradConvolutionLayerFastMathFixture16, framework::DatasetMode::NIGHTLY,
898 combine(combine(combine(datasets::LargeWinogradConvolutionLayer1x7Dataset(),
899 framework::dataset::make("DataType", { DataType::F16 })),
900 ActivationFunctionsDataset),
901 framework::dataset::make("DataLayout", { DataLayout::NHWC })))
902
903{
904 // Validate output
905 validate(CLAccessor(_target), _reference, rel_tolerance_f16, tolerance_num, abs_tolerance_convolution_layer_f16);
906}
907TEST_SUITE_END() // Conv1x7
908
Vidhya Sudhan Loganathan71ecf392018-08-31 16:10:16 +0100909TEST_SUITE_END() // FP16
Vidhya Sudhan Loganathana25d16c2018-11-16 11:33:12 +0000910
Gian Marco Iodiced2fab732018-03-02 11:18:12 +0000911TEST_SUITE_END() // ConvolutionLayer
Gian Marco Iodice7e4b2392018-02-22 16:17:20 +0000912TEST_SUITE_END() // Winograd
913TEST_SUITE_END() // CL
Giorgio Arena1f9ca1d2018-03-01 11:13:45 +0000914} // namespace validation
915} // namespace test
916} // namespace arm_compute