blob: 1115ddcd8be0719969c4e2d00a0dac591b4f0b51 [file] [log] [blame]
Georgios Pinitas0bc78492019-03-18 20:07:37 +00001/*
Michalis Spyroud175ece2020-07-30 23:39:32 +01002 * Copyright (c) 2019-2020 Arm Limited.
Georgios Pinitas0bc78492019-03-18 20:07:37 +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/CL/CLTensor.h"
26#include "arm_compute/runtime/CL/functions/CLFFT1D.h"
Georgios Pinitas8be91482019-03-26 17:23:28 +000027#include "arm_compute/runtime/CL/functions/CLFFT2D.h"
28#include "arm_compute/runtime/CL/functions/CLFFTConvolutionLayer.h"
Georgios Pinitas0bc78492019-03-18 20:07:37 +000029#include "tests/CL/CLAccessor.h"
Georgios Pinitas8be91482019-03-26 17:23:28 +000030#include "tests/datasets/SmallConvolutionLayerDataset.h"
Georgios Pinitas0bc78492019-03-18 20:07:37 +000031#include "tests/framework/Asserts.h"
32#include "tests/framework/Macros.h"
33#include "tests/framework/datasets/Datasets.h"
34#include "tests/validation/Validation.h"
35#include "tests/validation/fixtures/FFTFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
45const auto data_types = framework::dataset::make("DataType", { DataType::F32 });
Georgios Pinitas8be91482019-03-26 17:23:28 +000046const auto shapes_1d = framework::dataset::make("TensorShape", { TensorShape(2U, 2U, 3U), TensorShape(3U, 2U, 3U),
Georgios Pinitas0bc78492019-03-18 20:07:37 +000047 TensorShape(4U, 2U, 3U), TensorShape(5U, 2U, 3U),
48 TensorShape(7U, 2U, 3U), TensorShape(8U, 2U, 3U),
49 TensorShape(9U, 2U, 3U), TensorShape(25U, 2U, 3U),
50 TensorShape(49U, 2U, 3U), TensorShape(64U, 2U, 3U),
51 TensorShape(16U, 2U, 3U), TensorShape(32U, 2U, 3U),
52 TensorShape(96U, 2U, 2U)
53 });
Georgios Pinitas8be91482019-03-26 17:23:28 +000054const auto shapes_2d = framework::dataset::make("TensorShape", { TensorShape(2U, 2U, 3U), TensorShape(3U, 6U, 3U),
55 TensorShape(4U, 5U, 3U), TensorShape(5U, 7U, 3U),
56 TensorShape(7U, 25U, 3U), TensorShape(8U, 2U, 3U),
57 TensorShape(9U, 16U, 3U), TensorShape(25U, 32U, 3U),
58 TensorShape(192U, 128U, 2U)
59 });
60
61const auto ActivationFunctionsSmallDataset = framework::dataset::make("ActivationInfo",
62{
63 ActivationLayerInfo(),
64 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 0.5f)
65});
66
67RelativeTolerance<float> tolerance_f32(0.1f); /**< Relative tolerance value for FP32 */
68constexpr float tolerance_num = 0.07f; /**< Tolerance number */
69
Georgios Pinitas0bc78492019-03-18 20:07:37 +000070} // namespace
71TEST_SUITE(CL)
72TEST_SUITE(FFT1D)
73
Georgios Pinitas0bc78492019-03-18 20:07:37 +000074// *INDENT-OFF*
75// clang-format off
76DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
77 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32), // Mismatching data types
78 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32), // Mismatching shapes
Georgios Pinitas8be91482019-03-26 17:23:28 +000079 TensorInfo(TensorShape(32U, 13U, 2U), 3, DataType::F32), // Invalid channels
Georgios Pinitas0bc78492019-03-18 20:07:37 +000080 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32), // Unsupported axis
81 TensorInfo(TensorShape(11U, 13U, 2U), 2, DataType::F32), // Undecomposable FFT
82 TensorInfo(TensorShape(25U, 13U, 2U), 2, DataType::F32),
83 }),
84 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F16),
85 TensorInfo(TensorShape(16U, 13U, 2U), 2, DataType::F32),
Georgios Pinitas8be91482019-03-26 17:23:28 +000086 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32),
Georgios Pinitas0bc78492019-03-18 20:07:37 +000087 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32),
88 TensorInfo(TensorShape(11U, 13U, 2U), 2, DataType::F32),
89 TensorInfo(TensorShape(25U, 13U, 2U), 2, DataType::F32),
90 })),
Georgios Pinitas8be91482019-03-26 17:23:28 +000091 framework::dataset::make("Axis", { 0, 0, 0, 2, 0, 0 })),
Georgios Pinitas0bc78492019-03-18 20:07:37 +000092 framework::dataset::make("Expected", { false, false, false, false, false, true })),
93 input_info, output_info, axis, expected)
94{
95 FFT1DInfo desc;
96 desc.axis = axis;
97 const Status s = CLFFT1D::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), desc);
98 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
99}
100// clang-format on
101// *INDENT-ON*
102
103template <typename T>
Georgios Pinitas8be91482019-03-26 17:23:28 +0000104using CLFFT1DFixture = FFTValidationFixture<CLTensor, CLAccessor, CLFFT1D, FFT1DInfo, T>;
Georgios Pinitas0bc78492019-03-18 20:07:37 +0000105
106TEST_SUITE(Float)
107TEST_SUITE(FP32)
Georgios Pinitas8be91482019-03-26 17:23:28 +0000108FIXTURE_DATA_TEST_CASE(RunSmall, CLFFT1DFixture<float>, framework::DatasetMode::ALL, combine(shapes_1d, framework::dataset::make("DataType", DataType::F32)))
Georgios Pinitas0bc78492019-03-18 20:07:37 +0000109{
110 // Validate output
Georgios Pinitas8be91482019-03-26 17:23:28 +0000111 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
Georgios Pinitas0bc78492019-03-18 20:07:37 +0000112}
113TEST_SUITE_END() // FP32
114TEST_SUITE_END() // Float
115
116TEST_SUITE_END() // FFT1D
Georgios Pinitas8be91482019-03-26 17:23:28 +0000117
118TEST_SUITE(FFT2D)
119
Georgios Pinitas8be91482019-03-26 17:23:28 +0000120// *INDENT-OFF*
121// clang-format off
122DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(
123 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(32U, 25U, 2U), 2, DataType::F32), // Mismatching data types
124 TensorInfo(TensorShape(32U, 25U, 2U), 2, DataType::F32), // Mismatching shapes
125 TensorInfo(TensorShape(32U, 25U, 2U), 3, DataType::F32), // Invalid channels
126 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32), // Undecomposable FFT
127 TensorInfo(TensorShape(32U, 25U, 2U), 2, DataType::F32),
128 }),
129 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 25U, 2U), 2, DataType::F16),
130 TensorInfo(TensorShape(16U, 25U, 2U), 2, DataType::F32),
131 TensorInfo(TensorShape(32U, 25U, 2U), 1, DataType::F32),
132 TensorInfo(TensorShape(32U, 13U, 2U), 2, DataType::F32),
133 TensorInfo(TensorShape(32U, 25U, 2U), 2, DataType::F32),
134 })),
135 framework::dataset::make("Expected", { false, false, false, false, true })),
136 input_info, output_info, expected)
137{
138 const Status s = CLFFT2D::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), FFT2DInfo());
139 ARM_COMPUTE_EXPECT(bool(s) == expected, framework::LogLevel::ERRORS);
140}
141// clang-format on
142// *INDENT-ON*
143
144template <typename T>
145using CLFFT2DFixture = FFTValidationFixture<CLTensor, CLAccessor, CLFFT2D, FFT2DInfo, T>;
146
147TEST_SUITE(Float)
148TEST_SUITE(FP32)
149FIXTURE_DATA_TEST_CASE(RunSmall, CLFFT2DFixture<float>, framework::DatasetMode::ALL, combine(shapes_2d, framework::dataset::make("DataType", DataType::F32)))
150{
151 // Validate output
152 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
153}
154TEST_SUITE_END() // FP32
155TEST_SUITE_END() // Float
156TEST_SUITE_END() // FFT2D
157
158TEST_SUITE(FFTConvolutionLayer)
159
160template <typename T>
161using CLFFTConvolutionLayerFixture = FFTConvolutionValidationFixture<CLTensor, CLAccessor, CLFFTConvolutionLayer, T>;
162
163TEST_SUITE(Float)
164TEST_SUITE(FP32)
165FIXTURE_DATA_TEST_CASE(RunSmall, CLFFTConvolutionLayerFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallFFTConvolutionLayerDataset(),
166 framework::dataset::make("DataType", DataType::F32)),
167 framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC })),
168 ActivationFunctionsSmallDataset))
169{
170 // Validate output
171 validate(CLAccessor(_target), _reference, tolerance_f32, tolerance_num);
172}
173TEST_SUITE_END() // FP32
174TEST_SUITE_END() // Float
175TEST_SUITE_END() // FFTConvolutionLayer
176
Georgios Pinitas0bc78492019-03-18 20:07:37 +0000177TEST_SUITE_END() // CL
178} // namespace validation
179} // namespace test
180} // namespace arm_compute