blob: 13bc34c99566b5855300fa035940a41b61e1200f [file] [log] [blame]
Sanghoon Leec8a85ba2017-11-29 11:23:14 +00001/*
Michalis Spyroud175ece2020-07-30 23:39:32 +01002 * Copyright (c) 2017-2020 Arm Limited.
Sanghoon Leec8a85ba2017-11-29 11:23:14 +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,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEConvolution.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
28#include "tests/NEON/Accessor.h"
29#include "tests/PaddingCalculator.h"
30#include "tests/datasets/BorderModeDataset.h"
31#include "tests/datasets/ShapeDatasets.h"
32#include "tests/framework/Asserts.h"
33#include "tests/framework/Macros.h"
34#include "tests/framework/datasets/Datasets.h"
35#include "tests/validation/Validation.h"
36#include "tests/validation/fixtures/ConvolutionFixture.h"
37
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
Georgios Pinitasacacc322017-12-13 12:48:44 +000046/** Tolerance value for comparing reference's output against implementation
47 *
48 * This is due to the fact that NEON target performs multiplication with reciprocal of scale,
49 * while reference performs direct division with scale.
50 */
51constexpr AbsoluteTolerance<uint8_t> tolerance_u8(1);
Sanghoon Leec8d23162018-01-12 16:19:10 +000052constexpr AbsoluteTolerance<int16_t> tolerance_s16(1);
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000053} // namespace
54
55TEST_SUITE(NEON)
56TEST_SUITE(CustomConvolution)
Sanghoon Leec0079e92018-01-29 17:28:49 +000057TEST_SUITE(Square3x3)
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000058template <typename T>
Sanghoon Leed7ba5392017-12-13 11:28:50 +000059using NEConvolutionFixture = ConvolutionSquareValidationFixture<Tensor, Accessor, NEConvolution3x3, T>;
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000060
Sanghoon Leec0079e92018-01-29 17:28:49 +000061TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000062FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
63 framework::dataset::make("DataType",
64 DataType::U8)),
Sanghoon Leed7ba5392017-12-13 11:28:50 +000065 datasets::BorderModes()),
66 framework::dataset::make("filter_size", { 3 })))
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000067{
68 // Validate output
Sanghoon Leed7ba5392017-12-13 11:28:50 +000069 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000070}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000071TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +000072
Sanghoon Leec0079e92018-01-29 17:28:49 +000073TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000074FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
75 framework::dataset::make("DataType",
76 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +000077 datasets::BorderModes()),
78 framework::dataset::make("filter_size", { 3 })))
79{
80 // Validate output
81 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
82}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000083TEST_SUITE_END() // S16
84TEST_SUITE_END() // Square3x3
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000085
Sanghoon Leec0079e92018-01-29 17:28:49 +000086TEST_SUITE(Square5x5)
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000087template <typename T>
Sanghoon Leed7ba5392017-12-13 11:28:50 +000088using NEConvolutionFixture = ConvolutionSquareValidationFixture<Tensor, Accessor, NEConvolution5x5, T>;
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000089
Sanghoon Leec0079e92018-01-29 17:28:49 +000090TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000091FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
92 framework::dataset::make("DataType",
93 DataType::U8)),
Sanghoon Leed7ba5392017-12-13 11:28:50 +000094 datasets::BorderModes()),
95 framework::dataset::make("filter_size", { 5 })))
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000096{
97 // Validate output
Sanghoon Leed7ba5392017-12-13 11:28:50 +000098 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
Sanghoon Leec8a85ba2017-11-29 11:23:14 +000099}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000100TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000101
Sanghoon Leec0079e92018-01-29 17:28:49 +0000102TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000103FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
104 framework::dataset::make("DataType",
105 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000106 datasets::BorderModes()),
107 framework::dataset::make("filter_size", { 5 })))
108{
109 // Validate output
110 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
111}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000112TEST_SUITE_END() // S16
113TEST_SUITE_END() // Square5x5
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000114
Sanghoon Leec0079e92018-01-29 17:28:49 +0000115TEST_SUITE(Square7x7)
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000116template <typename T>
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000117using NEConvolutionFixture = ConvolutionSquareValidationFixture<Tensor, Accessor, NEConvolution7x7, T>;
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000118
Sanghoon Leec0079e92018-01-29 17:28:49 +0000119TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000120FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
121 framework::dataset::make("DataType",
122 DataType::U8)),
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000123 datasets::BorderModes()),
124 framework::dataset::make("filter_size", { 7 })))
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000125{
126 // Validate output
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000127 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000128}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000129TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000130
Sanghoon Leec0079e92018-01-29 17:28:49 +0000131TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000132FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
133 framework::dataset::make("DataType",
134 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000135 datasets::BorderModes()),
136 framework::dataset::make("filter_size", { 7 })))
137{
138 // Validate output
139 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
140}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000141TEST_SUITE_END() // S16
142TEST_SUITE_END() // Square7x7
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000143
Sanghoon Leec0079e92018-01-29 17:28:49 +0000144TEST_SUITE(Square9x9)
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000145template <typename T>
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000146using NEConvolutionFixture = ConvolutionSquareValidationFixture<Tensor, Accessor, NEConvolution9x9, T>;
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000147
Sanghoon Leec0079e92018-01-29 17:28:49 +0000148TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000149FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
150 framework::dataset::make("DataType",
151 DataType::U8)),
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000152 datasets::BorderModes()),
153 framework::dataset::make("filter_size", { 9 })))
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000154{
155 // Validate output
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000156 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000157}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000158TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000159
Sanghoon Leec0079e92018-01-29 17:28:49 +0000160TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000161FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
162 framework::dataset::make("DataType",
163 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000164 datasets::BorderModes()),
165 framework::dataset::make("filter_size", { 9 })))
166{
167 // Validate output
168 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
169}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000170TEST_SUITE_END() // S16
171TEST_SUITE_END() // Square9x9
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000172
Sanghoon Leec0079e92018-01-29 17:28:49 +0000173TEST_SUITE(Rectangle)
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000174template <typename T>
175using NEConvolutionFixture = ConvolutionRectangleValidationFixture<Tensor, Accessor, NEConvolutionRectangle, T>;
176
Sanghoon Leec0079e92018-01-29 17:28:49 +0000177TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000178FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
179 framework::dataset::make("DataType",
180 DataType::U8)),
Sanghoon Leed7ba5392017-12-13 11:28:50 +0000181 datasets::BorderModes()),
182 framework::dataset::make("filter_width", { 3, 5, 7, 9 })),
183 framework::dataset::make("filter_height", { 3, 5, 7, 9 })))
184{
185 // Validate output
186 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
187}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000188TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000189
Sanghoon Leec0079e92018-01-29 17:28:49 +0000190TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000191FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
192 framework::dataset::make("DataType",
193 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000194 datasets::BorderModes()),
195 framework::dataset::make("filter_width", { 3, 5, 7, 9 })),
196 framework::dataset::make("filter_height", { 3, 5, 7, 9 })))
197{
198 // Validate output
199 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
200}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000201TEST_SUITE_END() // S16
202TEST_SUITE_END() // Rectangle
Sanghoon Leec8d23162018-01-12 16:19:10 +0000203
Sanghoon Leec0079e92018-01-29 17:28:49 +0000204TEST_SUITE(Separable5x5)
Sanghoon Leec8d23162018-01-12 16:19:10 +0000205template <typename T>
206using NEConvolutionFixture = ConvolutionSeparableValidationFixture<Tensor, Accessor, NEConvolution5x5, T>;
207
Sanghoon Leec0079e92018-01-29 17:28:49 +0000208TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000209FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
210 framework::dataset::make("DataType",
211 DataType::U8)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000212 datasets::BorderModes()),
213 framework::dataset::make("filter_size", { 5 })))
214{
215 // Validate output
216 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
217}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000218TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000219
Sanghoon Leec0079e92018-01-29 17:28:49 +0000220TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000221FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
222 framework::dataset::make("DataType",
223 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000224 datasets::BorderModes()),
225 framework::dataset::make("filter_size", { 5 })))
226{
227 // Validate output
228 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
229}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000230TEST_SUITE_END() // S16
231TEST_SUITE_END() // Separable5x5
Sanghoon Leec8d23162018-01-12 16:19:10 +0000232
Sanghoon Leec0079e92018-01-29 17:28:49 +0000233TEST_SUITE(Separable7x7)
Sanghoon Leec8d23162018-01-12 16:19:10 +0000234template <typename T>
235using NEConvolutionFixture = ConvolutionSeparableValidationFixture<Tensor, Accessor, NEConvolution7x7, T>;
236
Sanghoon Leec0079e92018-01-29 17:28:49 +0000237TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000238FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
239 framework::dataset::make("DataType",
240 DataType::U8)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000241 datasets::BorderModes()),
242 framework::dataset::make("filter_size", { 7 })))
243{
244 // Validate output
245 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
246}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000247TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000248
Sanghoon Leec0079e92018-01-29 17:28:49 +0000249TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000250FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
251 framework::dataset::make("DataType",
252 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000253 datasets::BorderModes()),
254 framework::dataset::make("filter_size", { 7 })))
255{
256 // Validate output
257 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
258}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000259TEST_SUITE_END() // S16
260TEST_SUITE_END() // Separable7x7
Sanghoon Leec8d23162018-01-12 16:19:10 +0000261
Sanghoon Leec0079e92018-01-29 17:28:49 +0000262TEST_SUITE(Separable9x9)
Sanghoon Leec8d23162018-01-12 16:19:10 +0000263template <typename T>
264using NEConvolutionFixture = ConvolutionSeparableValidationFixture<Tensor, Accessor, NEConvolution9x9, T>;
265
Sanghoon Leec0079e92018-01-29 17:28:49 +0000266TEST_SUITE(U8)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000267FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
268 framework::dataset::make("DataType",
269 DataType::U8)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000270 datasets::BorderModes()),
271 framework::dataset::make("filter_size", { 9 })))
272{
273 // Validate output
274 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_u8);
275}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000276TEST_SUITE_END() // U8
Sanghoon Leec8d23162018-01-12 16:19:10 +0000277
Sanghoon Leec0079e92018-01-29 17:28:49 +0000278TEST_SUITE(S16)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000279FIXTURE_DATA_TEST_CASE(RunLarge, NEConvolutionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(concat(datasets::SmallShapes(), datasets::LargeShapes()),
280 framework::dataset::make("DataType",
281 DataType::S16)),
Sanghoon Leec8d23162018-01-12 16:19:10 +0000282 datasets::BorderModes()),
283 framework::dataset::make("filter_size", { 9 })))
284{
285 // Validate output
286 validate(Accessor(_target), _reference, shape_to_valid_region(_reference.shape(), (_border_mode == BorderMode::UNDEFINED), BorderSize(_height / 2, _width / 2)), tolerance_s16);
287}
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000288TEST_SUITE_END() // S16
289TEST_SUITE_END() // Separable9x9
Sanghoon Leec0079e92018-01-29 17:28:49 +0000290
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000291TEST_SUITE_END() // CustomConvolution
292TEST_SUITE_END() // NEON
Sanghoon Leec8a85ba2017-11-29 11:23:14 +0000293} // namespace validation
294} // namespace test
295} // namespace arm_compute