blob: bbcded9267f1e52968e04d9d4d45955f543ce9b4 [file] [log] [blame]
Gian Marco Iodice9285adb2019-09-05 16:10:27 +01001/*
2 * Copyright (c) 2019 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
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/CL/kernels/CLDepthwiseConvolutionLayerNativeKernel.h"
25#include "arm_compute/core/KernelDescriptors.h"
26#include "arm_compute/core/Types.h"
27#include "arm_compute/core/utils/misc/ShapeCalculator.h"
28#include "arm_compute/runtime/CL/CLTensor.h"
29#include "arm_compute/runtime/CL/CLTensorAllocator.h"
30#include "tests/CL/CLAccessor.h"
31#include "tests/CL/Helper.h"
32#include "tests/PaddingCalculator.h"
33#include "tests/datasets/ShapeDatasets.h"
34#include "tests/framework/Asserts.h"
35#include "tests/framework/Macros.h"
36#include "tests/framework/datasets/Datasets.h"
37#include "tests/validation/Validation.h"
38#include "tests/validation/fixtures/DepthwiseConvolutionLayerFixture.h"
39
40namespace arm_compute
41{
42namespace test
43{
44namespace validation
45{
46using namespace arm_compute::misc::shape_calculator;
47
48// Create function for CLDepthwiseConvolutionLayerNativeKernel
49using CLDepthwiseConvolutionLayerNative = CLSynthetizeFunction<CLDepthwiseConvolutionLayerNativeKernel>;
50
51// Fixture for CLDepthwiseConvolutionLayerNative
52template <typename T>
53using CLDepthwiseConvolutionLayerNativeFixture = DepthwiseConvolutionLayerNativeConfigurableValidationFixture<CLTensor, CLAccessor, CLDepthwiseConvolutionLayerNative, T>;
54
55namespace
56{
57// *INDENT-OFF*
58// clang-format off
59RelativeTolerance<float> rel_tolerance_f32(0.001f);
60constexpr float abs_tolerance_f32(0.0001f);
61
62RelativeTolerance<half_float::half> tolerance_f16(half_float::half(0.01));
63
64/** Width values to test - Precommit */
65const auto width_values_precommit = framework::dataset::make("width", { 37U } );
66
67/** Width values to test - Nightly */
68const auto width_values_nightly = framework::dataset::make("width", { 53U, 47U } );
69
70/** Height values to test - Precommit */
71const auto height_values_precommit = framework::dataset::make("height", { 19U } );
72
73/** Height values to test - Nightly */
74const auto height_values_nightly = framework::dataset::make("height", { 39U, 43U } );
75
76/** Channel values to test - Precommit */
77const auto channel_values_precommit = framework::dataset::make("channels", { 15U });
78
79/** Channel values to test - Nightly */
80const auto channel_values_nightly = framework::dataset::make("channels", { 33U, 19U });
81
82/** Batch values to test - Precommit */
83const auto batch_values_precommit = framework::dataset::make("batch", { 1U, 2U });
84
85/** Batch values to test - Nightly */
86const auto batch_values_nightly = framework::dataset::make("batch", { 1U, 3U });
87
88/** Kernel size values to test - Precommit */
89const auto kernel_sz_values_precommit = framework::dataset::make("kernel_size", { Size2D(1U, 1U), Size2D(1U, 3U), Size2D(5U, 5U) });
90
91/** Kernel size values to test - Nightly */
92const auto kernel_sz_values_nightly = framework::dataset::make("kernel_size", { Size2D(3U, 5U), Size2D(5U, 1U), Size2D(1U, 7U), Size2D(9U, 7U) });
93
94/** Depth multiplier values to test - All */
95const auto depth_multiplier_values = framework::dataset::make("depth_multiplier", {3U});
96
97/** Dilation values to test - All */
98const auto dilation_values = framework::dataset::make("dilation", { Size2D(1U, 1U), Size2D(3U, 3U) });
99
100/** Stride values to test - All */
101const auto stride_values = framework::dataset::make("stride", { Size2D(1U, 1U), Size2D(3U, 2U) });
102
103/** Padding values to test - All */
104const auto padding_valid_values = framework::dataset::make("padding_valid", { true, false });
105
106/** Data type values to test - All */
107const auto data_type_values = framework::dataset::make("data_type", { DataType::F32, DataType::F16 });
108
109/** Data layout values to test - All */
110const auto data_layout_values = framework::dataset::make("data_layout", { DataLayout::NHWC });
111
112/** N0 values to test - Precommit */
113const auto n0_values_precommit = framework::dataset::make("N0", {2, 4});
114
115/** N0 values to test - Nightly */
116const auto n0_values_nightly = framework::dataset::make("N0", {3, 8});
117
118/** Activation values to test */
119const auto act_values = framework::dataset::make("Activation",
120{
121 ActivationLayerInfo(),
122 ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::LU_BOUNDED_RELU, 8.f, 2.f),
123});
124
125} // namespace
126
127TEST_SUITE(CL)
128TEST_SUITE(DepthwiseConvolutionLayerNative)
129TEST_SUITE(Float)
130TEST_SUITE(FP32)
131FIXTURE_DATA_TEST_CASE(RunSmall, CLDepthwiseConvolutionLayerNativeFixture<float>, framework::DatasetMode::ALL,
132 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
133 width_values_precommit,
134 height_values_precommit),
135 channel_values_precommit),
136 batch_values_precommit),
137 kernel_sz_values_precommit),
138 framework::dataset::make("depth_multiplier", 1)),
139 dilation_values),
140 stride_values),
141 padding_valid_values),
142 framework::dataset::make("DataType", DataType::F32)),
143 data_layout_values),
144 act_values),
145 n0_values_precommit))
146{
147 // Validate output
148 validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32);
149}
150
151FIXTURE_DATA_TEST_CASE(RunLarge, CLDepthwiseConvolutionLayerNativeFixture<float>, framework::DatasetMode::NIGHTLY,
152 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
153 width_values_nightly,
154 height_values_nightly),
155 channel_values_nightly),
156 batch_values_nightly),
157 kernel_sz_values_nightly),
158 framework::dataset::make("depth_multiplier", 1)),
159 dilation_values),
160 stride_values),
161 padding_valid_values),
162 framework::dataset::make("DataType", DataType::F32)),
163 data_layout_values),
164 act_values),
165 n0_values_nightly))
166{
167 // Validate output
168 validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32);
169}
170TEST_SUITE_END() // FP32
171
172TEST_SUITE(FP16)
173FIXTURE_DATA_TEST_CASE(RunSmall, CLDepthwiseConvolutionLayerNativeFixture<half>, framework::DatasetMode::ALL,
174 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
175 width_values_precommit,
176 height_values_precommit),
177 channel_values_precommit),
178 batch_values_precommit),
179 kernel_sz_values_precommit),
180 framework::dataset::make("depth_multiplier", 1)),
181 dilation_values),
182 stride_values),
183 padding_valid_values),
184 framework::dataset::make("DataType", DataType::F16)),
185 data_layout_values),
186 act_values),
187 n0_values_precommit))
188{
189 // Validate output
190 validate(CLAccessor(_target), _reference, tolerance_f16);
191}
192
193FIXTURE_DATA_TEST_CASE(RunLarge, CLDepthwiseConvolutionLayerNativeFixture<half>, framework::DatasetMode::NIGHTLY,
194 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
195 width_values_nightly,
196 height_values_nightly),
197 channel_values_nightly),
198 batch_values_nightly),
199 kernel_sz_values_nightly),
200 framework::dataset::make("depth_multiplier", 1)),
201 dilation_values),
202 stride_values),
203 padding_valid_values),
204 framework::dataset::make("DataType", DataType::F16)),
205 data_layout_values),
206 act_values),
207 n0_values_nightly))
208{
209 // Validate output
210 validate(CLAccessor(_target), _reference, tolerance_f16);
211}
212TEST_SUITE_END() // FP16
213TEST_SUITE_END() // Float
214TEST_SUITE(DepthMultiplier)
215TEST_SUITE(Float)
216TEST_SUITE(FP32)
217FIXTURE_DATA_TEST_CASE(RunSmall, CLDepthwiseConvolutionLayerNativeFixture<float>, framework::DatasetMode::ALL,
218 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
219 width_values_precommit,
220 height_values_precommit),
221 channel_values_precommit),
222 batch_values_precommit),
223 kernel_sz_values_precommit),
224 depth_multiplier_values),
225 dilation_values),
226 stride_values),
227 padding_valid_values),
228 framework::dataset::make("DataType", DataType::F32)),
229 data_layout_values),
230 act_values),
231 framework::dataset::make("N0", 1)))
232{
233 // Validate output
234 validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32);
235}
236
237FIXTURE_DATA_TEST_CASE(RunLarge, CLDepthwiseConvolutionLayerNativeFixture<float>, framework::DatasetMode::NIGHTLY,
238 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
239 width_values_nightly,
240 height_values_nightly),
241 channel_values_nightly),
242 batch_values_nightly),
243 kernel_sz_values_nightly),
244 depth_multiplier_values),
245 dilation_values),
246 stride_values),
247 padding_valid_values),
248 framework::dataset::make("DataType", DataType::F32)),
249 data_layout_values),
250 act_values),
251 framework::dataset::make("N0", 1)))
252{
253 // Validate output
254 validate(CLAccessor(_target), _reference, rel_tolerance_f32, 0.f, abs_tolerance_f32);
255}
256TEST_SUITE_END() // FP32
257
258TEST_SUITE(FP16)
259FIXTURE_DATA_TEST_CASE(RunSmall, CLDepthwiseConvolutionLayerNativeFixture<half>, framework::DatasetMode::ALL,
260 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
261 width_values_precommit,
262 height_values_precommit),
263 channel_values_precommit),
264 batch_values_precommit),
265 kernel_sz_values_precommit),
266 depth_multiplier_values),
267 dilation_values),
268 stride_values),
269 padding_valid_values),
270 framework::dataset::make("DataType", DataType::F16)),
271 data_layout_values),
272 act_values),
273 framework::dataset::make("N0", 1)))
274{
275 // Validate output
276 validate(CLAccessor(_target), _reference, tolerance_f16);
277}
278
279FIXTURE_DATA_TEST_CASE(RunLarge, CLDepthwiseConvolutionLayerNativeFixture<half>, framework::DatasetMode::NIGHTLY,
280 combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(combine(
281 width_values_nightly,
282 height_values_nightly),
283 channel_values_nightly),
284 batch_values_nightly),
285 kernel_sz_values_nightly),
286 depth_multiplier_values),
287 dilation_values),
288 stride_values),
289 padding_valid_values),
290 framework::dataset::make("DataType", DataType::F16)),
291 data_layout_values),
292 act_values),
293 framework::dataset::make("N0", 1)))
294{
295 // Validate output
296 validate(CLAccessor(_target), _reference, tolerance_f16);
297}
298TEST_SUITE_END() // FP16
299TEST_SUITE_END() // Float
300TEST_SUITE_END() // DepthMultiplier
301TEST_SUITE_END() // DepthwiseConvolutionLayerNative
302TEST_SUITE_END() // CL
303} // namespace validation
304} // namespace test
305} // namespace arm_compute