blob: 9e4c72e3679ba12e437cdb3e7ff85187e7976ab6 [file] [log] [blame]
XNNPACK Teamb455b122019-09-27 18:10:33 -07001// Copyright 2019 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6#include <gtest/gtest.h>
7
8#include <xnnpack/params.h>
9
10#include "deconvolution-operator-tester.h"
11
12
Marat Dukhana41533d2019-11-04 10:40:51 -080013constexpr size_t kUnstridedInputHeight = 8;
14constexpr size_t kUnstridedInputWidth = 7;
15constexpr size_t kStridedInputHeight = 6;
16constexpr size_t kStridedInputWidth = 5;
17
18
XNNPACK Teamb455b122019-09-27 18:10:33 -070019/**************************** Future GEMM path ****************************/
20
Marat Dukhanefc47b82019-11-18 09:25:38 -080021TEST(DECONVOLUTION_NHWC_Q8, 1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070022 ASSERT_EQ(xnn_status_success, xnn_initialize());
23 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080024 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070025 .kernel_size(1, 1)
26 .group_input_channels(23)
27 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
28 .iterations(3)
29 .TestQ8();
30}
31
Marat Dukhanefc47b82019-11-18 09:25:38 -080032TEST(DECONVOLUTION_NHWC_Q8, 1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070033 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -080034 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070035 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080036 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070037 .kernel_size(1, 1)
38 .group_input_channels(23)
39 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
40 .iterations(1)
41 .TestQ8();
42 }
43}
44
Marat Dukhanefc47b82019-11-18 09:25:38 -080045TEST(DECONVOLUTION_NHWC_Q8, 1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070046 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -080047 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070048 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080049 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -070050 .kernel_size(1, 1)
51 .group_input_channels(23)
52 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
53 .iterations(1)
54 .TestQ8();
55 }
56}
57
Marat Dukhanefc47b82019-11-18 09:25:38 -080058TEST(DECONVOLUTION_NHWC_Q8, 1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070059 ASSERT_EQ(xnn_status_success, xnn_initialize());
60 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
61 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080062 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070063 .kernel_size(1, 1)
64 .group_input_channels(input_channels)
65 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
66 .iterations(1)
67 .TestQ8();
68 }
69}
70
Marat Dukhanefc47b82019-11-18 09:25:38 -080071TEST(DECONVOLUTION_NHWC_Q8, 1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070072 ASSERT_EQ(xnn_status_success, xnn_initialize());
73 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
74 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080075 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070076 .kernel_size(1, 1)
77 .group_input_channels(23)
78 .group_output_channels(output_channels)
79 .iterations(1)
80 .TestQ8();
81 }
82}
83
Marat Dukhanefc47b82019-11-18 09:25:38 -080084TEST(DECONVOLUTION_NHWC_Q8, 1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070085 ASSERT_EQ(xnn_status_success, xnn_initialize());
86 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080087 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070088 .kernel_size(1, 1)
89 .group_input_channels(23)
90 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
91 .input_pixel_stride(28)
92 .iterations(3)
93 .TestQ8();
94}
95
Marat Dukhanefc47b82019-11-18 09:25:38 -080096TEST(DECONVOLUTION_NHWC_Q8, 1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070097 ASSERT_EQ(xnn_status_success, xnn_initialize());
98 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080099 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700100 .kernel_size(1, 1)
101 .group_input_channels(23)
102 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
103 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
104 .iterations(3)
105 .TestQ8();
106}
107
Marat Dukhanefc47b82019-11-18 09:25:38 -0800108TEST(DECONVOLUTION_NHWC_Q8, 1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700109 ASSERT_EQ(xnn_status_success, xnn_initialize());
110 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800111 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700112 .kernel_size(1, 1)
113 .group_input_channels(23)
114 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
115 .qmin(128)
116 .iterations(3)
117 .TestQ8();
118}
119
Marat Dukhanefc47b82019-11-18 09:25:38 -0800120TEST(DECONVOLUTION_NHWC_Q8, 1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700121 ASSERT_EQ(xnn_status_success, xnn_initialize());
122 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800123 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700124 .kernel_size(1, 1)
125 .group_input_channels(23)
126 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -0700127 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700128 .iterations(3)
129 .TestQ8();
130}
131
Marat Dukhanefc47b82019-11-18 09:25:38 -0800132TEST(DECONVOLUTION_NHWC_Q8, 1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -0700133 ASSERT_EQ(xnn_status_success, xnn_initialize());
134 DeconvolutionOperatorTester()
135 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -0800136 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -0700137 .kernel_size(1, 1)
138 .group_input_channels(23)
139 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
140 .iterations(3)
141 .TestQ8();
142}
143
XNNPACK Teamb455b122019-09-27 18:10:33 -0700144/**************************** Future GEMM path, grouped ****************************/
145
Marat Dukhanefc47b82019-11-18 09:25:38 -0800146TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700147 ASSERT_EQ(xnn_status_success, xnn_initialize());
148 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800149 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700150 .kernel_size(1, 1)
151 .groups(2)
152 .group_input_channels(23)
153 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
154 .iterations(3)
155 .TestQ8();
156}
157
Marat Dukhanefc47b82019-11-18 09:25:38 -0800158TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700159 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800160 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700161 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800162 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700163 .kernel_size(1, 1)
164 .groups(2)
165 .group_input_channels(23)
166 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
167 .iterations(1)
168 .TestQ8();
169 }
170}
171
Marat Dukhanefc47b82019-11-18 09:25:38 -0800172TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700173 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800174 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700175 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800176 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700177 .kernel_size(1, 1)
178 .groups(2)
179 .group_input_channels(23)
180 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
181 .iterations(1)
182 .TestQ8();
183 }
184}
185
Marat Dukhanefc47b82019-11-18 09:25:38 -0800186TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700187 ASSERT_EQ(xnn_status_success, xnn_initialize());
188 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
189 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800190 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700191 .kernel_size(1, 1)
192 .groups(2)
193 .group_input_channels(input_channels)
194 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
195 .iterations(1)
196 .TestQ8();
197 }
198}
199
Marat Dukhanefc47b82019-11-18 09:25:38 -0800200TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700201 ASSERT_EQ(xnn_status_success, xnn_initialize());
202 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
203 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800204 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700205 .kernel_size(1, 1)
206 .groups(2)
207 .group_input_channels(23)
208 .group_output_channels(output_channels)
209 .iterations(1)
210 .TestQ8();
211 }
212}
213
Marat Dukhanefc47b82019-11-18 09:25:38 -0800214TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700215 ASSERT_EQ(xnn_status_success, xnn_initialize());
216 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800217 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700218 .kernel_size(1, 1)
219 .groups(2)
220 .group_input_channels(23)
221 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
222 .input_pixel_stride(47)
223 .iterations(3)
224 .TestQ8();
225}
226
Marat Dukhanefc47b82019-11-18 09:25:38 -0800227TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700228 ASSERT_EQ(xnn_status_success, xnn_initialize());
229 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800230 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700231 .kernel_size(1, 1)
232 .groups(2)
233 .group_input_channels(23)
234 .group_output_channels(xnn_params.q8.gemm.nr + 3)
235 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
236 .iterations(3)
237 .TestQ8();
238}
239
Marat Dukhanefc47b82019-11-18 09:25:38 -0800240TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700241 ASSERT_EQ(xnn_status_success, xnn_initialize());
242 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800243 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700244 .kernel_size(1, 1)
245 .groups(2)
246 .group_input_channels(23)
247 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
248 .qmin(128)
249 .iterations(3)
250 .TestQ8();
251}
252
Marat Dukhanefc47b82019-11-18 09:25:38 -0800253TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700254 ASSERT_EQ(xnn_status_success, xnn_initialize());
255 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800256 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700257 .kernel_size(1, 1)
258 .groups(2)
259 .group_input_channels(23)
260 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -0700261 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700262 .iterations(3)
263 .TestQ8();
264}
265
Marat Dukhanefc47b82019-11-18 09:25:38 -0800266TEST(DECONVOLUTION_NHWC_Q8, grouped_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -0700267 ASSERT_EQ(xnn_status_success, xnn_initialize());
268 DeconvolutionOperatorTester()
269 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -0800270 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -0700271 .kernel_size(1, 1)
272 .groups(2)
273 .group_input_channels(23)
274 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
275 .iterations(3)
276 .TestQ8();
277}
278
XNNPACK Teamb455b122019-09-27 18:10:33 -0700279/**************************** Future GEMM path, batched ****************************/
280
Marat Dukhanefc47b82019-11-18 09:25:38 -0800281TEST(DECONVOLUTION_NHWC_Q8, batched_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700282 ASSERT_EQ(xnn_status_success, xnn_initialize());
283 DeconvolutionOperatorTester()
284 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800285 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700286 .kernel_size(1, 1)
287 .group_input_channels(23)
288 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
289 .iterations(3)
290 .TestQ8();
291}
292
Marat Dukhanefc47b82019-11-18 09:25:38 -0800293TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700294 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800295 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700296 DeconvolutionOperatorTester()
297 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800298 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700299 .kernel_size(1, 1)
300 .group_input_channels(23)
301 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
302 .iterations(1)
303 .TestQ8();
304 }
305}
306
Marat Dukhanefc47b82019-11-18 09:25:38 -0800307TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700308 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800309 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700310 DeconvolutionOperatorTester()
311 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800312 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700313 .kernel_size(1, 1)
314 .group_input_channels(23)
315 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
316 .iterations(1)
317 .TestQ8();
318 }
319}
320
Marat Dukhanefc47b82019-11-18 09:25:38 -0800321TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700322 ASSERT_EQ(xnn_status_success, xnn_initialize());
323 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
324 DeconvolutionOperatorTester()
325 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800326 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700327 .kernel_size(1, 1)
328 .group_input_channels(input_channels)
329 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
330 .iterations(1)
331 .TestQ8();
332 }
333}
334
Marat Dukhanefc47b82019-11-18 09:25:38 -0800335TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700336 ASSERT_EQ(xnn_status_success, xnn_initialize());
337 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
338 DeconvolutionOperatorTester()
339 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800340 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700341 .kernel_size(1, 1)
342 .group_input_channels(23)
343 .group_output_channels(output_channels)
344 .iterations(1)
345 .TestQ8();
346 }
347}
348
Marat Dukhanefc47b82019-11-18 09:25:38 -0800349TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700350 ASSERT_EQ(xnn_status_success, xnn_initialize());
351 DeconvolutionOperatorTester()
352 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800353 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700354 .kernel_size(1, 1)
355 .group_input_channels(23)
356 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
357 .input_pixel_stride(28)
358 .iterations(3)
359 .TestQ8();
360}
361
Marat Dukhanefc47b82019-11-18 09:25:38 -0800362TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700363 ASSERT_EQ(xnn_status_success, xnn_initialize());
364 DeconvolutionOperatorTester()
365 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800366 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700367 .kernel_size(1, 1)
368 .group_input_channels(23)
369 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
370 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
371 .iterations(3)
372 .TestQ8();
373}
374
Marat Dukhanefc47b82019-11-18 09:25:38 -0800375TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700376 ASSERT_EQ(xnn_status_success, xnn_initialize());
377 DeconvolutionOperatorTester()
378 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800379 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700380 .kernel_size(1, 1)
381 .group_input_channels(23)
382 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
383 .qmin(128)
384 .iterations(3)
385 .TestQ8();
386}
387
Marat Dukhanefc47b82019-11-18 09:25:38 -0800388TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700389 ASSERT_EQ(xnn_status_success, xnn_initialize());
390 DeconvolutionOperatorTester()
391 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800392 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700393 .kernel_size(1, 1)
394 .group_input_channels(23)
395 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -0700396 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700397 .iterations(3)
398 .TestQ8();
399}
400
Marat Dukhanefc47b82019-11-18 09:25:38 -0800401TEST(DECONVOLUTION_NHWC_Q8, batched_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -0700402 ASSERT_EQ(xnn_status_success, xnn_initialize());
403 DeconvolutionOperatorTester()
404 .has_bias(false)
405 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800406 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -0700407 .kernel_size(1, 1)
408 .group_input_channels(23)
409 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
410 .iterations(3)
411 .TestQ8();
412}
413
XNNPACK Teamb455b122019-09-27 18:10:33 -0700414/**************************** Future GEMM path, batched, grouped ****************************/
415
Marat Dukhanefc47b82019-11-18 09:25:38 -0800416TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700417 ASSERT_EQ(xnn_status_success, xnn_initialize());
418 DeconvolutionOperatorTester()
419 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800420 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700421 .kernel_size(1, 1)
422 .groups(2)
423 .group_input_channels(23)
424 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
425 .iterations(3)
426 .TestQ8();
427}
428
Marat Dukhanefc47b82019-11-18 09:25:38 -0800429TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700430 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800431 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700432 DeconvolutionOperatorTester()
433 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800434 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700435 .kernel_size(1, 1)
436 .groups(2)
437 .group_input_channels(23)
438 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
439 .iterations(1)
440 .TestQ8();
441 }
442}
443
Marat Dukhanefc47b82019-11-18 09:25:38 -0800444TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700445 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800446 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700447 DeconvolutionOperatorTester()
448 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800449 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700450 .kernel_size(1, 1)
451 .groups(2)
452 .group_input_channels(23)
453 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
454 .iterations(1)
455 .TestQ8();
456 }
457}
458
Marat Dukhanefc47b82019-11-18 09:25:38 -0800459TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700460 ASSERT_EQ(xnn_status_success, xnn_initialize());
461 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
462 DeconvolutionOperatorTester()
463 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800464 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700465 .kernel_size(1, 1)
466 .groups(2)
467 .group_input_channels(input_channels)
468 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
469 .iterations(1)
470 .TestQ8();
471 }
472}
473
Marat Dukhanefc47b82019-11-18 09:25:38 -0800474TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700475 ASSERT_EQ(xnn_status_success, xnn_initialize());
476 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
477 DeconvolutionOperatorTester()
478 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800479 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700480 .kernel_size(1, 1)
481 .groups(2)
482 .group_input_channels(23)
483 .group_output_channels(output_channels)
484 .iterations(1)
485 .TestQ8();
486 }
487}
488
Marat Dukhanefc47b82019-11-18 09:25:38 -0800489TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700490 ASSERT_EQ(xnn_status_success, xnn_initialize());
491 DeconvolutionOperatorTester()
492 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800493 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700494 .kernel_size(1, 1)
495 .groups(2)
496 .group_input_channels(23)
497 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
498 .input_pixel_stride(47)
499 .iterations(3)
500 .TestQ8();
501}
502
Marat Dukhanefc47b82019-11-18 09:25:38 -0800503TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700504 ASSERT_EQ(xnn_status_success, xnn_initialize());
505 DeconvolutionOperatorTester()
506 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800507 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700508 .kernel_size(1, 1)
509 .groups(2)
510 .group_input_channels(23)
511 .group_output_channels(xnn_params.q8.gemm.nr + 3)
512 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
513 .iterations(3)
514 .TestQ8();
515}
516
Marat Dukhanefc47b82019-11-18 09:25:38 -0800517TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700518 ASSERT_EQ(xnn_status_success, xnn_initialize());
519 DeconvolutionOperatorTester()
520 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800521 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700522 .kernel_size(1, 1)
523 .groups(2)
524 .group_input_channels(23)
525 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
526 .qmin(128)
527 .iterations(3)
528 .TestQ8();
529}
530
Marat Dukhanefc47b82019-11-18 09:25:38 -0800531TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700532 ASSERT_EQ(xnn_status_success, xnn_initialize());
533 DeconvolutionOperatorTester()
534 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800535 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700536 .kernel_size(1, 1)
537 .groups(2)
538 .group_input_channels(23)
539 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -0700540 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700541 .iterations(3)
542 .TestQ8();
543}
544
Marat Dukhanefc47b82019-11-18 09:25:38 -0800545TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -0700546 ASSERT_EQ(xnn_status_success, xnn_initialize());
547 DeconvolutionOperatorTester()
548 .has_bias(false)
549 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -0800550 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -0700551 .kernel_size(1, 1)
552 .groups(2)
553 .group_input_channels(23)
554 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
555 .iterations(3)
556 .TestQ8();
557}
558
XNNPACK Teamb455b122019-09-27 18:10:33 -0700559/**************************** CONV path ****************************/
560
Marat Dukhanefc47b82019-11-18 09:25:38 -0800561TEST(DECONVOLUTION_NHWC_Q8, 3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700562 ASSERT_EQ(xnn_status_success, xnn_initialize());
563 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800564 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700565 .padding(1)
566 .kernel_size(3, 3)
567 .group_input_channels(15)
568 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
569 .iterations(3)
570 .TestQ8();
571}
572
Marat Dukhanefc47b82019-11-18 09:25:38 -0800573TEST(DECONVOLUTION_NHWC_Q8, Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700574 ASSERT_EQ(xnn_status_success, xnn_initialize());
575 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
576 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800577 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700578 .padding_width(1)
579 .kernel_size(kernel_height, 3)
580 .group_input_channels(17)
581 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
582 .iterations(3)
583 .TestQ8();
584 }
585}
586
Marat Dukhanefc47b82019-11-18 09:25:38 -0800587TEST(DECONVOLUTION_NHWC_Q8, 3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700588 ASSERT_EQ(xnn_status_success, xnn_initialize());
589 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
590 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800591 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700592 .padding_height(1)
593 .kernel_size(3, kernel_width)
594 .group_input_channels(17)
595 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
596 .iterations(3)
597 .TestQ8();
598 }
599}
600
Marat Dukhanefc47b82019-11-18 09:25:38 -0800601TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700602 ASSERT_EQ(xnn_status_success, xnn_initialize());
603 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
604 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
605 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800606 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700607 .padding_width(1)
608 .padding_top(padding_top)
609 .padding_bottom(padding_bottom)
610 .kernel_size(3, 3)
611 .group_input_channels(15)
612 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
613 .iterations(1)
614 .TestQ8();
615 }
616 }
617}
618
Marat Dukhanefc47b82019-11-18 09:25:38 -0800619TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700620 ASSERT_EQ(xnn_status_success, xnn_initialize());
621 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
622 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
623 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800624 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700625 .padding_height(1)
626 .padding_left(padding_left)
627 .padding_right(padding_right)
628 .kernel_size(3, 3)
629 .group_input_channels(15)
630 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
631 .iterations(1)
632 .TestQ8();
633 }
634 }
635}
636
Marat Dukhanefc47b82019-11-18 09:25:38 -0800637TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700638 ASSERT_EQ(xnn_status_success, xnn_initialize());
639 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
640 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800641 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700642 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -0800643 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700644 .adjustment_height(adjustment_height)
645 .kernel_size(3, 3)
646 .group_input_channels(15)
647 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
648 .iterations(1)
649 .TestQ8();
650 }
651}
652
Marat Dukhanefc47b82019-11-18 09:25:38 -0800653TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700654 ASSERT_EQ(xnn_status_success, xnn_initialize());
655 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
656 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800657 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700658 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -0800659 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700660 .adjustment_width(adjustment_width)
661 .kernel_size(3, 3)
662 .group_input_channels(15)
663 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
664 .iterations(1)
665 .TestQ8();
666 }
667}
668
Marat Dukhanefc47b82019-11-18 09:25:38 -0800669TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700670 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800671 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700672 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800673 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700674 .padding(1)
675 .kernel_size(3, 3)
676 .group_input_channels(15)
677 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
678 .iterations(1)
679 .TestQ8();
680 }
681}
682
Marat Dukhanefc47b82019-11-18 09:25:38 -0800683TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700684 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800685 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700686 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800687 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700688 .padding(1)
689 .kernel_size(3, 3)
690 .group_input_channels(15)
691 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
692 .iterations(1)
693 .TestQ8();
694 }
695}
696
Marat Dukhanefc47b82019-11-18 09:25:38 -0800697TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700698 ASSERT_EQ(xnn_status_success, xnn_initialize());
699 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
700 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800701 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700702 .padding(1)
703 .kernel_size(3, 3)
704 .group_input_channels(input_channels)
705 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
706 .iterations(1)
707 .TestQ8();
708 }
709}
710
Marat Dukhanefc47b82019-11-18 09:25:38 -0800711TEST(DECONVOLUTION_NHWC_Q8, 3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700712 ASSERT_EQ(xnn_status_success, xnn_initialize());
713 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
714 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800715 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700716 .padding(1)
717 .kernel_size(3, 3)
718 .group_input_channels(23)
719 .group_output_channels(output_channels)
720 .iterations(1)
721 .TestQ8();
722 }
723}
724
Marat Dukhanefc47b82019-11-18 09:25:38 -0800725TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700726 ASSERT_EQ(xnn_status_success, xnn_initialize());
727 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
728 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800729 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700730 .padding(1)
731 .kernel_size(3, 3)
732 .dilation_height(dilation_height)
733 .group_input_channels(23)
734 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
735 .iterations(3)
736 .TestQ8();
737 }
738}
739
Marat Dukhanefc47b82019-11-18 09:25:38 -0800740TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700741 ASSERT_EQ(xnn_status_success, xnn_initialize());
742 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
743 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800744 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700745 .padding(1)
746 .kernel_size(3, 3)
747 .dilation_width(dilation_width)
748 .group_input_channels(23)
749 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
750 .iterations(3)
751 .TestQ8();
752 }
753}
754
Marat Dukhanefc47b82019-11-18 09:25:38 -0800755TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700756 ASSERT_EQ(xnn_status_success, xnn_initialize());
757 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800758 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700759 .padding(1)
760 .kernel_size(3, 3)
761 .dilation_height(3)
762 .stride_height(2)
763 .group_input_channels(23)
764 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
765 .iterations(3)
766 .TestQ8();
767}
768
Marat Dukhanefc47b82019-11-18 09:25:38 -0800769TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700770 ASSERT_EQ(xnn_status_success, xnn_initialize());
771 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800772 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700773 .padding(1)
774 .kernel_size(3, 3)
775 .dilation_width(3)
776 .stride_width(2)
777 .group_input_channels(23)
778 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
779 .iterations(3)
780 .TestQ8();
781}
782
Marat Dukhanefc47b82019-11-18 09:25:38 -0800783TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700784 ASSERT_EQ(xnn_status_success, xnn_initialize());
785 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800786 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700787 .padding(1)
788 .kernel_size(3, 3)
789 .group_input_channels(23)
790 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
791 .input_pixel_stride(28)
792 .iterations(3)
793 .TestQ8();
794}
795
Marat Dukhanefc47b82019-11-18 09:25:38 -0800796TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700797 ASSERT_EQ(xnn_status_success, xnn_initialize());
798 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800799 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700800 .padding(1)
801 .kernel_size(3, 3)
802 .group_input_channels(23)
803 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
804 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
805 .iterations(3)
806 .TestQ8();
807}
808
Marat Dukhanefc47b82019-11-18 09:25:38 -0800809TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700810 ASSERT_EQ(xnn_status_success, xnn_initialize());
811 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800812 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700813 .padding(1)
814 .kernel_size(3, 3)
815 .group_input_channels(23)
816 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
817 .qmin(128)
818 .iterations(3)
819 .TestQ8();
820}
821
Marat Dukhanefc47b82019-11-18 09:25:38 -0800822TEST(DECONVOLUTION_NHWC_Q8, 3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700823 ASSERT_EQ(xnn_status_success, xnn_initialize());
824 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800825 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700826 .padding(1)
827 .kernel_size(3, 3)
828 .group_input_channels(23)
829 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -0700830 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700831 .iterations(3)
832 .TestQ8();
833}
834
Marat Dukhanefc47b82019-11-18 09:25:38 -0800835TEST(DECONVOLUTION_NHWC_Q8, 3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -0700836 ASSERT_EQ(xnn_status_success, xnn_initialize());
837 DeconvolutionOperatorTester()
838 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -0800839 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -0700840 .padding(1)
841 .kernel_size(3, 3)
842 .group_input_channels(23)
843 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
844 .iterations(3)
845 .TestQ8();
846}
847
XNNPACK Teamb455b122019-09-27 18:10:33 -0700848/**************************** CONV path, grouped ****************************/
849
Marat Dukhanefc47b82019-11-18 09:25:38 -0800850TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700851 ASSERT_EQ(xnn_status_success, xnn_initialize());
852 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800853 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700854 .padding(1)
855 .kernel_size(3, 3)
856 .groups(2)
857 .group_input_channels(15)
858 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
859 .iterations(3)
860 .TestQ8();
861}
862
Marat Dukhanefc47b82019-11-18 09:25:38 -0800863TEST(DECONVOLUTION_NHWC_Q8, grouped_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700864 ASSERT_EQ(xnn_status_success, xnn_initialize());
865 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
866 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800867 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700868 .padding_width(1)
869 .kernel_size(kernel_height, 3)
870 .groups(2)
871 .group_input_channels(17)
872 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
873 .iterations(3)
874 .TestQ8();
875 }
876}
877
Marat Dukhanefc47b82019-11-18 09:25:38 -0800878TEST(DECONVOLUTION_NHWC_Q8, grouped_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700879 ASSERT_EQ(xnn_status_success, xnn_initialize());
880 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
881 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800882 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700883 .padding_height(1)
884 .kernel_size(3, kernel_width)
885 .groups(2)
886 .group_input_channels(17)
887 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
888 .iterations(3)
889 .TestQ8();
890 }
891}
892
Marat Dukhanefc47b82019-11-18 09:25:38 -0800893TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700894 ASSERT_EQ(xnn_status_success, xnn_initialize());
895 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
896 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
897 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800898 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700899 .padding_width(1)
900 .padding_top(padding_top)
901 .padding_bottom(padding_bottom)
902 .kernel_size(3, 3)
903 .groups(2)
904 .group_input_channels(15)
905 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
906 .iterations(1)
907 .TestQ8();
908 }
909 }
910}
911
Marat Dukhanefc47b82019-11-18 09:25:38 -0800912TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700913 ASSERT_EQ(xnn_status_success, xnn_initialize());
914 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
915 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
916 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800917 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700918 .padding_height(1)
919 .padding_left(padding_left)
920 .padding_right(padding_right)
921 .kernel_size(3, 3)
922 .groups(2)
923 .group_input_channels(15)
924 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
925 .iterations(1)
926 .TestQ8();
927 }
928 }
929}
930
Marat Dukhanefc47b82019-11-18 09:25:38 -0800931TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700932 ASSERT_EQ(xnn_status_success, xnn_initialize());
933 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
934 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800935 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700936 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -0800937 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700938 .adjustment_height(adjustment_height)
939 .kernel_size(3, 3)
940 .groups(2)
941 .group_input_channels(15)
942 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
943 .iterations(1)
944 .TestQ8();
945 }
946}
947
Marat Dukhanefc47b82019-11-18 09:25:38 -0800948TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700949 ASSERT_EQ(xnn_status_success, xnn_initialize());
950 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
951 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800952 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700953 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -0800954 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700955 .adjustment_width(adjustment_width)
956 .kernel_size(3, 3)
957 .groups(2)
958 .group_input_channels(15)
959 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
960 .iterations(1)
961 .TestQ8();
962 }
963}
964
Marat Dukhanefc47b82019-11-18 09:25:38 -0800965TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700966 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800967 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700968 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800969 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700970 .padding(1)
971 .kernel_size(3, 3)
972 .groups(2)
973 .group_input_channels(15)
974 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
975 .iterations(1)
976 .TestQ8();
977 }
978}
979
Marat Dukhanefc47b82019-11-18 09:25:38 -0800980TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700981 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -0800982 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700983 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800984 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -0700985 .padding(1)
986 .kernel_size(3, 3)
987 .groups(2)
988 .group_input_channels(15)
989 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
990 .iterations(1)
991 .TestQ8();
992 }
993}
994
Marat Dukhanefc47b82019-11-18 09:25:38 -0800995TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -0700996 ASSERT_EQ(xnn_status_success, xnn_initialize());
997 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
998 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -0800999 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001000 .padding(1)
1001 .kernel_size(3, 3)
1002 .groups(2)
1003 .group_input_channels(input_channels)
1004 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1005 .iterations(1)
1006 .TestQ8();
1007 }
1008}
1009
Marat Dukhanefc47b82019-11-18 09:25:38 -08001010TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001011 ASSERT_EQ(xnn_status_success, xnn_initialize());
1012 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
1013 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001014 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001015 .padding(1)
1016 .kernel_size(3, 3)
1017 .groups(2)
1018 .group_input_channels(23)
1019 .group_output_channels(output_channels)
1020 .iterations(1)
1021 .TestQ8();
1022 }
1023}
1024
Marat Dukhanefc47b82019-11-18 09:25:38 -08001025TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001026 ASSERT_EQ(xnn_status_success, xnn_initialize());
1027 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1028 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001029 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001030 .padding(1)
1031 .kernel_size(3, 3)
1032 .dilation_height(dilation_height)
1033 .groups(2)
1034 .group_input_channels(23)
1035 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1036 .iterations(3)
1037 .TestQ8();
1038 }
1039}
1040
Marat Dukhanefc47b82019-11-18 09:25:38 -08001041TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001042 ASSERT_EQ(xnn_status_success, xnn_initialize());
1043 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1044 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001045 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001046 .padding(1)
1047 .kernel_size(3, 3)
1048 .dilation_width(dilation_width)
1049 .groups(2)
1050 .group_input_channels(23)
1051 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1052 .iterations(3)
1053 .TestQ8();
1054 }
1055}
1056
Marat Dukhanefc47b82019-11-18 09:25:38 -08001057TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001058 ASSERT_EQ(xnn_status_success, xnn_initialize());
1059 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001060 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001061 .padding(1)
1062 .kernel_size(3, 3)
1063 .dilation_height(3)
1064 .stride_height(2)
1065 .groups(2)
1066 .group_input_channels(23)
1067 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1068 .iterations(3)
1069 .TestQ8();
1070}
1071
Marat Dukhanefc47b82019-11-18 09:25:38 -08001072TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001073 ASSERT_EQ(xnn_status_success, xnn_initialize());
1074 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001075 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001076 .padding(1)
1077 .kernel_size(3, 3)
1078 .dilation_width(3)
1079 .stride_width(2)
1080 .groups(2)
1081 .group_input_channels(23)
1082 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1083 .iterations(3)
1084 .TestQ8();
1085}
1086
Marat Dukhanefc47b82019-11-18 09:25:38 -08001087TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001088 ASSERT_EQ(xnn_status_success, xnn_initialize());
1089 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001090 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001091 .padding(1)
1092 .kernel_size(3, 3)
1093 .groups(2)
1094 .group_input_channels(23)
1095 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1096 .input_pixel_stride(47)
1097 .iterations(3)
1098 .TestQ8();
1099}
1100
Marat Dukhanefc47b82019-11-18 09:25:38 -08001101TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001102 ASSERT_EQ(xnn_status_success, xnn_initialize());
1103 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001104 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001105 .padding(1)
1106 .kernel_size(3, 3)
1107 .groups(2)
1108 .group_input_channels(23)
1109 .group_output_channels(xnn_params.q8.gemm.nr + 3)
1110 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
1111 .iterations(3)
1112 .TestQ8();
1113}
1114
Marat Dukhanefc47b82019-11-18 09:25:38 -08001115TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001116 ASSERT_EQ(xnn_status_success, xnn_initialize());
1117 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001118 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001119 .padding(1)
1120 .kernel_size(3, 3)
1121 .groups(2)
1122 .group_input_channels(23)
1123 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1124 .qmin(128)
1125 .iterations(3)
1126 .TestQ8();
1127}
1128
Marat Dukhanefc47b82019-11-18 09:25:38 -08001129TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001130 ASSERT_EQ(xnn_status_success, xnn_initialize());
1131 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001132 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001133 .padding(1)
1134 .kernel_size(3, 3)
1135 .groups(2)
1136 .group_input_channels(23)
1137 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07001138 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001139 .iterations(3)
1140 .TestQ8();
1141}
1142
Marat Dukhanefc47b82019-11-18 09:25:38 -08001143TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07001144 ASSERT_EQ(xnn_status_success, xnn_initialize());
1145 DeconvolutionOperatorTester()
1146 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08001147 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07001148 .padding(1)
1149 .kernel_size(3, 3)
1150 .groups(2)
1151 .group_input_channels(23)
1152 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1153 .iterations(3)
1154 .TestQ8();
1155}
1156
XNNPACK Teamb455b122019-09-27 18:10:33 -07001157/**************************** CONV path, batched ****************************/
1158
Marat Dukhanefc47b82019-11-18 09:25:38 -08001159TEST(DECONVOLUTION_NHWC_Q8, batched_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001160 ASSERT_EQ(xnn_status_success, xnn_initialize());
1161 DeconvolutionOperatorTester()
1162 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001163 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001164 .padding(1)
1165 .kernel_size(3, 3)
1166 .group_input_channels(15)
1167 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1168 .iterations(3)
1169 .TestQ8();
1170}
1171
Marat Dukhanefc47b82019-11-18 09:25:38 -08001172TEST(DECONVOLUTION_NHWC_Q8, batched_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001173 ASSERT_EQ(xnn_status_success, xnn_initialize());
1174 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
1175 DeconvolutionOperatorTester()
1176 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001177 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001178 .padding_width(1)
1179 .kernel_size(kernel_height, 3)
1180 .group_input_channels(17)
1181 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1182 .iterations(3)
1183 .TestQ8();
1184 }
1185}
1186
Marat Dukhanefc47b82019-11-18 09:25:38 -08001187TEST(DECONVOLUTION_NHWC_Q8, batched_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001188 ASSERT_EQ(xnn_status_success, xnn_initialize());
1189 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
1190 DeconvolutionOperatorTester()
1191 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001192 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001193 .padding_height(1)
1194 .kernel_size(3, kernel_width)
1195 .group_input_channels(17)
1196 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1197 .iterations(3)
1198 .TestQ8();
1199 }
1200}
1201
Marat Dukhanefc47b82019-11-18 09:25:38 -08001202TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001203 ASSERT_EQ(xnn_status_success, xnn_initialize());
1204 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
1205 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
1206 DeconvolutionOperatorTester()
1207 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001208 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001209 .padding_width(1)
1210 .padding_top(padding_top)
1211 .padding_bottom(padding_bottom)
1212 .kernel_size(3, 3)
1213 .group_input_channels(15)
1214 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1215 .iterations(1)
1216 .TestQ8();
1217 }
1218 }
1219}
1220
Marat Dukhanefc47b82019-11-18 09:25:38 -08001221TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001222 ASSERT_EQ(xnn_status_success, xnn_initialize());
1223 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
1224 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
1225 DeconvolutionOperatorTester()
1226 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001227 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001228 .padding_height(1)
1229 .padding_left(padding_left)
1230 .padding_right(padding_right)
1231 .kernel_size(3, 3)
1232 .group_input_channels(15)
1233 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1234 .iterations(1)
1235 .TestQ8();
1236 }
1237 }
1238}
1239
Marat Dukhanefc47b82019-11-18 09:25:38 -08001240TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001241 ASSERT_EQ(xnn_status_success, xnn_initialize());
1242 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
1243 DeconvolutionOperatorTester()
1244 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001245 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001246 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08001247 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001248 .adjustment_height(adjustment_height)
1249 .kernel_size(3, 3)
1250 .group_input_channels(15)
1251 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1252 .iterations(1)
1253 .TestQ8();
1254 }
1255}
1256
Marat Dukhanefc47b82019-11-18 09:25:38 -08001257TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001258 ASSERT_EQ(xnn_status_success, xnn_initialize());
1259 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
1260 DeconvolutionOperatorTester()
1261 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001262 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001263 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08001264 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001265 .adjustment_width(adjustment_width)
1266 .kernel_size(3, 3)
1267 .group_input_channels(15)
1268 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1269 .iterations(1)
1270 .TestQ8();
1271 }
1272}
1273
Marat Dukhanefc47b82019-11-18 09:25:38 -08001274TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001275 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08001276 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001277 DeconvolutionOperatorTester()
1278 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001279 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001280 .padding(1)
1281 .kernel_size(3, 3)
1282 .group_input_channels(15)
1283 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1284 .iterations(1)
1285 .TestQ8();
1286 }
1287}
1288
Marat Dukhanefc47b82019-11-18 09:25:38 -08001289TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001290 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08001291 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001292 DeconvolutionOperatorTester()
1293 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001294 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001295 .padding(1)
1296 .kernel_size(3, 3)
1297 .group_input_channels(15)
1298 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1299 .iterations(1)
1300 .TestQ8();
1301 }
1302}
1303
Marat Dukhanefc47b82019-11-18 09:25:38 -08001304TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001305 ASSERT_EQ(xnn_status_success, xnn_initialize());
1306 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
1307 DeconvolutionOperatorTester()
1308 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001309 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001310 .padding(1)
1311 .kernel_size(3, 3)
1312 .group_input_channels(input_channels)
1313 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1314 .iterations(1)
1315 .TestQ8();
1316 }
1317}
1318
Marat Dukhanefc47b82019-11-18 09:25:38 -08001319TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001320 ASSERT_EQ(xnn_status_success, xnn_initialize());
1321 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
1322 DeconvolutionOperatorTester()
1323 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001324 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001325 .padding(1)
1326 .kernel_size(3, 3)
1327 .group_input_channels(23)
1328 .group_output_channels(output_channels)
1329 .iterations(1)
1330 .TestQ8();
1331 }
1332}
1333
Marat Dukhanefc47b82019-11-18 09:25:38 -08001334TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001335 ASSERT_EQ(xnn_status_success, xnn_initialize());
1336 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1337 DeconvolutionOperatorTester()
1338 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001339 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001340 .padding(1)
1341 .kernel_size(3, 3)
1342 .dilation_height(dilation_height)
1343 .group_input_channels(23)
1344 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1345 .iterations(3)
1346 .TestQ8();
1347 }
1348}
1349
Marat Dukhanefc47b82019-11-18 09:25:38 -08001350TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001351 ASSERT_EQ(xnn_status_success, xnn_initialize());
1352 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1353 DeconvolutionOperatorTester()
1354 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001355 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001356 .padding(1)
1357 .kernel_size(3, 3)
1358 .dilation_width(dilation_width)
1359 .group_input_channels(23)
1360 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1361 .iterations(3)
1362 .TestQ8();
1363 }
1364}
1365
Marat Dukhanefc47b82019-11-18 09:25:38 -08001366TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001367 ASSERT_EQ(xnn_status_success, xnn_initialize());
1368 DeconvolutionOperatorTester()
1369 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001370 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001371 .padding(1)
1372 .kernel_size(3, 3)
1373 .dilation_height(3)
1374 .stride_height(2)
1375 .group_input_channels(23)
1376 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1377 .iterations(3)
1378 .TestQ8();
1379}
1380
Marat Dukhanefc47b82019-11-18 09:25:38 -08001381TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001382 ASSERT_EQ(xnn_status_success, xnn_initialize());
1383 DeconvolutionOperatorTester()
1384 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001385 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001386 .padding(1)
1387 .kernel_size(3, 3)
1388 .dilation_width(3)
1389 .stride_width(2)
1390 .group_input_channels(23)
1391 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1392 .iterations(3)
1393 .TestQ8();
1394}
1395
Marat Dukhanefc47b82019-11-18 09:25:38 -08001396TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001397 ASSERT_EQ(xnn_status_success, xnn_initialize());
1398 DeconvolutionOperatorTester()
1399 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001400 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001401 .padding(1)
1402 .kernel_size(3, 3)
1403 .group_input_channels(23)
1404 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1405 .input_pixel_stride(28)
1406 .iterations(3)
1407 .TestQ8();
1408}
1409
Marat Dukhanefc47b82019-11-18 09:25:38 -08001410TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001411 ASSERT_EQ(xnn_status_success, xnn_initialize());
1412 DeconvolutionOperatorTester()
1413 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001414 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001415 .padding(1)
1416 .kernel_size(3, 3)
1417 .group_input_channels(23)
1418 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1419 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
1420 .iterations(3)
1421 .TestQ8();
1422}
1423
Marat Dukhanefc47b82019-11-18 09:25:38 -08001424TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001425 ASSERT_EQ(xnn_status_success, xnn_initialize());
1426 DeconvolutionOperatorTester()
1427 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001428 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001429 .padding(1)
1430 .kernel_size(3, 3)
1431 .group_input_channels(23)
1432 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1433 .qmin(128)
1434 .iterations(3)
1435 .TestQ8();
1436}
1437
Marat Dukhanefc47b82019-11-18 09:25:38 -08001438TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001439 ASSERT_EQ(xnn_status_success, xnn_initialize());
1440 DeconvolutionOperatorTester()
1441 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001442 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001443 .padding(1)
1444 .kernel_size(3, 3)
1445 .group_input_channels(23)
1446 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07001447 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001448 .iterations(3)
1449 .TestQ8();
1450}
1451
Marat Dukhanefc47b82019-11-18 09:25:38 -08001452TEST(DECONVOLUTION_NHWC_Q8, batched_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07001453 ASSERT_EQ(xnn_status_success, xnn_initialize());
1454 DeconvolutionOperatorTester()
1455 .has_bias(false)
1456 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001457 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07001458 .padding(1)
1459 .kernel_size(3, 3)
1460 .group_input_channels(23)
1461 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1462 .iterations(3)
1463 .TestQ8();
1464}
1465
XNNPACK Teamb455b122019-09-27 18:10:33 -07001466/**************************** CONV path, grouped, batched ****************************/
1467
Marat Dukhanefc47b82019-11-18 09:25:38 -08001468TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001469 ASSERT_EQ(xnn_status_success, xnn_initialize());
1470 DeconvolutionOperatorTester()
1471 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001472 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001473 .padding(1)
1474 .kernel_size(3, 3)
1475 .groups(2)
1476 .group_input_channels(15)
1477 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1478 .iterations(3)
1479 .TestQ8();
1480}
1481
Marat Dukhanefc47b82019-11-18 09:25:38 -08001482TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001483 ASSERT_EQ(xnn_status_success, xnn_initialize());
1484 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
1485 DeconvolutionOperatorTester()
1486 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001487 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001488 .padding_width(1)
1489 .kernel_size(kernel_height, 3)
1490 .groups(2)
1491 .group_input_channels(17)
1492 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1493 .iterations(3)
1494 .TestQ8();
1495 }
1496}
1497
Marat Dukhanefc47b82019-11-18 09:25:38 -08001498TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001499 ASSERT_EQ(xnn_status_success, xnn_initialize());
1500 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
1501 DeconvolutionOperatorTester()
1502 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001503 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001504 .padding_height(1)
1505 .kernel_size(3, kernel_width)
1506 .groups(2)
1507 .group_input_channels(17)
1508 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1509 .iterations(3)
1510 .TestQ8();
1511 }
1512}
1513
Marat Dukhanefc47b82019-11-18 09:25:38 -08001514TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001515 ASSERT_EQ(xnn_status_success, xnn_initialize());
1516 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
1517 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
1518 DeconvolutionOperatorTester()
1519 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001520 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001521 .padding_width(1)
1522 .padding_top(padding_top)
1523 .padding_bottom(padding_bottom)
1524 .kernel_size(3, 3)
1525 .groups(2)
1526 .group_input_channels(15)
1527 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1528 .iterations(1)
1529 .TestQ8();
1530 }
1531 }
1532}
1533
Marat Dukhanefc47b82019-11-18 09:25:38 -08001534TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001535 ASSERT_EQ(xnn_status_success, xnn_initialize());
1536 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
1537 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
1538 DeconvolutionOperatorTester()
1539 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001540 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001541 .padding_height(1)
1542 .padding_left(padding_left)
1543 .padding_right(padding_right)
1544 .kernel_size(3, 3)
1545 .groups(2)
1546 .group_input_channels(15)
1547 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1548 .iterations(1)
1549 .TestQ8();
1550 }
1551 }
1552}
1553
Marat Dukhanefc47b82019-11-18 09:25:38 -08001554TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001555 ASSERT_EQ(xnn_status_success, xnn_initialize());
1556 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
1557 DeconvolutionOperatorTester()
1558 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001559 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001560 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08001561 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001562 .adjustment_height(adjustment_height)
1563 .kernel_size(3, 3)
1564 .groups(2)
1565 .group_input_channels(15)
1566 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1567 .iterations(1)
1568 .TestQ8();
1569 }
1570}
1571
Marat Dukhanefc47b82019-11-18 09:25:38 -08001572TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001573 ASSERT_EQ(xnn_status_success, xnn_initialize());
1574 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
1575 DeconvolutionOperatorTester()
1576 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001577 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001578 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08001579 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001580 .adjustment_width(adjustment_width)
1581 .kernel_size(3, 3)
1582 .groups(2)
1583 .group_input_channels(15)
1584 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1585 .iterations(1)
1586 .TestQ8();
1587 }
1588}
1589
Marat Dukhanefc47b82019-11-18 09:25:38 -08001590TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001591 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08001592 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001593 DeconvolutionOperatorTester()
1594 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001595 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001596 .padding(1)
1597 .kernel_size(3, 3)
1598 .groups(2)
1599 .group_input_channels(15)
1600 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1601 .iterations(1)
1602 .TestQ8();
1603 }
1604}
1605
Marat Dukhanefc47b82019-11-18 09:25:38 -08001606TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001607 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08001608 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001609 DeconvolutionOperatorTester()
1610 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001611 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001612 .padding(1)
1613 .kernel_size(3, 3)
1614 .groups(2)
1615 .group_input_channels(15)
1616 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1617 .iterations(1)
1618 .TestQ8();
1619 }
1620}
1621
Marat Dukhanefc47b82019-11-18 09:25:38 -08001622TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001623 ASSERT_EQ(xnn_status_success, xnn_initialize());
1624 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
1625 DeconvolutionOperatorTester()
1626 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001627 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001628 .padding(1)
1629 .kernel_size(3, 3)
1630 .groups(2)
1631 .group_input_channels(input_channels)
1632 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1633 .iterations(1)
1634 .TestQ8();
1635 }
1636}
1637
Marat Dukhanefc47b82019-11-18 09:25:38 -08001638TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001639 ASSERT_EQ(xnn_status_success, xnn_initialize());
1640 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
1641 DeconvolutionOperatorTester()
1642 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001643 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001644 .padding(1)
1645 .kernel_size(3, 3)
1646 .groups(2)
1647 .group_input_channels(23)
1648 .group_output_channels(output_channels)
1649 .iterations(1)
1650 .TestQ8();
1651 }
1652}
1653
Marat Dukhanefc47b82019-11-18 09:25:38 -08001654TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001655 ASSERT_EQ(xnn_status_success, xnn_initialize());
1656 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1657 DeconvolutionOperatorTester()
1658 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001659 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001660 .padding(1)
1661 .kernel_size(3, 3)
1662 .dilation_height(dilation_height)
1663 .groups(2)
1664 .group_input_channels(23)
1665 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1666 .iterations(3)
1667 .TestQ8();
1668 }
1669}
1670
Marat Dukhanefc47b82019-11-18 09:25:38 -08001671TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001672 ASSERT_EQ(xnn_status_success, xnn_initialize());
1673 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1674 DeconvolutionOperatorTester()
1675 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001676 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001677 .padding(1)
1678 .kernel_size(3, 3)
1679 .dilation_width(dilation_width)
1680 .groups(2)
1681 .group_input_channels(23)
1682 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1683 .iterations(3)
1684 .TestQ8();
1685 }
1686}
1687
Marat Dukhanefc47b82019-11-18 09:25:38 -08001688TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001689 ASSERT_EQ(xnn_status_success, xnn_initialize());
1690 DeconvolutionOperatorTester()
1691 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001692 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001693 .padding(1)
1694 .kernel_size(3, 3)
1695 .dilation_height(3)
1696 .stride_width(2)
1697 .groups(2)
1698 .group_input_channels(23)
1699 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1700 .iterations(3)
1701 .TestQ8();
1702}
1703
Marat Dukhanefc47b82019-11-18 09:25:38 -08001704TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001705 ASSERT_EQ(xnn_status_success, xnn_initialize());
1706 DeconvolutionOperatorTester()
1707 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001708 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001709 .padding(1)
1710 .kernel_size(3, 3)
1711 .dilation_width(3)
1712 .stride_width(2)
1713 .groups(2)
1714 .group_input_channels(23)
1715 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1716 .iterations(3)
1717 .TestQ8();
1718}
1719
Marat Dukhanefc47b82019-11-18 09:25:38 -08001720TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001721 ASSERT_EQ(xnn_status_success, xnn_initialize());
1722 DeconvolutionOperatorTester()
1723 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001724 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001725 .padding(1)
1726 .kernel_size(3, 3)
1727 .groups(2)
1728 .group_input_channels(23)
1729 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1730 .input_pixel_stride(47)
1731 .iterations(3)
1732 .TestQ8();
1733}
1734
Marat Dukhanefc47b82019-11-18 09:25:38 -08001735TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001736 ASSERT_EQ(xnn_status_success, xnn_initialize());
1737 DeconvolutionOperatorTester()
1738 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001739 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001740 .padding(1)
1741 .kernel_size(3, 3)
1742 .groups(2)
1743 .group_input_channels(23)
1744 .group_output_channels(xnn_params.q8.gemm.nr + 3)
1745 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
1746 .iterations(3)
1747 .TestQ8();
1748}
1749
Marat Dukhanefc47b82019-11-18 09:25:38 -08001750TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001751 ASSERT_EQ(xnn_status_success, xnn_initialize());
1752 DeconvolutionOperatorTester()
1753 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001754 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001755 .padding(1)
1756 .kernel_size(3, 3)
1757 .groups(2)
1758 .group_input_channels(23)
1759 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1760 .qmin(128)
1761 .iterations(3)
1762 .TestQ8();
1763}
1764
Marat Dukhanefc47b82019-11-18 09:25:38 -08001765TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001766 ASSERT_EQ(xnn_status_success, xnn_initialize());
1767 DeconvolutionOperatorTester()
1768 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001769 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001770 .padding(1)
1771 .kernel_size(3, 3)
1772 .groups(2)
1773 .group_input_channels(23)
1774 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07001775 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001776 .iterations(3)
1777 .TestQ8();
1778}
1779
Marat Dukhanefc47b82019-11-18 09:25:38 -08001780TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07001781 ASSERT_EQ(xnn_status_success, xnn_initialize());
1782 DeconvolutionOperatorTester()
1783 .has_bias(false)
1784 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001785 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07001786 .padding(1)
1787 .kernel_size(3, 3)
1788 .groups(2)
1789 .group_input_channels(23)
1790 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1791 .iterations(3)
1792 .TestQ8();
1793}
1794
XNNPACK Teamb455b122019-09-27 18:10:33 -07001795/**************************** CONV path, setup ****************************/
1796
Marat Dukhanefc47b82019-11-18 09:25:38 -08001797TEST(DECONVOLUTION_NHWC_Q8, 3x3_setup_changing_batch) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001798 ASSERT_EQ(xnn_status_success, xnn_initialize());
1799 DeconvolutionOperatorTester()
1800 .batch_size(2)
1801 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08001802 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001803 .kernel_height(3)
1804 .kernel_width(5)
1805 .groups(2)
1806 .group_input_channels(15)
1807 .group_output_channels(17)
1808 .TestSetupQ8();
1809}
1810
Marat Dukhanefc47b82019-11-18 09:25:38 -08001811TEST(DECONVOLUTION_NHWC_Q8, 3x3_setup_changing_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001812 ASSERT_EQ(xnn_status_success, xnn_initialize());
1813 DeconvolutionOperatorTester()
1814 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001815 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1816 .next_input_height(kUnstridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001817 .kernel_height(3)
1818 .kernel_width(5)
1819 .groups(2)
1820 .group_input_channels(15)
1821 .group_output_channels(17)
1822 .TestSetupQ8();
1823}
1824
Marat Dukhanefc47b82019-11-18 09:25:38 -08001825TEST(DECONVOLUTION_NHWC_Q8, 3x3_setup_changing_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001826 ASSERT_EQ(xnn_status_success, xnn_initialize());
1827 DeconvolutionOperatorTester()
1828 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08001829 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1830 .next_input_width(kUnstridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001831 .kernel_height(3)
1832 .kernel_width(5)
1833 .groups(2)
1834 .group_input_channels(15)
1835 .group_output_channels(17)
1836 .TestSetupQ8();
1837}
1838
1839/**************************** SUBCONV2D path ****************************/
1840
Marat Dukhanefc47b82019-11-18 09:25:38 -08001841TEST(DECONVOLUTION_NHWC_Q8, 3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001842 ASSERT_EQ(xnn_status_success, xnn_initialize());
1843 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001844 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001845 .padding(1)
1846 .kernel_size(3, 3)
1847 .stride(2)
1848 .group_input_channels(15)
1849 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1850 .iterations(3)
1851 .TestQ8();
1852}
1853
Marat Dukhanefc47b82019-11-18 09:25:38 -08001854TEST(DECONVOLUTION_NHWC_Q8, Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001855 ASSERT_EQ(xnn_status_success, xnn_initialize());
1856 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
1857 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001858 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001859 .padding_width(1)
1860 .kernel_size(kernel_height, 3)
1861 .stride(2)
1862 .group_input_channels(17)
1863 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1864 .iterations(3)
1865 .TestQ8();
1866 }
1867}
1868
Marat Dukhanefc47b82019-11-18 09:25:38 -08001869TEST(DECONVOLUTION_NHWC_Q8, 3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001870 ASSERT_EQ(xnn_status_success, xnn_initialize());
1871 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
1872 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001873 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001874 .padding_height(1)
1875 .kernel_size(3, kernel_width)
1876 .stride(2)
1877 .group_input_channels(17)
1878 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1879 .iterations(3)
1880 .TestQ8();
1881 }
1882}
1883
Marat Dukhanefc47b82019-11-18 09:25:38 -08001884TEST(DECONVOLUTION_NHWC_Q8, 3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001885 ASSERT_EQ(xnn_status_success, xnn_initialize());
1886 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
1887 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001888 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001889 .padding(1)
1890 .padding_width(1)
1891 .kernel_size(3, 3)
1892 .stride_height(stride_height)
1893 .group_input_channels(17)
1894 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1895 .iterations(3)
1896 .TestQ8();
1897 }
1898}
1899
Marat Dukhanefc47b82019-11-18 09:25:38 -08001900TEST(DECONVOLUTION_NHWC_Q8, 3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001901 ASSERT_EQ(xnn_status_success, xnn_initialize());
1902 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
1903 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001904 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001905 .padding(1)
1906 .padding_width(1)
1907 .kernel_size(3, 3)
1908 .stride_width(stride_width)
1909 .group_input_channels(17)
1910 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1911 .iterations(3)
1912 .TestQ8();
1913 }
1914}
1915
Marat Dukhanefc47b82019-11-18 09:25:38 -08001916TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001917 ASSERT_EQ(xnn_status_success, xnn_initialize());
1918 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
1919 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
1920 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001921 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001922 .padding_width(1)
1923 .padding_top(padding_top)
1924 .padding_bottom(padding_bottom)
1925 .kernel_size(3, 3)
1926 .stride(2)
1927 .group_input_channels(15)
1928 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1929 .iterations(1)
1930 .TestQ8();
1931 }
1932 }
1933}
1934
Marat Dukhanefc47b82019-11-18 09:25:38 -08001935TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001936 ASSERT_EQ(xnn_status_success, xnn_initialize());
1937 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
1938 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
1939 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001940 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001941 .padding_height(1)
1942 .padding_left(padding_left)
1943 .padding_right(padding_right)
1944 .kernel_size(3, 3)
1945 .stride(2)
1946 .group_input_channels(15)
1947 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1948 .iterations(1)
1949 .TestQ8();
1950 }
1951 }
1952}
1953
Marat Dukhanefc47b82019-11-18 09:25:38 -08001954TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001955 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08001956 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001957 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001958 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001959 .padding(1)
1960 .adjustment_height(adjustment_height)
1961 .kernel_size(3, 3)
1962 .stride(2)
1963 .group_input_channels(15)
1964 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1965 .iterations(1)
1966 .TestQ8();
1967 }
1968}
1969
Marat Dukhanefc47b82019-11-18 09:25:38 -08001970TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001971 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08001972 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001973 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001974 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001975 .padding(1)
1976 .adjustment_width(adjustment_width)
1977 .kernel_size(3, 3)
1978 .stride(2)
1979 .group_input_channels(15)
1980 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1981 .iterations(1)
1982 .TestQ8();
1983 }
1984}
1985
Marat Dukhanefc47b82019-11-18 09:25:38 -08001986TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001987 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08001988 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07001989 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08001990 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07001991 .padding(1)
1992 .kernel_size(3, 3)
1993 .stride(2)
1994 .group_input_channels(15)
1995 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
1996 .iterations(1)
1997 .TestQ8();
1998 }
1999}
2000
Marat Dukhanefc47b82019-11-18 09:25:38 -08002001TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002002 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002003 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002004 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002005 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002006 .padding(1)
2007 .kernel_size(3, 3)
2008 .stride(2)
2009 .group_input_channels(15)
2010 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2011 .iterations(1)
2012 .TestQ8();
2013 }
2014}
2015
Marat Dukhanefc47b82019-11-18 09:25:38 -08002016TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002017 ASSERT_EQ(xnn_status_success, xnn_initialize());
2018 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
2019 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002020 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002021 .padding(1)
2022 .kernel_size(3, 3)
2023 .stride(2)
2024 .group_input_channels(input_channels)
2025 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2026 .iterations(1)
2027 .TestQ8();
2028 }
2029}
2030
Marat Dukhanefc47b82019-11-18 09:25:38 -08002031TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002032 ASSERT_EQ(xnn_status_success, xnn_initialize());
2033 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
2034 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002035 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002036 .padding(1)
2037 .kernel_size(3, 3)
2038 .stride(2)
2039 .group_input_channels(23)
2040 .group_output_channels(output_channels)
2041 .iterations(1)
2042 .TestQ8();
2043 }
2044}
2045
Marat Dukhanefc47b82019-11-18 09:25:38 -08002046TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002047 ASSERT_EQ(xnn_status_success, xnn_initialize());
2048 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002049 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002050 .padding(1)
2051 .kernel_size(3, 3)
2052 .stride(2)
2053 .group_input_channels(23)
2054 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2055 .input_pixel_stride(28)
2056 .iterations(3)
2057 .TestQ8();
2058}
2059
Marat Dukhanefc47b82019-11-18 09:25:38 -08002060TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002061 ASSERT_EQ(xnn_status_success, xnn_initialize());
2062 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002063 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002064 .padding(1)
2065 .kernel_size(3, 3)
2066 .stride(2)
2067 .group_input_channels(23)
2068 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2069 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
2070 .iterations(3)
2071 .TestQ8();
2072}
2073
Marat Dukhanefc47b82019-11-18 09:25:38 -08002074TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002075 ASSERT_EQ(xnn_status_success, xnn_initialize());
2076 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002077 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002078 .padding(1)
2079 .kernel_size(3, 3)
2080 .stride(2)
2081 .group_input_channels(23)
2082 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2083 .qmin(128)
2084 .iterations(3)
2085 .TestQ8();
2086}
2087
Marat Dukhanefc47b82019-11-18 09:25:38 -08002088TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002089 ASSERT_EQ(xnn_status_success, xnn_initialize());
2090 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002091 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002092 .padding(1)
2093 .kernel_size(3, 3)
2094 .stride(2)
2095 .group_input_channels(23)
2096 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07002097 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002098 .iterations(3)
2099 .TestQ8();
2100}
2101
Marat Dukhanefc47b82019-11-18 09:25:38 -08002102TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07002103 ASSERT_EQ(xnn_status_success, xnn_initialize());
2104 DeconvolutionOperatorTester()
2105 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08002106 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07002107 .padding(1)
2108 .kernel_size(3, 3)
2109 .stride(2)
2110 .group_input_channels(23)
2111 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2112 .iterations(3)
2113 .TestQ8();
2114}
2115
XNNPACK Teamb455b122019-09-27 18:10:33 -07002116/**************************** SUBCONV2D path, grouped ****************************/
2117
Marat Dukhanefc47b82019-11-18 09:25:38 -08002118TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002119 ASSERT_EQ(xnn_status_success, xnn_initialize());
2120 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002121 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002122 .padding(1)
2123 .kernel_size(3, 3)
2124 .stride(2)
2125 .groups(2)
2126 .group_input_channels(17)
2127 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2128 .iterations(3)
2129 .TestQ8();
2130}
2131
Marat Dukhanefc47b82019-11-18 09:25:38 -08002132TEST(DECONVOLUTION_NHWC_Q8, grouped_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002133 ASSERT_EQ(xnn_status_success, xnn_initialize());
2134 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2135 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002136 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002137 .padding_width(1)
2138 .kernel_size(kernel_height, 3)
2139 .stride(2)
2140 .groups(2)
2141 .group_input_channels(17)
2142 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2143 .iterations(3)
2144 .TestQ8();
2145 }
2146}
2147
Marat Dukhanefc47b82019-11-18 09:25:38 -08002148TEST(DECONVOLUTION_NHWC_Q8, grouped_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002149 ASSERT_EQ(xnn_status_success, xnn_initialize());
2150 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2151 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002152 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002153 .padding_height(1)
2154 .kernel_size(3, kernel_width)
2155 .stride(2)
2156 .groups(2)
2157 .group_input_channels(17)
2158 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2159 .iterations(3)
2160 .TestQ8();
2161 }
2162}
2163
Marat Dukhanefc47b82019-11-18 09:25:38 -08002164TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002165 ASSERT_EQ(xnn_status_success, xnn_initialize());
2166 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2167 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002168 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002169 .padding(1)
2170 .padding_width(1)
2171 .kernel_size(3, 3)
2172 .stride_height(stride_height)
2173 .groups(2)
2174 .group_input_channels(17)
2175 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2176 .iterations(3)
2177 .TestQ8();
2178 }
2179}
2180
Marat Dukhanefc47b82019-11-18 09:25:38 -08002181TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002182 ASSERT_EQ(xnn_status_success, xnn_initialize());
2183 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2184 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002185 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002186 .padding(1)
2187 .padding_width(1)
2188 .kernel_size(3, 3)
2189 .stride_width(stride_width)
2190 .groups(2)
2191 .group_input_channels(17)
2192 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2193 .iterations(3)
2194 .TestQ8();
2195 }
2196}
2197
Marat Dukhanefc47b82019-11-18 09:25:38 -08002198TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002199 ASSERT_EQ(xnn_status_success, xnn_initialize());
2200 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
2201 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
2202 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002203 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002204 .padding_width(1)
2205 .padding_top(padding_top)
2206 .padding_bottom(padding_bottom)
2207 .kernel_size(3, 3)
2208 .stride(2)
2209 .groups(2)
2210 .group_input_channels(17)
2211 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2212 .iterations(1)
2213 .TestQ8();
2214 }
2215 }
2216}
2217
Marat Dukhanefc47b82019-11-18 09:25:38 -08002218TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002219 ASSERT_EQ(xnn_status_success, xnn_initialize());
2220 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
2221 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
2222 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002223 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002224 .padding_height(1)
2225 .padding_left(padding_left)
2226 .padding_right(padding_right)
2227 .kernel_size(3, 3)
2228 .stride(2)
2229 .groups(2)
2230 .group_input_channels(17)
2231 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2232 .iterations(1)
2233 .TestQ8();
2234 }
2235 }
2236}
2237
Marat Dukhanefc47b82019-11-18 09:25:38 -08002238TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002239 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002240 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002241 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002242 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002243 .padding(1)
2244 .adjustment_height(adjustment_height)
2245 .kernel_size(3, 3)
2246 .stride(2)
2247 .groups(2)
2248 .group_input_channels(17)
2249 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2250 .iterations(1)
2251 .TestQ8();
2252 }
2253}
2254
Marat Dukhanefc47b82019-11-18 09:25:38 -08002255TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002256 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002257 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002258 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002259 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002260 .padding(1)
2261 .adjustment_width(adjustment_width)
2262 .kernel_size(3, 3)
2263 .stride(2)
2264 .groups(2)
2265 .group_input_channels(17)
2266 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2267 .iterations(1)
2268 .TestQ8();
2269 }
2270}
2271
Marat Dukhanefc47b82019-11-18 09:25:38 -08002272TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002273 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002274 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002275 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002276 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002277 .padding(1)
2278 .kernel_size(3, 3)
2279 .stride(2)
2280 .groups(2)
2281 .group_input_channels(17)
2282 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2283 .iterations(1)
2284 .TestQ8();
2285 }
2286}
2287
Marat Dukhanefc47b82019-11-18 09:25:38 -08002288TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002289 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002290 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002291 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002292 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002293 .padding(1)
2294 .kernel_size(3, 3)
2295 .stride(2)
2296 .groups(2)
2297 .group_input_channels(17)
2298 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2299 .iterations(1)
2300 .TestQ8();
2301 }
2302}
2303
Marat Dukhanefc47b82019-11-18 09:25:38 -08002304TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002305 ASSERT_EQ(xnn_status_success, xnn_initialize());
2306 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
2307 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002308 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002309 .padding(1)
2310 .kernel_size(3, 3)
2311 .stride(2)
2312 .groups(2)
2313 .group_input_channels(input_channels)
2314 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2315 .iterations(1)
2316 .TestQ8();
2317 }
2318}
2319
Marat Dukhanefc47b82019-11-18 09:25:38 -08002320TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002321 ASSERT_EQ(xnn_status_success, xnn_initialize());
2322 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
2323 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002324 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002325 .padding(1)
2326 .kernel_size(3, 3)
2327 .stride(2)
2328 .groups(2)
2329 .group_input_channels(17)
2330 .group_output_channels(output_channels)
2331 .iterations(1)
2332 .TestQ8();
2333 }
2334}
2335
Marat Dukhanefc47b82019-11-18 09:25:38 -08002336TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002337 ASSERT_EQ(xnn_status_success, xnn_initialize());
2338 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002339 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002340 .padding(1)
2341 .kernel_size(3, 3)
2342 .stride(2)
2343 .groups(2)
2344 .group_input_channels(17)
2345 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2346 .input_pixel_stride(37)
2347 .iterations(3)
2348 .TestQ8();
2349}
2350
Marat Dukhanefc47b82019-11-18 09:25:38 -08002351TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002352 ASSERT_EQ(xnn_status_success, xnn_initialize());
2353 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002354 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002355 .padding(1)
2356 .kernel_size(3, 3)
2357 .stride(2)
2358 .groups(2)
2359 .group_input_channels(17)
2360 .group_output_channels(xnn_params.q8.gemm.nr + 3)
2361 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
2362 .iterations(3)
2363 .TestQ8();
2364}
2365
Marat Dukhanefc47b82019-11-18 09:25:38 -08002366TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002367 ASSERT_EQ(xnn_status_success, xnn_initialize());
2368 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002369 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002370 .padding(1)
2371 .kernel_size(3, 3)
2372 .stride(2)
2373 .groups(2)
2374 .group_input_channels(17)
2375 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2376 .qmin(128)
2377 .iterations(3)
2378 .TestQ8();
2379}
2380
Marat Dukhanefc47b82019-11-18 09:25:38 -08002381TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002382 ASSERT_EQ(xnn_status_success, xnn_initialize());
2383 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08002384 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002385 .padding(1)
2386 .kernel_size(3, 3)
2387 .stride(2)
2388 .groups(2)
2389 .group_input_channels(17)
2390 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07002391 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002392 .iterations(3)
2393 .TestQ8();
2394}
2395
Marat Dukhanefc47b82019-11-18 09:25:38 -08002396TEST(DECONVOLUTION_NHWC_Q8, grouped_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07002397 ASSERT_EQ(xnn_status_success, xnn_initialize());
2398 DeconvolutionOperatorTester()
2399 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08002400 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07002401 .padding(1)
2402 .kernel_size(3, 3)
2403 .stride(2)
2404 .groups(2)
2405 .group_input_channels(17)
2406 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2407 .iterations(3)
2408 .TestQ8();
2409}
2410
XNNPACK Teamb455b122019-09-27 18:10:33 -07002411/**************************** SUBCONV2D path, batched ****************************/
2412
Marat Dukhanefc47b82019-11-18 09:25:38 -08002413TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002414 ASSERT_EQ(xnn_status_success, xnn_initialize());
2415 DeconvolutionOperatorTester()
2416 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002417 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002418 .padding(1)
2419 .kernel_size(3, 3)
2420 .stride(2)
2421 .group_input_channels(15)
2422 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2423 .iterations(3)
2424 .TestQ8();
2425}
2426
Marat Dukhanefc47b82019-11-18 09:25:38 -08002427TEST(DECONVOLUTION_NHWC_Q8, batched_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002428 ASSERT_EQ(xnn_status_success, xnn_initialize());
2429 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2430 DeconvolutionOperatorTester()
2431 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002432 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002433 .padding_width(1)
2434 .kernel_size(kernel_height, 3)
2435 .stride(2)
2436 .group_input_channels(17)
2437 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2438 .iterations(3)
2439 .TestQ8();
2440 }
2441}
2442
Marat Dukhanefc47b82019-11-18 09:25:38 -08002443TEST(DECONVOLUTION_NHWC_Q8, batched_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002444 ASSERT_EQ(xnn_status_success, xnn_initialize());
2445 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2446 DeconvolutionOperatorTester()
2447 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002448 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002449 .padding_height(1)
2450 .kernel_size(3, kernel_width)
2451 .stride(2)
2452 .group_input_channels(17)
2453 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2454 .iterations(3)
2455 .TestQ8();
2456 }
2457}
2458
Marat Dukhanefc47b82019-11-18 09:25:38 -08002459TEST(DECONVOLUTION_NHWC_Q8, batched_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002460 ASSERT_EQ(xnn_status_success, xnn_initialize());
2461 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2462 DeconvolutionOperatorTester()
2463 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002464 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002465 .padding(1)
2466 .padding_width(1)
2467 .kernel_size(3, 3)
2468 .stride_height(stride_height)
2469 .group_input_channels(17)
2470 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2471 .iterations(3)
2472 .TestQ8();
2473 }
2474}
2475
Marat Dukhanefc47b82019-11-18 09:25:38 -08002476TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002477 ASSERT_EQ(xnn_status_success, xnn_initialize());
2478 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2479 DeconvolutionOperatorTester()
2480 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002481 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002482 .padding(1)
2483 .padding_width(1)
2484 .kernel_size(3, 3)
2485 .stride_width(stride_width)
2486 .group_input_channels(17)
2487 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2488 .iterations(3)
2489 .TestQ8();
2490 }
2491}
2492
Marat Dukhanefc47b82019-11-18 09:25:38 -08002493TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002494 ASSERT_EQ(xnn_status_success, xnn_initialize());
2495 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
2496 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
2497 DeconvolutionOperatorTester()
2498 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002499 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002500 .padding_width(1)
2501 .padding_top(padding_top)
2502 .padding_bottom(padding_bottom)
2503 .kernel_size(3, 3)
2504 .stride(2)
2505 .group_input_channels(15)
2506 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2507 .iterations(1)
2508 .TestQ8();
2509 }
2510 }
2511}
2512
Marat Dukhanefc47b82019-11-18 09:25:38 -08002513TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002514 ASSERT_EQ(xnn_status_success, xnn_initialize());
2515 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
2516 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
2517 DeconvolutionOperatorTester()
2518 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002519 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002520 .padding_height(1)
2521 .padding_left(padding_left)
2522 .padding_right(padding_right)
2523 .kernel_size(3, 3)
2524 .stride(2)
2525 .group_input_channels(15)
2526 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2527 .iterations(1)
2528 .TestQ8();
2529 }
2530 }
2531}
2532
Marat Dukhanefc47b82019-11-18 09:25:38 -08002533TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002534 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002535 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002536 DeconvolutionOperatorTester()
2537 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002538 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002539 .padding(1)
2540 .adjustment_height(adjustment_height)
2541 .kernel_size(3, 3)
2542 .stride(2)
2543 .group_input_channels(15)
2544 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2545 .iterations(1)
2546 .TestQ8();
2547 }
2548}
2549
Marat Dukhanefc47b82019-11-18 09:25:38 -08002550TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002551 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002552 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002553 DeconvolutionOperatorTester()
2554 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002555 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002556 .padding(1)
2557 .adjustment_width(adjustment_width)
2558 .kernel_size(3, 3)
2559 .stride(2)
2560 .group_input_channels(15)
2561 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2562 .iterations(1)
2563 .TestQ8();
2564 }
2565}
2566
Marat Dukhanefc47b82019-11-18 09:25:38 -08002567TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002568 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002569 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002570 DeconvolutionOperatorTester()
2571 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002572 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002573 .padding(1)
2574 .kernel_size(3, 3)
2575 .stride(2)
2576 .group_input_channels(15)
2577 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2578 .iterations(1)
2579 .TestQ8();
2580 }
2581}
2582
Marat Dukhanefc47b82019-11-18 09:25:38 -08002583TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002584 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002585 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002586 DeconvolutionOperatorTester()
2587 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002588 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002589 .padding(1)
2590 .kernel_size(3, 3)
2591 .stride(2)
2592 .group_input_channels(15)
2593 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2594 .iterations(1)
2595 .TestQ8();
2596 }
2597}
2598
Marat Dukhanefc47b82019-11-18 09:25:38 -08002599TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002600 ASSERT_EQ(xnn_status_success, xnn_initialize());
2601 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
2602 DeconvolutionOperatorTester()
2603 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002604 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002605 .padding(1)
2606 .kernel_size(3, 3)
2607 .stride(2)
2608 .group_input_channels(input_channels)
2609 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2610 .iterations(1)
2611 .TestQ8();
2612 }
2613}
2614
Marat Dukhanefc47b82019-11-18 09:25:38 -08002615TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002616 ASSERT_EQ(xnn_status_success, xnn_initialize());
2617 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
2618 DeconvolutionOperatorTester()
2619 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002620 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002621 .padding(1)
2622 .kernel_size(3, 3)
2623 .stride(2)
2624 .group_input_channels(23)
2625 .group_output_channels(output_channels)
2626 .iterations(1)
2627 .TestQ8();
2628 }
2629}
2630
Marat Dukhanefc47b82019-11-18 09:25:38 -08002631TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002632 ASSERT_EQ(xnn_status_success, xnn_initialize());
2633 DeconvolutionOperatorTester()
2634 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002635 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002636 .padding(1)
2637 .kernel_size(3, 3)
2638 .stride(2)
2639 .group_input_channels(23)
2640 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2641 .input_pixel_stride(28)
2642 .iterations(3)
2643 .TestQ8();
2644}
2645
Marat Dukhanefc47b82019-11-18 09:25:38 -08002646TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002647 ASSERT_EQ(xnn_status_success, xnn_initialize());
2648 DeconvolutionOperatorTester()
2649 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002650 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002651 .padding(1)
2652 .kernel_size(3, 3)
2653 .stride(2)
2654 .group_input_channels(23)
2655 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2656 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
2657 .iterations(3)
2658 .TestQ8();
2659}
2660
Marat Dukhanefc47b82019-11-18 09:25:38 -08002661TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002662 ASSERT_EQ(xnn_status_success, xnn_initialize());
2663 DeconvolutionOperatorTester()
2664 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002665 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002666 .padding(1)
2667 .kernel_size(3, 3)
2668 .stride(2)
2669 .group_input_channels(23)
2670 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2671 .qmin(128)
2672 .iterations(3)
2673 .TestQ8();
2674}
2675
Marat Dukhanefc47b82019-11-18 09:25:38 -08002676TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002677 ASSERT_EQ(xnn_status_success, xnn_initialize());
2678 DeconvolutionOperatorTester()
2679 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002680 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002681 .padding(1)
2682 .kernel_size(3, 3)
2683 .stride(2)
2684 .group_input_channels(23)
2685 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07002686 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002687 .iterations(3)
2688 .TestQ8();
2689}
2690
Marat Dukhanefc47b82019-11-18 09:25:38 -08002691TEST(DECONVOLUTION_NHWC_Q8, batched_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07002692 ASSERT_EQ(xnn_status_success, xnn_initialize());
2693 DeconvolutionOperatorTester()
2694 .has_bias(false)
2695 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002696 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07002697 .padding(1)
2698 .kernel_size(3, 3)
2699 .stride(2)
2700 .group_input_channels(23)
2701 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2702 .iterations(3)
2703 .TestQ8();
2704}
2705
XNNPACK Teamb455b122019-09-27 18:10:33 -07002706/**************************** SUBCONV2D path, grouped, batched ****************************/
2707
Marat Dukhanefc47b82019-11-18 09:25:38 -08002708TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002709 ASSERT_EQ(xnn_status_success, xnn_initialize());
2710 DeconvolutionOperatorTester()
2711 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002712 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002713 .padding(1)
2714 .kernel_size(3, 3)
2715 .stride(2)
2716 .groups(2)
2717 .group_input_channels(17)
2718 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2719 .iterations(3)
2720 .TestQ8();
2721}
2722
Marat Dukhanefc47b82019-11-18 09:25:38 -08002723TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002724 ASSERT_EQ(xnn_status_success, xnn_initialize());
2725 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2726 DeconvolutionOperatorTester()
2727 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002728 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002729 .padding_width(1)
2730 .kernel_size(kernel_height, 3)
2731 .stride(2)
2732 .groups(2)
2733 .group_input_channels(17)
2734 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2735 .iterations(3)
2736 .TestQ8();
2737 }
2738}
2739
Marat Dukhanefc47b82019-11-18 09:25:38 -08002740TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002741 ASSERT_EQ(xnn_status_success, xnn_initialize());
2742 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2743 DeconvolutionOperatorTester()
2744 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002745 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002746 .padding_height(1)
2747 .kernel_size(3, kernel_width)
2748 .stride(2)
2749 .groups(2)
2750 .group_input_channels(17)
2751 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2752 .iterations(3)
2753 .TestQ8();
2754 }
2755}
2756
Marat Dukhanefc47b82019-11-18 09:25:38 -08002757TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002758 ASSERT_EQ(xnn_status_success, xnn_initialize());
2759 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2760 DeconvolutionOperatorTester()
2761 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002762 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002763 .padding(1)
2764 .padding_width(1)
2765 .kernel_size(3, 3)
2766 .stride_height(stride_height)
2767 .groups(2)
2768 .group_input_channels(17)
2769 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2770 .iterations(3)
2771 .TestQ8();
2772 }
2773}
2774
Marat Dukhanefc47b82019-11-18 09:25:38 -08002775TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002776 ASSERT_EQ(xnn_status_success, xnn_initialize());
2777 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2778 DeconvolutionOperatorTester()
2779 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002780 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002781 .padding(1)
2782 .padding_width(1)
2783 .kernel_size(3, 3)
2784 .stride_width(stride_width)
2785 .groups(2)
2786 .group_input_channels(17)
2787 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2788 .iterations(3)
2789 .TestQ8();
2790 }
2791}
2792
Marat Dukhanefc47b82019-11-18 09:25:38 -08002793TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002794 ASSERT_EQ(xnn_status_success, xnn_initialize());
2795 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
2796 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
2797 DeconvolutionOperatorTester()
2798 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002799 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002800 .padding_width(1)
2801 .padding_top(padding_top)
2802 .padding_bottom(padding_bottom)
2803 .kernel_size(3, 3)
2804 .stride(2)
2805 .groups(2)
2806 .group_input_channels(17)
2807 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2808 .iterations(1)
2809 .TestQ8();
2810 }
2811 }
2812}
2813
Marat Dukhanefc47b82019-11-18 09:25:38 -08002814TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002815 ASSERT_EQ(xnn_status_success, xnn_initialize());
2816 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
2817 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
2818 DeconvolutionOperatorTester()
2819 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002820 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002821 .padding_height(1)
2822 .padding_left(padding_left)
2823 .padding_right(padding_right)
2824 .kernel_size(3, 3)
2825 .stride(2)
2826 .groups(2)
2827 .group_input_channels(17)
2828 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2829 .iterations(1)
2830 .TestQ8();
2831 }
2832 }
2833}
2834
Marat Dukhanefc47b82019-11-18 09:25:38 -08002835TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002836 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002837 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002838 DeconvolutionOperatorTester()
2839 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002840 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002841 .padding(1)
2842 .adjustment_height(adjustment_height)
2843 .kernel_size(3, 3)
2844 .stride(2)
2845 .groups(2)
2846 .group_input_channels(17)
2847 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2848 .iterations(1)
2849 .TestQ8();
2850 }
2851}
2852
Marat Dukhanefc47b82019-11-18 09:25:38 -08002853TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002854 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08002855 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002856 DeconvolutionOperatorTester()
2857 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002858 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002859 .padding(1)
2860 .adjustment_width(adjustment_width)
2861 .kernel_size(3, 3)
2862 .stride(2)
2863 .groups(2)
2864 .group_input_channels(17)
2865 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2866 .iterations(1)
2867 .TestQ8();
2868 }
2869}
2870
Marat Dukhanefc47b82019-11-18 09:25:38 -08002871TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002872 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002873 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002874 DeconvolutionOperatorTester()
2875 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002876 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002877 .padding(1)
2878 .kernel_size(3, 3)
2879 .stride(2)
2880 .groups(2)
2881 .group_input_channels(17)
2882 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2883 .iterations(1)
2884 .TestQ8();
2885 }
2886}
2887
Marat Dukhanefc47b82019-11-18 09:25:38 -08002888TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002889 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08002890 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002891 DeconvolutionOperatorTester()
2892 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002893 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002894 .padding(1)
2895 .kernel_size(3, 3)
2896 .stride(2)
2897 .groups(2)
2898 .group_input_channels(17)
2899 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2900 .iterations(1)
2901 .TestQ8();
2902 }
2903}
2904
Marat Dukhanefc47b82019-11-18 09:25:38 -08002905TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002906 ASSERT_EQ(xnn_status_success, xnn_initialize());
2907 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
2908 DeconvolutionOperatorTester()
2909 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002910 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002911 .padding(1)
2912 .kernel_size(3, 3)
2913 .stride(2)
2914 .groups(2)
2915 .group_input_channels(input_channels)
2916 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2917 .iterations(1)
2918 .TestQ8();
2919 }
2920}
2921
Marat Dukhanefc47b82019-11-18 09:25:38 -08002922TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002923 ASSERT_EQ(xnn_status_success, xnn_initialize());
2924 for (size_t output_channels = 1; output_channels <= xnn_params.q8.gemm.nr * 2; output_channels *= 2) {
2925 DeconvolutionOperatorTester()
2926 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002927 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002928 .padding(1)
2929 .kernel_size(3, 3)
2930 .stride(2)
2931 .groups(2)
2932 .group_input_channels(17)
2933 .group_output_channels(output_channels)
2934 .iterations(1)
2935 .TestQ8();
2936 }
2937}
2938
Marat Dukhanefc47b82019-11-18 09:25:38 -08002939TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002940 ASSERT_EQ(xnn_status_success, xnn_initialize());
2941 DeconvolutionOperatorTester()
2942 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002943 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002944 .padding(1)
2945 .kernel_size(3, 3)
2946 .stride(2)
2947 .groups(2)
2948 .group_input_channels(17)
2949 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2950 .input_pixel_stride(37)
2951 .iterations(3)
2952 .TestQ8();
2953}
2954
Marat Dukhanefc47b82019-11-18 09:25:38 -08002955TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002956 ASSERT_EQ(xnn_status_success, xnn_initialize());
2957 DeconvolutionOperatorTester()
2958 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002959 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002960 .padding(1)
2961 .kernel_size(3, 3)
2962 .stride(2)
2963 .groups(2)
2964 .group_input_channels(17)
2965 .group_output_channels(xnn_params.q8.gemm.nr + 3)
2966 .output_pixel_stride(xnn_params.q8.gemm.nr * 2 + 13)
2967 .iterations(3)
2968 .TestQ8();
2969}
2970
Marat Dukhanefc47b82019-11-18 09:25:38 -08002971TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002972 ASSERT_EQ(xnn_status_success, xnn_initialize());
2973 DeconvolutionOperatorTester()
2974 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002975 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002976 .padding(1)
2977 .kernel_size(3, 3)
2978 .stride(2)
2979 .groups(2)
2980 .group_input_channels(17)
2981 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
2982 .qmin(128)
2983 .iterations(3)
2984 .TestQ8();
2985}
2986
Marat Dukhanefc47b82019-11-18 09:25:38 -08002987TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07002988 ASSERT_EQ(xnn_status_success, xnn_initialize());
2989 DeconvolutionOperatorTester()
2990 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08002991 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002992 .padding(1)
2993 .kernel_size(3, 3)
2994 .stride(2)
2995 .groups(2)
2996 .group_input_channels(17)
2997 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07002998 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07002999 .iterations(3)
3000 .TestQ8();
3001}
3002
Marat Dukhanefc47b82019-11-18 09:25:38 -08003003TEST(DECONVOLUTION_NHWC_Q8, batched_grouped_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003004 ASSERT_EQ(xnn_status_success, xnn_initialize());
3005 DeconvolutionOperatorTester()
3006 .has_bias(false)
3007 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003008 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003009 .padding(1)
3010 .kernel_size(3, 3)
3011 .stride(2)
3012 .groups(2)
3013 .group_input_channels(17)
3014 .group_output_channels(xnn_params.q8.gemm.nr * 2 + 3)
3015 .iterations(3)
3016 .TestQ8();
3017}
3018
XNNPACK Teamb455b122019-09-27 18:10:33 -07003019/**************************** SUBCONV2D path, setup ****************************/
3020
Marat Dukhanefc47b82019-11-18 09:25:38 -08003021TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_setup_changing_batch) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003022 ASSERT_EQ(xnn_status_success, xnn_initialize());
3023 DeconvolutionOperatorTester()
3024 .batch_size(2)
3025 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08003026 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003027 .kernel_height(3)
3028 .kernel_width(5)
3029 .stride(2)
3030 .groups(2)
3031 .group_input_channels(15)
3032 .group_output_channels(17)
3033 .TestSetupQ8();
3034}
3035
Marat Dukhanefc47b82019-11-18 09:25:38 -08003036TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_setup_changing_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003037 ASSERT_EQ(xnn_status_success, xnn_initialize());
3038 DeconvolutionOperatorTester()
3039 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003040 .input_size(kStridedInputHeight, kStridedInputWidth)
3041 .next_input_height(kStridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003042 .kernel_height(3)
3043 .kernel_width(5)
3044 .stride(2)
3045 .groups(2)
3046 .group_input_channels(15)
3047 .group_output_channels(17)
3048 .TestSetupQ8();
3049}
3050
Marat Dukhanefc47b82019-11-18 09:25:38 -08003051TEST(DECONVOLUTION_NHWC_Q8, 3x3s2_setup_changing_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003052 ASSERT_EQ(xnn_status_success, xnn_initialize());
3053 DeconvolutionOperatorTester()
3054 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003055 .input_size(kStridedInputHeight, kStridedInputWidth)
3056 .next_input_width(kStridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003057 .kernel_height(3)
3058 .kernel_width(5)
3059 .stride(2)
3060 .groups(2)
3061 .group_input_channels(15)
3062 .group_output_channels(17)
3063 .TestSetupQ8();
3064}
3065
3066/**************************** Future GEMM path ****************************/
3067
Marat Dukhanefc47b82019-11-18 09:25:38 -08003068TEST(DECONVOLUTION_NHWC_F32, 1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003069 ASSERT_EQ(xnn_status_success, xnn_initialize());
3070 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003071 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003072 .kernel_size(1, 1)
3073 .group_input_channels(23)
3074 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3075 .iterations(3)
3076 .TestF32();
3077}
3078
Marat Dukhanefc47b82019-11-18 09:25:38 -08003079TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003080 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003081 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003082 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003083 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003084 .kernel_size(1, 1)
3085 .group_input_channels(23)
3086 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3087 .iterations(1)
3088 .TestF32();
3089 }
3090}
3091
Marat Dukhanefc47b82019-11-18 09:25:38 -08003092TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003093 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003094 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003095 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003096 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003097 .kernel_size(1, 1)
3098 .group_input_channels(23)
3099 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3100 .iterations(1)
3101 .TestF32();
3102 }
3103}
3104
Marat Dukhanefc47b82019-11-18 09:25:38 -08003105TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003106 ASSERT_EQ(xnn_status_success, xnn_initialize());
3107 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3108 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003109 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003110 .kernel_size(1, 1)
3111 .group_input_channels(input_channels)
3112 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3113 .iterations(1)
3114 .TestF32();
3115 }
3116}
3117
Marat Dukhanefc47b82019-11-18 09:25:38 -08003118TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003119 ASSERT_EQ(xnn_status_success, xnn_initialize());
3120 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
3121 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003122 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003123 .kernel_size(1, 1)
3124 .group_input_channels(23)
3125 .group_output_channels(output_channels)
3126 .iterations(1)
3127 .TestF32();
3128 }
3129}
3130
Marat Dukhanefc47b82019-11-18 09:25:38 -08003131TEST(DECONVOLUTION_NHWC_F32, 1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003132 ASSERT_EQ(xnn_status_success, xnn_initialize());
3133 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003134 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003135 .kernel_size(1, 1)
3136 .group_input_channels(23)
3137 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3138 .input_pixel_stride(28)
3139 .iterations(3)
3140 .TestF32();
3141}
3142
Marat Dukhanefc47b82019-11-18 09:25:38 -08003143TEST(DECONVOLUTION_NHWC_F32, 1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003144 ASSERT_EQ(xnn_status_success, xnn_initialize());
3145 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003146 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003147 .kernel_size(1, 1)
3148 .group_input_channels(23)
3149 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3150 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
3151 .iterations(3)
3152 .TestF32();
3153}
3154
Marat Dukhanefc47b82019-11-18 09:25:38 -08003155TEST(DECONVOLUTION_NHWC_F32, 1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003156 ASSERT_EQ(xnn_status_success, xnn_initialize());
3157 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003158 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003159 .kernel_size(1, 1)
3160 .group_input_channels(23)
3161 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3162 .qmin(128)
3163 .iterations(3)
3164 .TestF32();
3165}
3166
Marat Dukhanefc47b82019-11-18 09:25:38 -08003167TEST(DECONVOLUTION_NHWC_F32, 1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003168 ASSERT_EQ(xnn_status_success, xnn_initialize());
3169 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003170 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003171 .kernel_size(1, 1)
3172 .group_input_channels(23)
3173 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07003174 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003175 .iterations(3)
3176 .TestF32();
3177}
3178
Marat Dukhanefc47b82019-11-18 09:25:38 -08003179TEST(DECONVOLUTION_NHWC_F32, 1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003180 ASSERT_EQ(xnn_status_success, xnn_initialize());
3181 DeconvolutionOperatorTester()
3182 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08003183 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003184 .kernel_size(1, 1)
3185 .group_input_channels(23)
3186 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3187 .iterations(3)
3188 .TestF32();
3189}
3190
XNNPACK Teamb455b122019-09-27 18:10:33 -07003191/**************************** Future GEMM path, grouped ****************************/
3192
Marat Dukhanefc47b82019-11-18 09:25:38 -08003193TEST(DECONVOLUTION_NHWC_F32, grouped_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003194 ASSERT_EQ(xnn_status_success, xnn_initialize());
3195 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003196 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003197 .kernel_size(1, 1)
3198 .groups(2)
3199 .group_input_channels(23)
3200 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3201 .iterations(3)
3202 .TestF32();
3203}
3204
Marat Dukhanefc47b82019-11-18 09:25:38 -08003205TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003206 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003207 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003208 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003209 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003210 .kernel_size(1, 1)
3211 .groups(2)
3212 .group_input_channels(23)
3213 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3214 .iterations(1)
3215 .TestF32();
3216 }
3217}
3218
Marat Dukhanefc47b82019-11-18 09:25:38 -08003219TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003220 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003221 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003222 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003223 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003224 .kernel_size(1, 1)
3225 .groups(2)
3226 .group_input_channels(23)
3227 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3228 .iterations(1)
3229 .TestF32();
3230 }
3231}
3232
Marat Dukhanefc47b82019-11-18 09:25:38 -08003233TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003234 ASSERT_EQ(xnn_status_success, xnn_initialize());
3235 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3236 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003237 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003238 .kernel_size(1, 1)
3239 .groups(2)
3240 .group_input_channels(input_channels)
3241 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3242 .iterations(1)
3243 .TestF32();
3244 }
3245}
3246
Marat Dukhanefc47b82019-11-18 09:25:38 -08003247TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003248 ASSERT_EQ(xnn_status_success, xnn_initialize());
3249 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
3250 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003251 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003252 .kernel_size(1, 1)
3253 .groups(2)
3254 .group_input_channels(23)
3255 .group_output_channels(output_channels)
3256 .iterations(1)
3257 .TestF32();
3258 }
3259}
3260
Marat Dukhanefc47b82019-11-18 09:25:38 -08003261TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003262 ASSERT_EQ(xnn_status_success, xnn_initialize());
3263 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003264 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003265 .kernel_size(1, 1)
3266 .groups(2)
3267 .group_input_channels(23)
3268 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3269 .input_pixel_stride(47)
3270 .iterations(3)
3271 .TestF32();
3272}
3273
Marat Dukhanefc47b82019-11-18 09:25:38 -08003274TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003275 ASSERT_EQ(xnn_status_success, xnn_initialize());
3276 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003277 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003278 .kernel_size(1, 1)
3279 .groups(2)
3280 .group_input_channels(23)
3281 .group_output_channels(xnn_params.f32.gemm.nr + 3)
3282 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
3283 .iterations(3)
3284 .TestF32();
3285}
3286
Marat Dukhanefc47b82019-11-18 09:25:38 -08003287TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003288 ASSERT_EQ(xnn_status_success, xnn_initialize());
3289 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003290 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003291 .kernel_size(1, 1)
3292 .groups(2)
3293 .group_input_channels(23)
3294 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3295 .qmin(128)
3296 .iterations(3)
3297 .TestF32();
3298}
3299
Marat Dukhanefc47b82019-11-18 09:25:38 -08003300TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003301 ASSERT_EQ(xnn_status_success, xnn_initialize());
3302 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003303 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003304 .kernel_size(1, 1)
3305 .groups(2)
3306 .group_input_channels(23)
3307 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07003308 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003309 .iterations(3)
3310 .TestF32();
3311}
3312
Marat Dukhanefc47b82019-11-18 09:25:38 -08003313TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003314 ASSERT_EQ(xnn_status_success, xnn_initialize());
3315 DeconvolutionOperatorTester()
3316 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08003317 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003318 .kernel_size(1, 1)
3319 .groups(2)
3320 .group_input_channels(23)
3321 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3322 .iterations(3)
3323 .TestF32();
3324}
3325
XNNPACK Teamb455b122019-09-27 18:10:33 -07003326/**************************** Future GEMM path, batched ****************************/
3327
Marat Dukhanefc47b82019-11-18 09:25:38 -08003328TEST(DECONVOLUTION_NHWC_F32, batched_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003329 ASSERT_EQ(xnn_status_success, xnn_initialize());
3330 DeconvolutionOperatorTester()
3331 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003332 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003333 .kernel_size(1, 1)
3334 .group_input_channels(23)
3335 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3336 .iterations(3)
3337 .TestF32();
3338}
3339
Marat Dukhanefc47b82019-11-18 09:25:38 -08003340TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003341 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003342 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003343 DeconvolutionOperatorTester()
3344 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003345 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003346 .kernel_size(1, 1)
3347 .group_input_channels(23)
3348 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3349 .iterations(1)
3350 .TestF32();
3351 }
3352}
3353
Marat Dukhanefc47b82019-11-18 09:25:38 -08003354TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003355 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003356 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003357 DeconvolutionOperatorTester()
3358 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003359 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003360 .kernel_size(1, 1)
3361 .group_input_channels(23)
3362 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3363 .iterations(1)
3364 .TestF32();
3365 }
3366}
3367
Marat Dukhanefc47b82019-11-18 09:25:38 -08003368TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003369 ASSERT_EQ(xnn_status_success, xnn_initialize());
3370 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3371 DeconvolutionOperatorTester()
3372 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003373 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003374 .kernel_size(1, 1)
3375 .group_input_channels(input_channels)
3376 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3377 .iterations(1)
3378 .TestF32();
3379 }
3380}
3381
Marat Dukhanefc47b82019-11-18 09:25:38 -08003382TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003383 ASSERT_EQ(xnn_status_success, xnn_initialize());
3384 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
3385 DeconvolutionOperatorTester()
3386 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003387 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003388 .kernel_size(1, 1)
3389 .group_input_channels(23)
3390 .group_output_channels(output_channels)
3391 .iterations(1)
3392 .TestF32();
3393 }
3394}
3395
Marat Dukhanefc47b82019-11-18 09:25:38 -08003396TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003397 ASSERT_EQ(xnn_status_success, xnn_initialize());
3398 DeconvolutionOperatorTester()
3399 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003400 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003401 .kernel_size(1, 1)
3402 .group_input_channels(23)
3403 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3404 .input_pixel_stride(28)
3405 .iterations(3)
3406 .TestF32();
3407}
3408
Marat Dukhanefc47b82019-11-18 09:25:38 -08003409TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003410 ASSERT_EQ(xnn_status_success, xnn_initialize());
3411 DeconvolutionOperatorTester()
3412 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003413 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003414 .kernel_size(1, 1)
3415 .group_input_channels(23)
3416 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3417 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
3418 .iterations(3)
3419 .TestF32();
3420}
3421
Marat Dukhanefc47b82019-11-18 09:25:38 -08003422TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003423 ASSERT_EQ(xnn_status_success, xnn_initialize());
3424 DeconvolutionOperatorTester()
3425 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003426 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003427 .kernel_size(1, 1)
3428 .group_input_channels(23)
3429 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3430 .qmin(128)
3431 .iterations(3)
3432 .TestF32();
3433}
3434
Marat Dukhanefc47b82019-11-18 09:25:38 -08003435TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003436 ASSERT_EQ(xnn_status_success, xnn_initialize());
3437 DeconvolutionOperatorTester()
3438 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003439 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003440 .kernel_size(1, 1)
3441 .group_input_channels(23)
3442 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07003443 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003444 .iterations(3)
3445 .TestF32();
3446}
3447
Marat Dukhanefc47b82019-11-18 09:25:38 -08003448TEST(DECONVOLUTION_NHWC_F32, batched_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003449 ASSERT_EQ(xnn_status_success, xnn_initialize());
3450 DeconvolutionOperatorTester()
3451 .has_bias(false)
3452 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003453 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003454 .kernel_size(1, 1)
3455 .group_input_channels(23)
3456 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3457 .iterations(3)
3458 .TestF32();
3459}
3460
XNNPACK Teamb455b122019-09-27 18:10:33 -07003461/**************************** Future GEMM path, batched, grouped ****************************/
3462
Marat Dukhanefc47b82019-11-18 09:25:38 -08003463TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003464 ASSERT_EQ(xnn_status_success, xnn_initialize());
3465 DeconvolutionOperatorTester()
3466 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003467 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003468 .kernel_size(1, 1)
3469 .groups(2)
3470 .group_input_channels(23)
3471 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3472 .iterations(3)
3473 .TestF32();
3474}
3475
Marat Dukhanefc47b82019-11-18 09:25:38 -08003476TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003477 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003478 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003479 DeconvolutionOperatorTester()
3480 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003481 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003482 .kernel_size(1, 1)
3483 .groups(2)
3484 .group_input_channels(23)
3485 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3486 .iterations(1)
3487 .TestF32();
3488 }
3489}
3490
Marat Dukhanefc47b82019-11-18 09:25:38 -08003491TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003492 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003493 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003494 DeconvolutionOperatorTester()
3495 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003496 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003497 .kernel_size(1, 1)
3498 .groups(2)
3499 .group_input_channels(23)
3500 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3501 .iterations(1)
3502 .TestF32();
3503 }
3504}
3505
Marat Dukhanefc47b82019-11-18 09:25:38 -08003506TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003507 ASSERT_EQ(xnn_status_success, xnn_initialize());
3508 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3509 DeconvolutionOperatorTester()
3510 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003511 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003512 .kernel_size(1, 1)
3513 .groups(2)
3514 .group_input_channels(input_channels)
3515 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3516 .iterations(1)
3517 .TestF32();
3518 }
3519}
3520
Marat Dukhanefc47b82019-11-18 09:25:38 -08003521TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003522 ASSERT_EQ(xnn_status_success, xnn_initialize());
3523 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
3524 DeconvolutionOperatorTester()
3525 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003526 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003527 .kernel_size(1, 1)
3528 .groups(2)
3529 .group_input_channels(23)
3530 .group_output_channels(output_channels)
3531 .iterations(1)
3532 .TestF32();
3533 }
3534}
3535
Marat Dukhanefc47b82019-11-18 09:25:38 -08003536TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003537 ASSERT_EQ(xnn_status_success, xnn_initialize());
3538 DeconvolutionOperatorTester()
3539 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003540 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003541 .kernel_size(1, 1)
3542 .groups(2)
3543 .group_input_channels(23)
3544 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3545 .input_pixel_stride(47)
3546 .iterations(3)
3547 .TestF32();
3548}
3549
Marat Dukhanefc47b82019-11-18 09:25:38 -08003550TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003551 ASSERT_EQ(xnn_status_success, xnn_initialize());
3552 DeconvolutionOperatorTester()
3553 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003554 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003555 .kernel_size(1, 1)
3556 .groups(2)
3557 .group_input_channels(23)
3558 .group_output_channels(xnn_params.f32.gemm.nr + 3)
3559 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
3560 .iterations(3)
3561 .TestF32();
3562}
3563
Marat Dukhanefc47b82019-11-18 09:25:38 -08003564TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003565 ASSERT_EQ(xnn_status_success, xnn_initialize());
3566 DeconvolutionOperatorTester()
3567 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003568 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003569 .kernel_size(1, 1)
3570 .groups(2)
3571 .group_input_channels(23)
3572 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3573 .qmin(128)
3574 .iterations(3)
3575 .TestF32();
3576}
3577
Marat Dukhanefc47b82019-11-18 09:25:38 -08003578TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003579 ASSERT_EQ(xnn_status_success, xnn_initialize());
3580 DeconvolutionOperatorTester()
3581 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003582 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003583 .kernel_size(1, 1)
3584 .groups(2)
3585 .group_input_channels(23)
3586 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07003587 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003588 .iterations(3)
3589 .TestF32();
3590}
3591
Marat Dukhanefc47b82019-11-18 09:25:38 -08003592TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003593 ASSERT_EQ(xnn_status_success, xnn_initialize());
3594 DeconvolutionOperatorTester()
3595 .has_bias(false)
3596 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08003597 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003598 .kernel_size(1, 1)
3599 .groups(2)
3600 .group_input_channels(23)
3601 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3602 .iterations(3)
3603 .TestF32();
3604}
3605
XNNPACK Teamb455b122019-09-27 18:10:33 -07003606/**************************** CONV path ****************************/
3607
Marat Dukhanefc47b82019-11-18 09:25:38 -08003608TEST(DECONVOLUTION_NHWC_F32, 3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003609 ASSERT_EQ(xnn_status_success, xnn_initialize());
3610 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003611 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003612 .padding(1)
3613 .kernel_size(3, 3)
3614 .group_input_channels(15)
3615 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3616 .iterations(3)
3617 .TestF32();
3618}
3619
Marat Dukhanefc47b82019-11-18 09:25:38 -08003620TEST(DECONVOLUTION_NHWC_F32, Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003621 ASSERT_EQ(xnn_status_success, xnn_initialize());
3622 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
3623 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003624 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003625 .padding_width(1)
3626 .kernel_size(kernel_height, 3)
3627 .group_input_channels(17)
3628 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3629 .iterations(3)
3630 .TestF32();
3631 }
3632}
3633
Marat Dukhanefc47b82019-11-18 09:25:38 -08003634TEST(DECONVOLUTION_NHWC_F32, 3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003635 ASSERT_EQ(xnn_status_success, xnn_initialize());
3636 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
3637 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003638 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003639 .padding_height(1)
3640 .kernel_size(3, kernel_width)
3641 .group_input_channels(17)
3642 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3643 .iterations(3)
3644 .TestF32();
3645 }
3646}
3647
Marat Dukhanefc47b82019-11-18 09:25:38 -08003648TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003649 ASSERT_EQ(xnn_status_success, xnn_initialize());
3650 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
3651 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
3652 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003653 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003654 .padding_width(1)
3655 .padding_top(padding_top)
3656 .padding_bottom(padding_bottom)
3657 .kernel_size(3, 3)
3658 .group_input_channels(15)
3659 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3660 .iterations(1)
3661 .TestF32();
3662 }
3663 }
3664}
3665
Marat Dukhanefc47b82019-11-18 09:25:38 -08003666TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003667 ASSERT_EQ(xnn_status_success, xnn_initialize());
3668 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
3669 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
3670 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003671 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003672 .padding_height(1)
3673 .padding_left(padding_left)
3674 .padding_right(padding_right)
3675 .kernel_size(3, 3)
3676 .group_input_channels(15)
3677 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3678 .iterations(1)
3679 .TestF32();
3680 }
3681 }
3682}
3683
Marat Dukhanefc47b82019-11-18 09:25:38 -08003684TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003685 ASSERT_EQ(xnn_status_success, xnn_initialize());
3686 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
3687 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003688 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003689 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08003690 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003691 .adjustment_height(adjustment_height)
3692 .kernel_size(3, 3)
3693 .group_input_channels(15)
3694 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3695 .iterations(1)
3696 .TestF32();
3697 }
3698}
3699
Marat Dukhanefc47b82019-11-18 09:25:38 -08003700TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003701 ASSERT_EQ(xnn_status_success, xnn_initialize());
3702 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
3703 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003704 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003705 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08003706 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003707 .adjustment_width(adjustment_width)
3708 .kernel_size(3, 3)
3709 .group_input_channels(15)
3710 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3711 .iterations(1)
3712 .TestF32();
3713 }
3714}
3715
Marat Dukhanefc47b82019-11-18 09:25:38 -08003716TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003717 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003718 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003719 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003720 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003721 .padding(1)
3722 .kernel_size(3, 3)
3723 .group_input_channels(15)
3724 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3725 .iterations(1)
3726 .TestF32();
3727 }
3728}
3729
Marat Dukhanefc47b82019-11-18 09:25:38 -08003730TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003731 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08003732 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003733 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003734 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003735 .padding(1)
3736 .kernel_size(3, 3)
3737 .group_input_channels(15)
3738 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3739 .iterations(1)
3740 .TestF32();
3741 }
3742}
3743
Marat Dukhanefc47b82019-11-18 09:25:38 -08003744TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003745 ASSERT_EQ(xnn_status_success, xnn_initialize());
3746 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3747 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003748 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003749 .padding(1)
3750 .kernel_size(3, 3)
3751 .group_input_channels(input_channels)
3752 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3753 .iterations(1)
3754 .TestF32();
3755 }
3756}
3757
Marat Dukhanefc47b82019-11-18 09:25:38 -08003758TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003759 ASSERT_EQ(xnn_status_success, xnn_initialize());
3760 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
3761 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003762 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003763 .padding(1)
3764 .kernel_size(3, 3)
3765 .group_input_channels(23)
3766 .group_output_channels(output_channels)
3767 .iterations(1)
3768 .TestF32();
3769 }
3770}
3771
Marat Dukhanefc47b82019-11-18 09:25:38 -08003772TEST(DECONVOLUTION_NHWC_F32, 3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003773 ASSERT_EQ(xnn_status_success, xnn_initialize());
3774 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
3775 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003776 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003777 .padding(1)
3778 .kernel_size(3, 3)
3779 .dilation_height(dilation_height)
3780 .group_input_channels(23)
3781 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3782 .iterations(3)
3783 .TestF32();
3784 }
3785}
3786
Marat Dukhanefc47b82019-11-18 09:25:38 -08003787TEST(DECONVOLUTION_NHWC_F32, 3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003788 ASSERT_EQ(xnn_status_success, xnn_initialize());
3789 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
3790 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003791 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003792 .padding(1)
3793 .kernel_size(3, 3)
3794 .dilation_width(dilation_width)
3795 .group_input_channels(23)
3796 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3797 .iterations(3)
3798 .TestF32();
3799 }
3800}
3801
Marat Dukhanefc47b82019-11-18 09:25:38 -08003802TEST(DECONVOLUTION_NHWC_F32, 3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003803 ASSERT_EQ(xnn_status_success, xnn_initialize());
3804 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003805 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003806 .padding(1)
3807 .kernel_size(3, 3)
3808 .dilation_height(3)
3809 .stride_height(2)
3810 .group_input_channels(23)
3811 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3812 .iterations(3)
3813 .TestF32();
3814}
3815
Marat Dukhanefc47b82019-11-18 09:25:38 -08003816TEST(DECONVOLUTION_NHWC_F32, 3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003817 ASSERT_EQ(xnn_status_success, xnn_initialize());
3818 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003819 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003820 .padding(1)
3821 .kernel_size(3, 3)
3822 .dilation_width(3)
3823 .stride_width(2)
3824 .group_input_channels(23)
3825 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3826 .iterations(3)
3827 .TestF32();
3828}
3829
Marat Dukhanefc47b82019-11-18 09:25:38 -08003830TEST(DECONVOLUTION_NHWC_F32, 3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003831 ASSERT_EQ(xnn_status_success, xnn_initialize());
3832 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003833 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003834 .padding(1)
3835 .kernel_size(3, 3)
3836 .group_input_channels(23)
3837 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3838 .input_pixel_stride(28)
3839 .iterations(3)
3840 .TestF32();
3841}
3842
Marat Dukhanefc47b82019-11-18 09:25:38 -08003843TEST(DECONVOLUTION_NHWC_F32, 3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003844 ASSERT_EQ(xnn_status_success, xnn_initialize());
3845 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003846 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003847 .padding(1)
3848 .kernel_size(3, 3)
3849 .group_input_channels(23)
3850 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3851 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
3852 .iterations(3)
3853 .TestF32();
3854}
3855
Marat Dukhanefc47b82019-11-18 09:25:38 -08003856TEST(DECONVOLUTION_NHWC_F32, 3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003857 ASSERT_EQ(xnn_status_success, xnn_initialize());
3858 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003859 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003860 .padding(1)
3861 .kernel_size(3, 3)
3862 .group_input_channels(23)
3863 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3864 .qmin(128)
3865 .iterations(3)
3866 .TestF32();
3867}
3868
Marat Dukhanefc47b82019-11-18 09:25:38 -08003869TEST(DECONVOLUTION_NHWC_F32, 3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003870 ASSERT_EQ(xnn_status_success, xnn_initialize());
3871 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003872 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003873 .padding(1)
3874 .kernel_size(3, 3)
3875 .group_input_channels(23)
3876 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07003877 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003878 .iterations(3)
3879 .TestF32();
3880}
3881
Marat Dukhanefc47b82019-11-18 09:25:38 -08003882TEST(DECONVOLUTION_NHWC_F32, 3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07003883 ASSERT_EQ(xnn_status_success, xnn_initialize());
3884 DeconvolutionOperatorTester()
3885 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08003886 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07003887 .padding(1)
3888 .kernel_size(3, 3)
3889 .group_input_channels(23)
3890 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3891 .iterations(3)
3892 .TestF32();
3893}
3894
XNNPACK Teamb455b122019-09-27 18:10:33 -07003895/**************************** CONV path, grouped ****************************/
3896
Marat Dukhanefc47b82019-11-18 09:25:38 -08003897TEST(DECONVOLUTION_NHWC_F32, grouped_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003898 ASSERT_EQ(xnn_status_success, xnn_initialize());
3899 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003900 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003901 .padding(1)
3902 .kernel_size(3, 3)
3903 .groups(2)
3904 .group_input_channels(15)
3905 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3906 .iterations(3)
3907 .TestF32();
3908}
3909
Marat Dukhanefc47b82019-11-18 09:25:38 -08003910TEST(DECONVOLUTION_NHWC_F32, grouped_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003911 ASSERT_EQ(xnn_status_success, xnn_initialize());
3912 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
3913 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003914 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003915 .padding_width(1)
3916 .kernel_size(kernel_height, 3)
3917 .groups(2)
3918 .group_input_channels(17)
3919 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3920 .iterations(3)
3921 .TestF32();
3922 }
3923}
3924
Marat Dukhanefc47b82019-11-18 09:25:38 -08003925TEST(DECONVOLUTION_NHWC_F32, grouped_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003926 ASSERT_EQ(xnn_status_success, xnn_initialize());
3927 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
3928 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003929 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003930 .padding_height(1)
3931 .kernel_size(3, kernel_width)
3932 .groups(2)
3933 .group_input_channels(17)
3934 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3935 .iterations(3)
3936 .TestF32();
3937 }
3938}
3939
Marat Dukhanefc47b82019-11-18 09:25:38 -08003940TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003941 ASSERT_EQ(xnn_status_success, xnn_initialize());
3942 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
3943 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
3944 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003945 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003946 .padding_width(1)
3947 .padding_top(padding_top)
3948 .padding_bottom(padding_bottom)
3949 .kernel_size(3, 3)
3950 .groups(2)
3951 .group_input_channels(15)
3952 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3953 .iterations(1)
3954 .TestF32();
3955 }
3956 }
3957}
3958
Marat Dukhanefc47b82019-11-18 09:25:38 -08003959TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003960 ASSERT_EQ(xnn_status_success, xnn_initialize());
3961 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
3962 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
3963 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003964 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003965 .padding_height(1)
3966 .padding_left(padding_left)
3967 .padding_right(padding_right)
3968 .kernel_size(3, 3)
3969 .groups(2)
3970 .group_input_channels(15)
3971 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3972 .iterations(1)
3973 .TestF32();
3974 }
3975 }
3976}
3977
Marat Dukhanefc47b82019-11-18 09:25:38 -08003978TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003979 ASSERT_EQ(xnn_status_success, xnn_initialize());
3980 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
3981 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003982 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003983 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08003984 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003985 .adjustment_height(adjustment_height)
3986 .kernel_size(3, 3)
3987 .groups(2)
3988 .group_input_channels(15)
3989 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
3990 .iterations(1)
3991 .TestF32();
3992 }
3993}
3994
Marat Dukhanefc47b82019-11-18 09:25:38 -08003995TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003996 ASSERT_EQ(xnn_status_success, xnn_initialize());
3997 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
3998 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003999 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004000 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004001 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004002 .adjustment_width(adjustment_width)
4003 .kernel_size(3, 3)
4004 .groups(2)
4005 .group_input_channels(15)
4006 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4007 .iterations(1)
4008 .TestF32();
4009 }
4010}
4011
Marat Dukhanefc47b82019-11-18 09:25:38 -08004012TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004013 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004014 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004015 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004016 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004017 .padding(1)
4018 .kernel_size(3, 3)
4019 .groups(2)
4020 .group_input_channels(15)
4021 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4022 .iterations(1)
4023 .TestF32();
4024 }
4025}
4026
Marat Dukhanefc47b82019-11-18 09:25:38 -08004027TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004028 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004029 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004030 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004031 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004032 .padding(1)
4033 .kernel_size(3, 3)
4034 .groups(2)
4035 .group_input_channels(15)
4036 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4037 .iterations(1)
4038 .TestF32();
4039 }
4040}
4041
Marat Dukhanefc47b82019-11-18 09:25:38 -08004042TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004043 ASSERT_EQ(xnn_status_success, xnn_initialize());
4044 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4045 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004046 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004047 .padding(1)
4048 .kernel_size(3, 3)
4049 .groups(2)
4050 .group_input_channels(input_channels)
4051 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4052 .iterations(1)
4053 .TestF32();
4054 }
4055}
4056
Marat Dukhanefc47b82019-11-18 09:25:38 -08004057TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004058 ASSERT_EQ(xnn_status_success, xnn_initialize());
4059 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
4060 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004061 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004062 .padding(1)
4063 .kernel_size(3, 3)
4064 .groups(2)
4065 .group_input_channels(23)
4066 .group_output_channels(output_channels)
4067 .iterations(1)
4068 .TestF32();
4069 }
4070}
4071
Marat Dukhanefc47b82019-11-18 09:25:38 -08004072TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004073 ASSERT_EQ(xnn_status_success, xnn_initialize());
4074 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
4075 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004076 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004077 .padding(1)
4078 .kernel_size(3, 3)
4079 .dilation_height(dilation_height)
4080 .groups(2)
4081 .group_input_channels(23)
4082 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4083 .iterations(3)
4084 .TestF32();
4085 }
4086}
4087
Marat Dukhanefc47b82019-11-18 09:25:38 -08004088TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004089 ASSERT_EQ(xnn_status_success, xnn_initialize());
4090 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
4091 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004092 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004093 .padding(1)
4094 .kernel_size(3, 3)
4095 .dilation_width(dilation_width)
4096 .groups(2)
4097 .group_input_channels(23)
4098 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4099 .iterations(3)
4100 .TestF32();
4101 }
4102}
4103
Marat Dukhanefc47b82019-11-18 09:25:38 -08004104TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004105 ASSERT_EQ(xnn_status_success, xnn_initialize());
4106 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004107 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004108 .padding(1)
4109 .kernel_size(3, 3)
4110 .dilation_height(3)
4111 .stride_height(2)
4112 .groups(2)
4113 .group_input_channels(23)
4114 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4115 .iterations(3)
4116 .TestF32();
4117}
4118
Marat Dukhanefc47b82019-11-18 09:25:38 -08004119TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004120 ASSERT_EQ(xnn_status_success, xnn_initialize());
4121 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004122 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004123 .padding(1)
4124 .kernel_size(3, 3)
4125 .dilation_width(3)
4126 .stride_width(2)
4127 .groups(2)
4128 .group_input_channels(23)
4129 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4130 .iterations(3)
4131 .TestF32();
4132}
4133
Marat Dukhanefc47b82019-11-18 09:25:38 -08004134TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004135 ASSERT_EQ(xnn_status_success, xnn_initialize());
4136 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004137 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004138 .padding(1)
4139 .kernel_size(3, 3)
4140 .groups(2)
4141 .group_input_channels(23)
4142 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4143 .input_pixel_stride(47)
4144 .iterations(3)
4145 .TestF32();
4146}
4147
Marat Dukhanefc47b82019-11-18 09:25:38 -08004148TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004149 ASSERT_EQ(xnn_status_success, xnn_initialize());
4150 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004151 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004152 .padding(1)
4153 .kernel_size(3, 3)
4154 .groups(2)
4155 .group_input_channels(23)
4156 .group_output_channels(xnn_params.f32.gemm.nr + 3)
4157 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
4158 .iterations(3)
4159 .TestF32();
4160}
4161
Marat Dukhanefc47b82019-11-18 09:25:38 -08004162TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004163 ASSERT_EQ(xnn_status_success, xnn_initialize());
4164 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004165 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004166 .padding(1)
4167 .kernel_size(3, 3)
4168 .groups(2)
4169 .group_input_channels(23)
4170 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4171 .qmin(128)
4172 .iterations(3)
4173 .TestF32();
4174}
4175
Marat Dukhanefc47b82019-11-18 09:25:38 -08004176TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004177 ASSERT_EQ(xnn_status_success, xnn_initialize());
4178 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004179 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004180 .padding(1)
4181 .kernel_size(3, 3)
4182 .groups(2)
4183 .group_input_channels(23)
4184 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004185 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004186 .iterations(3)
4187 .TestF32();
4188}
4189
Marat Dukhanefc47b82019-11-18 09:25:38 -08004190TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07004191 ASSERT_EQ(xnn_status_success, xnn_initialize());
4192 DeconvolutionOperatorTester()
4193 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08004194 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004195 .padding(1)
4196 .kernel_size(3, 3)
4197 .groups(2)
4198 .group_input_channels(23)
4199 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4200 .iterations(3)
4201 .TestF32();
4202}
4203
XNNPACK Teamb455b122019-09-27 18:10:33 -07004204/**************************** CONV path, batched ****************************/
4205
Marat Dukhanefc47b82019-11-18 09:25:38 -08004206TEST(DECONVOLUTION_NHWC_F32, batched_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004207 ASSERT_EQ(xnn_status_success, xnn_initialize());
4208 DeconvolutionOperatorTester()
4209 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004210 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004211 .padding(1)
4212 .kernel_size(3, 3)
4213 .group_input_channels(15)
4214 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4215 .iterations(3)
4216 .TestF32();
4217}
4218
Marat Dukhanefc47b82019-11-18 09:25:38 -08004219TEST(DECONVOLUTION_NHWC_F32, batched_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004220 ASSERT_EQ(xnn_status_success, xnn_initialize());
4221 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
4222 DeconvolutionOperatorTester()
4223 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004224 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004225 .padding_width(1)
4226 .kernel_size(kernel_height, 3)
4227 .group_input_channels(17)
4228 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4229 .iterations(3)
4230 .TestF32();
4231 }
4232}
4233
Marat Dukhanefc47b82019-11-18 09:25:38 -08004234TEST(DECONVOLUTION_NHWC_F32, batched_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004235 ASSERT_EQ(xnn_status_success, xnn_initialize());
4236 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
4237 DeconvolutionOperatorTester()
4238 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004239 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004240 .padding_height(1)
4241 .kernel_size(3, kernel_width)
4242 .group_input_channels(17)
4243 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4244 .iterations(3)
4245 .TestF32();
4246 }
4247}
4248
Marat Dukhanefc47b82019-11-18 09:25:38 -08004249TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004250 ASSERT_EQ(xnn_status_success, xnn_initialize());
4251 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
4252 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
4253 DeconvolutionOperatorTester()
4254 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004255 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004256 .padding_width(1)
4257 .padding_top(padding_top)
4258 .padding_bottom(padding_bottom)
4259 .kernel_size(3, 3)
4260 .group_input_channels(15)
4261 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4262 .iterations(1)
4263 .TestF32();
4264 }
4265 }
4266}
4267
Marat Dukhanefc47b82019-11-18 09:25:38 -08004268TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004269 ASSERT_EQ(xnn_status_success, xnn_initialize());
4270 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
4271 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
4272 DeconvolutionOperatorTester()
4273 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004274 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004275 .padding_height(1)
4276 .padding_left(padding_left)
4277 .padding_right(padding_right)
4278 .kernel_size(3, 3)
4279 .group_input_channels(15)
4280 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4281 .iterations(1)
4282 .TestF32();
4283 }
4284 }
4285}
4286
Marat Dukhanefc47b82019-11-18 09:25:38 -08004287TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004288 ASSERT_EQ(xnn_status_success, xnn_initialize());
4289 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
4290 DeconvolutionOperatorTester()
4291 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004292 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004293 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004294 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004295 .adjustment_height(adjustment_height)
4296 .kernel_size(3, 3)
4297 .group_input_channels(15)
4298 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4299 .iterations(1)
4300 .TestF32();
4301 }
4302}
4303
Marat Dukhanefc47b82019-11-18 09:25:38 -08004304TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004305 ASSERT_EQ(xnn_status_success, xnn_initialize());
4306 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
4307 DeconvolutionOperatorTester()
4308 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004309 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004310 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004311 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004312 .adjustment_width(adjustment_width)
4313 .kernel_size(3, 3)
4314 .group_input_channels(15)
4315 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4316 .iterations(1)
4317 .TestF32();
4318 }
4319}
4320
Marat Dukhanefc47b82019-11-18 09:25:38 -08004321TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004322 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004323 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004324 DeconvolutionOperatorTester()
4325 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004326 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004327 .padding(1)
4328 .kernel_size(3, 3)
4329 .group_input_channels(15)
4330 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4331 .iterations(1)
4332 .TestF32();
4333 }
4334}
4335
Marat Dukhanefc47b82019-11-18 09:25:38 -08004336TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004337 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004338 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004339 DeconvolutionOperatorTester()
4340 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004341 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004342 .padding(1)
4343 .kernel_size(3, 3)
4344 .group_input_channels(15)
4345 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4346 .iterations(1)
4347 .TestF32();
4348 }
4349}
4350
Marat Dukhanefc47b82019-11-18 09:25:38 -08004351TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004352 ASSERT_EQ(xnn_status_success, xnn_initialize());
4353 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4354 DeconvolutionOperatorTester()
4355 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004356 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004357 .padding(1)
4358 .kernel_size(3, 3)
4359 .group_input_channels(input_channels)
4360 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4361 .iterations(1)
4362 .TestF32();
4363 }
4364}
4365
Marat Dukhanefc47b82019-11-18 09:25:38 -08004366TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004367 ASSERT_EQ(xnn_status_success, xnn_initialize());
4368 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
4369 DeconvolutionOperatorTester()
4370 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004371 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004372 .padding(1)
4373 .kernel_size(3, 3)
4374 .group_input_channels(23)
4375 .group_output_channels(output_channels)
4376 .iterations(1)
4377 .TestF32();
4378 }
4379}
4380
Marat Dukhanefc47b82019-11-18 09:25:38 -08004381TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004382 ASSERT_EQ(xnn_status_success, xnn_initialize());
4383 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
4384 DeconvolutionOperatorTester()
4385 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004386 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004387 .padding(1)
4388 .kernel_size(3, 3)
4389 .dilation_height(dilation_height)
4390 .group_input_channels(23)
4391 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4392 .iterations(3)
4393 .TestF32();
4394 }
4395}
4396
Marat Dukhanefc47b82019-11-18 09:25:38 -08004397TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004398 ASSERT_EQ(xnn_status_success, xnn_initialize());
4399 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
4400 DeconvolutionOperatorTester()
4401 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004402 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004403 .padding(1)
4404 .kernel_size(3, 3)
4405 .dilation_width(dilation_width)
4406 .group_input_channels(23)
4407 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4408 .iterations(3)
4409 .TestF32();
4410 }
4411}
4412
Marat Dukhanefc47b82019-11-18 09:25:38 -08004413TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004414 ASSERT_EQ(xnn_status_success, xnn_initialize());
4415 DeconvolutionOperatorTester()
4416 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004417 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004418 .padding(1)
4419 .kernel_size(3, 3)
4420 .dilation_height(3)
4421 .stride_height(2)
4422 .group_input_channels(23)
4423 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4424 .iterations(3)
4425 .TestF32();
4426}
4427
Marat Dukhanefc47b82019-11-18 09:25:38 -08004428TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004429 ASSERT_EQ(xnn_status_success, xnn_initialize());
4430 DeconvolutionOperatorTester()
4431 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004432 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004433 .padding(1)
4434 .kernel_size(3, 3)
4435 .dilation_width(3)
4436 .stride_width(2)
4437 .group_input_channels(23)
4438 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4439 .iterations(3)
4440 .TestF32();
4441}
4442
Marat Dukhanefc47b82019-11-18 09:25:38 -08004443TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004444 ASSERT_EQ(xnn_status_success, xnn_initialize());
4445 DeconvolutionOperatorTester()
4446 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004447 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004448 .padding(1)
4449 .kernel_size(3, 3)
4450 .group_input_channels(23)
4451 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4452 .input_pixel_stride(28)
4453 .iterations(3)
4454 .TestF32();
4455}
4456
Marat Dukhanefc47b82019-11-18 09:25:38 -08004457TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004458 ASSERT_EQ(xnn_status_success, xnn_initialize());
4459 DeconvolutionOperatorTester()
4460 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004461 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004462 .padding(1)
4463 .kernel_size(3, 3)
4464 .group_input_channels(23)
4465 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4466 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
4467 .iterations(3)
4468 .TestF32();
4469}
4470
Marat Dukhanefc47b82019-11-18 09:25:38 -08004471TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004472 ASSERT_EQ(xnn_status_success, xnn_initialize());
4473 DeconvolutionOperatorTester()
4474 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004475 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004476 .padding(1)
4477 .kernel_size(3, 3)
4478 .group_input_channels(23)
4479 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4480 .qmin(128)
4481 .iterations(3)
4482 .TestF32();
4483}
4484
Marat Dukhanefc47b82019-11-18 09:25:38 -08004485TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004486 ASSERT_EQ(xnn_status_success, xnn_initialize());
4487 DeconvolutionOperatorTester()
4488 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004489 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004490 .padding(1)
4491 .kernel_size(3, 3)
4492 .group_input_channels(23)
4493 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004494 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004495 .iterations(3)
4496 .TestF32();
4497}
4498
Marat Dukhanefc47b82019-11-18 09:25:38 -08004499TEST(DECONVOLUTION_NHWC_F32, batched_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07004500 ASSERT_EQ(xnn_status_success, xnn_initialize());
4501 DeconvolutionOperatorTester()
4502 .has_bias(false)
4503 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004504 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004505 .padding(1)
4506 .kernel_size(3, 3)
4507 .group_input_channels(23)
4508 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4509 .iterations(3)
4510 .TestF32();
4511}
4512
XNNPACK Teamb455b122019-09-27 18:10:33 -07004513/**************************** CONV path, grouped, batched ****************************/
4514
Marat Dukhanefc47b82019-11-18 09:25:38 -08004515TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004516 ASSERT_EQ(xnn_status_success, xnn_initialize());
4517 DeconvolutionOperatorTester()
4518 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004519 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004520 .padding(1)
4521 .kernel_size(3, 3)
4522 .groups(2)
4523 .group_input_channels(15)
4524 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4525 .iterations(3)
4526 .TestF32();
4527}
4528
Marat Dukhanefc47b82019-11-18 09:25:38 -08004529TEST(DECONVOLUTION_NHWC_F32, batched_grouped_Kx3) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004530 ASSERT_EQ(xnn_status_success, xnn_initialize());
4531 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
4532 DeconvolutionOperatorTester()
4533 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004534 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004535 .padding_width(1)
4536 .kernel_size(kernel_height, 3)
4537 .groups(2)
4538 .group_input_channels(17)
4539 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4540 .iterations(3)
4541 .TestF32();
4542 }
4543}
4544
Marat Dukhanefc47b82019-11-18 09:25:38 -08004545TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3xK) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004546 ASSERT_EQ(xnn_status_success, xnn_initialize());
4547 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
4548 DeconvolutionOperatorTester()
4549 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004550 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004551 .padding_height(1)
4552 .kernel_size(3, kernel_width)
4553 .groups(2)
4554 .group_input_channels(17)
4555 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4556 .iterations(3)
4557 .TestF32();
4558 }
4559}
4560
Marat Dukhanefc47b82019-11-18 09:25:38 -08004561TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004562 ASSERT_EQ(xnn_status_success, xnn_initialize());
4563 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
4564 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
4565 DeconvolutionOperatorTester()
4566 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004567 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004568 .padding_width(1)
4569 .padding_top(padding_top)
4570 .padding_bottom(padding_bottom)
4571 .kernel_size(3, 3)
4572 .groups(2)
4573 .group_input_channels(15)
4574 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4575 .iterations(1)
4576 .TestF32();
4577 }
4578 }
4579}
4580
Marat Dukhanefc47b82019-11-18 09:25:38 -08004581TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004582 ASSERT_EQ(xnn_status_success, xnn_initialize());
4583 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
4584 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
4585 DeconvolutionOperatorTester()
4586 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004587 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004588 .padding_height(1)
4589 .padding_left(padding_left)
4590 .padding_right(padding_right)
4591 .kernel_size(3, 3)
4592 .groups(2)
4593 .group_input_channels(15)
4594 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4595 .iterations(1)
4596 .TestF32();
4597 }
4598 }
4599}
4600
Marat Dukhanefc47b82019-11-18 09:25:38 -08004601TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004602 ASSERT_EQ(xnn_status_success, xnn_initialize());
4603 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
4604 DeconvolutionOperatorTester()
4605 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004606 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004607 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004608 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004609 .adjustment_height(adjustment_height)
4610 .kernel_size(3, 3)
4611 .groups(2)
4612 .group_input_channels(15)
4613 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4614 .iterations(1)
4615 .TestF32();
4616 }
4617}
4618
Marat Dukhanefc47b82019-11-18 09:25:38 -08004619TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004620 ASSERT_EQ(xnn_status_success, xnn_initialize());
4621 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
4622 DeconvolutionOperatorTester()
4623 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004624 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004625 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004626 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004627 .adjustment_width(adjustment_width)
4628 .kernel_size(3, 3)
4629 .groups(2)
4630 .group_input_channels(15)
4631 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4632 .iterations(1)
4633 .TestF32();
4634 }
4635}
4636
Marat Dukhanefc47b82019-11-18 09:25:38 -08004637TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004638 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004639 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004640 DeconvolutionOperatorTester()
4641 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004642 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004643 .padding(1)
4644 .kernel_size(3, 3)
4645 .groups(2)
4646 .group_input_channels(15)
4647 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4648 .iterations(1)
4649 .TestF32();
4650 }
4651}
4652
Marat Dukhanefc47b82019-11-18 09:25:38 -08004653TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004654 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08004655 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004656 DeconvolutionOperatorTester()
4657 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004658 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004659 .padding(1)
4660 .kernel_size(3, 3)
4661 .groups(2)
4662 .group_input_channels(15)
4663 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4664 .iterations(1)
4665 .TestF32();
4666 }
4667}
4668
Marat Dukhanefc47b82019-11-18 09:25:38 -08004669TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004670 ASSERT_EQ(xnn_status_success, xnn_initialize());
4671 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4672 DeconvolutionOperatorTester()
4673 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004674 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004675 .padding(1)
4676 .kernel_size(3, 3)
4677 .groups(2)
4678 .group_input_channels(input_channels)
4679 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4680 .iterations(1)
4681 .TestF32();
4682 }
4683}
4684
Marat Dukhanefc47b82019-11-18 09:25:38 -08004685TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004686 ASSERT_EQ(xnn_status_success, xnn_initialize());
4687 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
4688 DeconvolutionOperatorTester()
4689 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004690 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004691 .padding(1)
4692 .kernel_size(3, 3)
4693 .groups(2)
4694 .group_input_channels(23)
4695 .group_output_channels(output_channels)
4696 .iterations(1)
4697 .TestF32();
4698 }
4699}
4700
Marat Dukhanefc47b82019-11-18 09:25:38 -08004701TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_height_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004702 ASSERT_EQ(xnn_status_success, xnn_initialize());
4703 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
4704 DeconvolutionOperatorTester()
4705 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004706 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004707 .padding(1)
4708 .kernel_size(3, 3)
4709 .dilation_height(dilation_height)
4710 .groups(2)
4711 .group_input_channels(23)
4712 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4713 .iterations(3)
4714 .TestF32();
4715 }
4716}
4717
Marat Dukhanefc47b82019-11-18 09:25:38 -08004718TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_width_dilation) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004719 ASSERT_EQ(xnn_status_success, xnn_initialize());
4720 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
4721 DeconvolutionOperatorTester()
4722 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004723 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004724 .padding(1)
4725 .kernel_size(3, 3)
4726 .dilation_width(dilation_width)
4727 .groups(2)
4728 .group_input_channels(23)
4729 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4730 .iterations(3)
4731 .TestF32();
4732 }
4733}
4734
Marat Dukhanefc47b82019-11-18 09:25:38 -08004735TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_height_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004736 ASSERT_EQ(xnn_status_success, xnn_initialize());
4737 DeconvolutionOperatorTester()
4738 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004739 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004740 .padding(1)
4741 .kernel_size(3, 3)
4742 .dilation_height(3)
4743 .stride_width(2)
4744 .groups(2)
4745 .group_input_channels(23)
4746 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4747 .iterations(3)
4748 .TestF32();
4749}
4750
Marat Dukhanefc47b82019-11-18 09:25:38 -08004751TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_width_dilation_and_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004752 ASSERT_EQ(xnn_status_success, xnn_initialize());
4753 DeconvolutionOperatorTester()
4754 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004755 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004756 .padding(1)
4757 .kernel_size(3, 3)
4758 .dilation_width(3)
4759 .stride_width(2)
4760 .groups(2)
4761 .group_input_channels(23)
4762 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4763 .iterations(3)
4764 .TestF32();
4765}
4766
Marat Dukhanefc47b82019-11-18 09:25:38 -08004767TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004768 ASSERT_EQ(xnn_status_success, xnn_initialize());
4769 DeconvolutionOperatorTester()
4770 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004771 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004772 .padding(1)
4773 .kernel_size(3, 3)
4774 .groups(2)
4775 .group_input_channels(23)
4776 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4777 .input_pixel_stride(47)
4778 .iterations(3)
4779 .TestF32();
4780}
4781
Marat Dukhanefc47b82019-11-18 09:25:38 -08004782TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004783 ASSERT_EQ(xnn_status_success, xnn_initialize());
4784 DeconvolutionOperatorTester()
4785 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004786 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004787 .padding(1)
4788 .kernel_size(3, 3)
4789 .groups(2)
4790 .group_input_channels(23)
4791 .group_output_channels(xnn_params.f32.gemm.nr + 3)
4792 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
4793 .iterations(3)
4794 .TestF32();
4795}
4796
Marat Dukhanefc47b82019-11-18 09:25:38 -08004797TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004798 ASSERT_EQ(xnn_status_success, xnn_initialize());
4799 DeconvolutionOperatorTester()
4800 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004801 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004802 .padding(1)
4803 .kernel_size(3, 3)
4804 .groups(2)
4805 .group_input_channels(23)
4806 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4807 .qmin(128)
4808 .iterations(3)
4809 .TestF32();
4810}
4811
Marat Dukhanefc47b82019-11-18 09:25:38 -08004812TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004813 ASSERT_EQ(xnn_status_success, xnn_initialize());
4814 DeconvolutionOperatorTester()
4815 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004816 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004817 .padding(1)
4818 .kernel_size(3, 3)
4819 .groups(2)
4820 .group_input_channels(23)
4821 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004822 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004823 .iterations(3)
4824 .TestF32();
4825}
4826
Marat Dukhanefc47b82019-11-18 09:25:38 -08004827TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07004828 ASSERT_EQ(xnn_status_success, xnn_initialize());
4829 DeconvolutionOperatorTester()
4830 .has_bias(false)
4831 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004832 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004833 .padding(1)
4834 .kernel_size(3, 3)
4835 .groups(2)
4836 .group_input_channels(23)
4837 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4838 .iterations(3)
4839 .TestF32();
4840}
4841
XNNPACK Teamb455b122019-09-27 18:10:33 -07004842/**************************** CONV path, setup ****************************/
4843
Marat Dukhanefc47b82019-11-18 09:25:38 -08004844TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_batch) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004845 ASSERT_EQ(xnn_status_success, xnn_initialize());
4846 DeconvolutionOperatorTester()
4847 .batch_size(2)
4848 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08004849 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004850 .kernel_height(3)
4851 .kernel_width(5)
4852 .groups(2)
4853 .group_input_channels(15)
4854 .group_output_channels(17)
4855 .TestSetupF32();
4856}
4857
Marat Dukhanefc47b82019-11-18 09:25:38 -08004858TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004859 ASSERT_EQ(xnn_status_success, xnn_initialize());
4860 DeconvolutionOperatorTester()
4861 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004862 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
4863 .next_input_height(kUnstridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004864 .kernel_height(3)
4865 .kernel_width(5)
4866 .groups(2)
4867 .group_input_channels(15)
4868 .group_output_channels(17)
4869 .TestSetupF32();
4870}
4871
Marat Dukhanefc47b82019-11-18 09:25:38 -08004872TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004873 ASSERT_EQ(xnn_status_success, xnn_initialize());
4874 DeconvolutionOperatorTester()
4875 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004876 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
4877 .next_input_width(kUnstridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004878 .kernel_height(3)
4879 .kernel_width(5)
4880 .groups(2)
4881 .group_input_channels(15)
4882 .group_output_channels(17)
4883 .TestSetupF32();
4884}
4885
4886/**************************** SUBCONV2D path ****************************/
4887
Marat Dukhanefc47b82019-11-18 09:25:38 -08004888TEST(DECONVOLUTION_NHWC_F32, 3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004889 ASSERT_EQ(xnn_status_success, xnn_initialize());
4890 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004891 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004892 .padding(1)
4893 .kernel_size(3, 3)
4894 .stride(2)
4895 .group_input_channels(15)
4896 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4897 .iterations(3)
4898 .TestF32();
4899}
4900
Marat Dukhanefc47b82019-11-18 09:25:38 -08004901TEST(DECONVOLUTION_NHWC_F32, Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004902 ASSERT_EQ(xnn_status_success, xnn_initialize());
4903 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
4904 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004905 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004906 .padding_width(1)
4907 .kernel_size(kernel_height, 3)
4908 .stride(2)
4909 .group_input_channels(17)
4910 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4911 .iterations(3)
4912 .TestF32();
4913 }
4914}
4915
Marat Dukhanefc47b82019-11-18 09:25:38 -08004916TEST(DECONVOLUTION_NHWC_F32, 3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004917 ASSERT_EQ(xnn_status_success, xnn_initialize());
4918 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
4919 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004920 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004921 .padding_height(1)
4922 .kernel_size(3, kernel_width)
4923 .stride(2)
4924 .group_input_channels(17)
4925 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4926 .iterations(3)
4927 .TestF32();
4928 }
4929}
4930
Marat Dukhanefc47b82019-11-18 09:25:38 -08004931TEST(DECONVOLUTION_NHWC_F32, 3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004932 ASSERT_EQ(xnn_status_success, xnn_initialize());
4933 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
4934 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004935 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004936 .padding(1)
4937 .padding_width(1)
4938 .kernel_size(3, 3)
4939 .stride_height(stride_height)
4940 .group_input_channels(17)
4941 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4942 .iterations(3)
4943 .TestF32();
4944 }
4945}
4946
Marat Dukhanefc47b82019-11-18 09:25:38 -08004947TEST(DECONVOLUTION_NHWC_F32, 3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004948 ASSERT_EQ(xnn_status_success, xnn_initialize());
4949 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
4950 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004951 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004952 .padding(1)
4953 .padding_width(1)
4954 .kernel_size(3, 3)
4955 .stride_width(stride_width)
4956 .group_input_channels(17)
4957 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4958 .iterations(3)
4959 .TestF32();
4960 }
4961}
4962
Marat Dukhanefc47b82019-11-18 09:25:38 -08004963TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004964 ASSERT_EQ(xnn_status_success, xnn_initialize());
4965 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
4966 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
4967 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004968 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004969 .padding_width(1)
4970 .padding_top(padding_top)
4971 .padding_bottom(padding_bottom)
4972 .kernel_size(3, 3)
4973 .stride(2)
4974 .group_input_channels(15)
4975 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4976 .iterations(1)
4977 .TestF32();
4978 }
4979 }
4980}
4981
Marat Dukhanefc47b82019-11-18 09:25:38 -08004982TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004983 ASSERT_EQ(xnn_status_success, xnn_initialize());
4984 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
4985 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
4986 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004987 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004988 .padding_height(1)
4989 .padding_left(padding_left)
4990 .padding_right(padding_right)
4991 .kernel_size(3, 3)
4992 .stride(2)
4993 .group_input_channels(15)
4994 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
4995 .iterations(1)
4996 .TestF32();
4997 }
4998 }
4999}
5000
Marat Dukhanefc47b82019-11-18 09:25:38 -08005001TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005002 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005003 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005004 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005005 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005006 .padding(1)
5007 .adjustment_height(adjustment_height)
5008 .kernel_size(3, 3)
5009 .stride(2)
5010 .group_input_channels(15)
5011 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5012 .iterations(1)
5013 .TestF32();
5014 }
5015}
5016
Marat Dukhanefc47b82019-11-18 09:25:38 -08005017TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005018 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005019 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005020 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005021 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005022 .padding(1)
5023 .adjustment_width(adjustment_width)
5024 .kernel_size(3, 3)
5025 .stride(2)
5026 .group_input_channels(15)
5027 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5028 .iterations(1)
5029 .TestF32();
5030 }
5031}
5032
Marat Dukhanefc47b82019-11-18 09:25:38 -08005033TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005034 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005035 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005036 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005037 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005038 .padding(1)
5039 .kernel_size(3, 3)
5040 .stride(2)
5041 .group_input_channels(15)
5042 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5043 .iterations(1)
5044 .TestF32();
5045 }
5046}
5047
Marat Dukhanefc47b82019-11-18 09:25:38 -08005048TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005049 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005050 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005051 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005052 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005053 .padding(1)
5054 .kernel_size(3, 3)
5055 .stride(2)
5056 .group_input_channels(15)
5057 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5058 .iterations(1)
5059 .TestF32();
5060 }
5061}
5062
Marat Dukhanefc47b82019-11-18 09:25:38 -08005063TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005064 ASSERT_EQ(xnn_status_success, xnn_initialize());
5065 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
5066 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005067 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005068 .padding(1)
5069 .kernel_size(3, 3)
5070 .stride(2)
5071 .group_input_channels(input_channels)
5072 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5073 .iterations(1)
5074 .TestF32();
5075 }
5076}
5077
Marat Dukhanefc47b82019-11-18 09:25:38 -08005078TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005079 ASSERT_EQ(xnn_status_success, xnn_initialize());
5080 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
5081 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005082 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005083 .padding(1)
5084 .kernel_size(3, 3)
5085 .stride(2)
5086 .group_input_channels(23)
5087 .group_output_channels(output_channels)
5088 .iterations(1)
5089 .TestF32();
5090 }
5091}
5092
Marat Dukhanefc47b82019-11-18 09:25:38 -08005093TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005094 ASSERT_EQ(xnn_status_success, xnn_initialize());
5095 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005096 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005097 .padding(1)
5098 .kernel_size(3, 3)
5099 .stride(2)
5100 .group_input_channels(23)
5101 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5102 .input_pixel_stride(28)
5103 .iterations(3)
5104 .TestF32();
5105}
5106
Marat Dukhanefc47b82019-11-18 09:25:38 -08005107TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005108 ASSERT_EQ(xnn_status_success, xnn_initialize());
5109 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005110 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005111 .padding(1)
5112 .kernel_size(3, 3)
5113 .stride(2)
5114 .group_input_channels(23)
5115 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5116 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
5117 .iterations(3)
5118 .TestF32();
5119}
5120
Marat Dukhanefc47b82019-11-18 09:25:38 -08005121TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005122 ASSERT_EQ(xnn_status_success, xnn_initialize());
5123 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005124 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005125 .padding(1)
5126 .kernel_size(3, 3)
5127 .stride(2)
5128 .group_input_channels(23)
5129 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5130 .qmin(128)
5131 .iterations(3)
5132 .TestF32();
5133}
5134
Marat Dukhanefc47b82019-11-18 09:25:38 -08005135TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005136 ASSERT_EQ(xnn_status_success, xnn_initialize());
5137 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005138 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005139 .padding(1)
5140 .kernel_size(3, 3)
5141 .stride(2)
5142 .group_input_channels(23)
5143 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005144 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005145 .iterations(3)
5146 .TestF32();
5147}
5148
Marat Dukhanefc47b82019-11-18 09:25:38 -08005149TEST(DECONVOLUTION_NHWC_F32, 3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07005150 ASSERT_EQ(xnn_status_success, xnn_initialize());
5151 DeconvolutionOperatorTester()
5152 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08005153 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005154 .padding(1)
5155 .kernel_size(3, 3)
5156 .stride(2)
5157 .group_input_channels(23)
5158 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5159 .iterations(3)
5160 .TestF32();
5161}
5162
XNNPACK Teamb455b122019-09-27 18:10:33 -07005163/**************************** SUBCONV2D path, grouped ****************************/
5164
Marat Dukhanefc47b82019-11-18 09:25:38 -08005165TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005166 ASSERT_EQ(xnn_status_success, xnn_initialize());
5167 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005168 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005169 .padding(1)
5170 .kernel_size(3, 3)
5171 .stride(2)
5172 .groups(2)
5173 .group_input_channels(17)
5174 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5175 .iterations(3)
5176 .TestF32();
5177}
5178
Marat Dukhanefc47b82019-11-18 09:25:38 -08005179TEST(DECONVOLUTION_NHWC_F32, grouped_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005180 ASSERT_EQ(xnn_status_success, xnn_initialize());
5181 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
5182 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005183 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005184 .padding_width(1)
5185 .kernel_size(kernel_height, 3)
5186 .stride(2)
5187 .groups(2)
5188 .group_input_channels(17)
5189 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5190 .iterations(3)
5191 .TestF32();
5192 }
5193}
5194
Marat Dukhanefc47b82019-11-18 09:25:38 -08005195TEST(DECONVOLUTION_NHWC_F32, grouped_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005196 ASSERT_EQ(xnn_status_success, xnn_initialize());
5197 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
5198 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005199 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005200 .padding_height(1)
5201 .kernel_size(3, kernel_width)
5202 .stride(2)
5203 .groups(2)
5204 .group_input_channels(17)
5205 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5206 .iterations(3)
5207 .TestF32();
5208 }
5209}
5210
Marat Dukhanefc47b82019-11-18 09:25:38 -08005211TEST(DECONVOLUTION_NHWC_F32, grouped_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005212 ASSERT_EQ(xnn_status_success, xnn_initialize());
5213 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
5214 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005215 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005216 .padding(1)
5217 .padding_width(1)
5218 .kernel_size(3, 3)
5219 .stride_height(stride_height)
5220 .groups(2)
5221 .group_input_channels(17)
5222 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5223 .iterations(3)
5224 .TestF32();
5225 }
5226}
5227
Marat Dukhanefc47b82019-11-18 09:25:38 -08005228TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005229 ASSERT_EQ(xnn_status_success, xnn_initialize());
5230 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
5231 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005232 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005233 .padding(1)
5234 .padding_width(1)
5235 .kernel_size(3, 3)
5236 .stride_width(stride_width)
5237 .groups(2)
5238 .group_input_channels(17)
5239 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5240 .iterations(3)
5241 .TestF32();
5242 }
5243}
5244
Marat Dukhanefc47b82019-11-18 09:25:38 -08005245TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005246 ASSERT_EQ(xnn_status_success, xnn_initialize());
5247 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5248 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5249 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005250 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005251 .padding_width(1)
5252 .padding_top(padding_top)
5253 .padding_bottom(padding_bottom)
5254 .kernel_size(3, 3)
5255 .stride(2)
5256 .groups(2)
5257 .group_input_channels(17)
5258 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5259 .iterations(1)
5260 .TestF32();
5261 }
5262 }
5263}
5264
Marat Dukhanefc47b82019-11-18 09:25:38 -08005265TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005266 ASSERT_EQ(xnn_status_success, xnn_initialize());
5267 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5268 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5269 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005270 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005271 .padding_height(1)
5272 .padding_left(padding_left)
5273 .padding_right(padding_right)
5274 .kernel_size(3, 3)
5275 .stride(2)
5276 .groups(2)
5277 .group_input_channels(17)
5278 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5279 .iterations(1)
5280 .TestF32();
5281 }
5282 }
5283}
5284
Marat Dukhanefc47b82019-11-18 09:25:38 -08005285TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005286 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005287 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005288 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005289 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005290 .padding(1)
5291 .adjustment_height(adjustment_height)
5292 .kernel_size(3, 3)
5293 .stride(2)
5294 .groups(2)
5295 .group_input_channels(17)
5296 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5297 .iterations(1)
5298 .TestF32();
5299 }
5300}
5301
Marat Dukhanefc47b82019-11-18 09:25:38 -08005302TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005303 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005304 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005305 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005306 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005307 .padding(1)
5308 .adjustment_width(adjustment_width)
5309 .kernel_size(3, 3)
5310 .stride(2)
5311 .groups(2)
5312 .group_input_channels(17)
5313 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5314 .iterations(1)
5315 .TestF32();
5316 }
5317}
5318
Marat Dukhanefc47b82019-11-18 09:25:38 -08005319TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005320 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005321 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005322 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005323 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005324 .padding(1)
5325 .kernel_size(3, 3)
5326 .stride(2)
5327 .groups(2)
5328 .group_input_channels(17)
5329 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5330 .iterations(1)
5331 .TestF32();
5332 }
5333}
5334
Marat Dukhanefc47b82019-11-18 09:25:38 -08005335TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005336 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005337 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005338 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005339 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005340 .padding(1)
5341 .kernel_size(3, 3)
5342 .stride(2)
5343 .groups(2)
5344 .group_input_channels(17)
5345 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5346 .iterations(1)
5347 .TestF32();
5348 }
5349}
5350
Marat Dukhanefc47b82019-11-18 09:25:38 -08005351TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005352 ASSERT_EQ(xnn_status_success, xnn_initialize());
5353 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
5354 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005355 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005356 .padding(1)
5357 .kernel_size(3, 3)
5358 .stride(2)
5359 .groups(2)
5360 .group_input_channels(input_channels)
5361 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5362 .iterations(1)
5363 .TestF32();
5364 }
5365}
5366
Marat Dukhanefc47b82019-11-18 09:25:38 -08005367TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005368 ASSERT_EQ(xnn_status_success, xnn_initialize());
5369 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
5370 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005371 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005372 .padding(1)
5373 .kernel_size(3, 3)
5374 .stride(2)
5375 .groups(2)
5376 .group_input_channels(17)
5377 .group_output_channels(output_channels)
5378 .iterations(1)
5379 .TestF32();
5380 }
5381}
5382
Marat Dukhanefc47b82019-11-18 09:25:38 -08005383TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005384 ASSERT_EQ(xnn_status_success, xnn_initialize());
5385 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005386 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005387 .padding(1)
5388 .kernel_size(3, 3)
5389 .stride(2)
5390 .groups(2)
5391 .group_input_channels(17)
5392 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5393 .input_pixel_stride(37)
5394 .iterations(3)
5395 .TestF32();
5396}
5397
Marat Dukhanefc47b82019-11-18 09:25:38 -08005398TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005399 ASSERT_EQ(xnn_status_success, xnn_initialize());
5400 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005401 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005402 .padding(1)
5403 .kernel_size(3, 3)
5404 .stride(2)
5405 .groups(2)
5406 .group_input_channels(17)
5407 .group_output_channels(xnn_params.f32.gemm.nr + 3)
5408 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
5409 .iterations(3)
5410 .TestF32();
5411}
5412
Marat Dukhanefc47b82019-11-18 09:25:38 -08005413TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005414 ASSERT_EQ(xnn_status_success, xnn_initialize());
5415 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005416 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005417 .padding(1)
5418 .kernel_size(3, 3)
5419 .stride(2)
5420 .groups(2)
5421 .group_input_channels(17)
5422 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5423 .qmin(128)
5424 .iterations(3)
5425 .TestF32();
5426}
5427
Marat Dukhanefc47b82019-11-18 09:25:38 -08005428TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005429 ASSERT_EQ(xnn_status_success, xnn_initialize());
5430 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005431 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005432 .padding(1)
5433 .kernel_size(3, 3)
5434 .stride(2)
5435 .groups(2)
5436 .group_input_channels(17)
5437 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005438 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005439 .iterations(3)
5440 .TestF32();
5441}
5442
Marat Dukhanefc47b82019-11-18 09:25:38 -08005443TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07005444 ASSERT_EQ(xnn_status_success, xnn_initialize());
5445 DeconvolutionOperatorTester()
5446 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08005447 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005448 .padding(1)
5449 .kernel_size(3, 3)
5450 .stride(2)
5451 .groups(2)
5452 .group_input_channels(17)
5453 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5454 .iterations(3)
5455 .TestF32();
5456}
5457
XNNPACK Teamb455b122019-09-27 18:10:33 -07005458/**************************** SUBCONV2D path, batched ****************************/
5459
Marat Dukhanefc47b82019-11-18 09:25:38 -08005460TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005461 ASSERT_EQ(xnn_status_success, xnn_initialize());
5462 DeconvolutionOperatorTester()
5463 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005464 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005465 .padding(1)
5466 .kernel_size(3, 3)
5467 .stride(2)
5468 .group_input_channels(15)
5469 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5470 .iterations(3)
5471 .TestF32();
5472}
5473
Marat Dukhanefc47b82019-11-18 09:25:38 -08005474TEST(DECONVOLUTION_NHWC_F32, batched_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005475 ASSERT_EQ(xnn_status_success, xnn_initialize());
5476 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
5477 DeconvolutionOperatorTester()
5478 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005479 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005480 .padding_width(1)
5481 .kernel_size(kernel_height, 3)
5482 .stride(2)
5483 .group_input_channels(17)
5484 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5485 .iterations(3)
5486 .TestF32();
5487 }
5488}
5489
Marat Dukhanefc47b82019-11-18 09:25:38 -08005490TEST(DECONVOLUTION_NHWC_F32, batched_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005491 ASSERT_EQ(xnn_status_success, xnn_initialize());
5492 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
5493 DeconvolutionOperatorTester()
5494 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005495 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005496 .padding_height(1)
5497 .kernel_size(3, kernel_width)
5498 .stride(2)
5499 .group_input_channels(17)
5500 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5501 .iterations(3)
5502 .TestF32();
5503 }
5504}
5505
Marat Dukhanefc47b82019-11-18 09:25:38 -08005506TEST(DECONVOLUTION_NHWC_F32, batched_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005507 ASSERT_EQ(xnn_status_success, xnn_initialize());
5508 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
5509 DeconvolutionOperatorTester()
5510 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005511 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005512 .padding(1)
5513 .padding_width(1)
5514 .kernel_size(3, 3)
5515 .stride_height(stride_height)
5516 .group_input_channels(17)
5517 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5518 .iterations(3)
5519 .TestF32();
5520 }
5521}
5522
Marat Dukhanefc47b82019-11-18 09:25:38 -08005523TEST(DECONVOLUTION_NHWC_F32, batched_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005524 ASSERT_EQ(xnn_status_success, xnn_initialize());
5525 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
5526 DeconvolutionOperatorTester()
5527 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005528 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005529 .padding(1)
5530 .padding_width(1)
5531 .kernel_size(3, 3)
5532 .stride_width(stride_width)
5533 .group_input_channels(17)
5534 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5535 .iterations(3)
5536 .TestF32();
5537 }
5538}
5539
Marat Dukhanefc47b82019-11-18 09:25:38 -08005540TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005541 ASSERT_EQ(xnn_status_success, xnn_initialize());
5542 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5543 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5544 DeconvolutionOperatorTester()
5545 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005546 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005547 .padding_width(1)
5548 .padding_top(padding_top)
5549 .padding_bottom(padding_bottom)
5550 .kernel_size(3, 3)
5551 .stride(2)
5552 .group_input_channels(15)
5553 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5554 .iterations(1)
5555 .TestF32();
5556 }
5557 }
5558}
5559
Marat Dukhanefc47b82019-11-18 09:25:38 -08005560TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005561 ASSERT_EQ(xnn_status_success, xnn_initialize());
5562 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5563 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5564 DeconvolutionOperatorTester()
5565 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005566 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005567 .padding_height(1)
5568 .padding_left(padding_left)
5569 .padding_right(padding_right)
5570 .kernel_size(3, 3)
5571 .stride(2)
5572 .group_input_channels(15)
5573 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5574 .iterations(1)
5575 .TestF32();
5576 }
5577 }
5578}
5579
Marat Dukhanefc47b82019-11-18 09:25:38 -08005580TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005581 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005582 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005583 DeconvolutionOperatorTester()
5584 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005585 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005586 .padding(1)
5587 .adjustment_height(adjustment_height)
5588 .kernel_size(3, 3)
5589 .stride(2)
5590 .group_input_channels(15)
5591 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5592 .iterations(1)
5593 .TestF32();
5594 }
5595}
5596
Marat Dukhanefc47b82019-11-18 09:25:38 -08005597TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005598 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005599 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005600 DeconvolutionOperatorTester()
5601 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005602 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005603 .padding(1)
5604 .adjustment_width(adjustment_width)
5605 .kernel_size(3, 3)
5606 .stride(2)
5607 .group_input_channels(15)
5608 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5609 .iterations(1)
5610 .TestF32();
5611 }
5612}
5613
Marat Dukhanefc47b82019-11-18 09:25:38 -08005614TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005615 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005616 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005617 DeconvolutionOperatorTester()
5618 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005619 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005620 .padding(1)
5621 .kernel_size(3, 3)
5622 .stride(2)
5623 .group_input_channels(15)
5624 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5625 .iterations(1)
5626 .TestF32();
5627 }
5628}
5629
Marat Dukhanefc47b82019-11-18 09:25:38 -08005630TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005631 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005632 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005633 DeconvolutionOperatorTester()
5634 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005635 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005636 .padding(1)
5637 .kernel_size(3, 3)
5638 .stride(2)
5639 .group_input_channels(15)
5640 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5641 .iterations(1)
5642 .TestF32();
5643 }
5644}
5645
Marat Dukhanefc47b82019-11-18 09:25:38 -08005646TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005647 ASSERT_EQ(xnn_status_success, xnn_initialize());
5648 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
5649 DeconvolutionOperatorTester()
5650 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005651 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005652 .padding(1)
5653 .kernel_size(3, 3)
5654 .stride(2)
5655 .group_input_channels(input_channels)
5656 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5657 .iterations(1)
5658 .TestF32();
5659 }
5660}
5661
Marat Dukhanefc47b82019-11-18 09:25:38 -08005662TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005663 ASSERT_EQ(xnn_status_success, xnn_initialize());
5664 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
5665 DeconvolutionOperatorTester()
5666 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005667 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005668 .padding(1)
5669 .kernel_size(3, 3)
5670 .stride(2)
5671 .group_input_channels(23)
5672 .group_output_channels(output_channels)
5673 .iterations(1)
5674 .TestF32();
5675 }
5676}
5677
Marat Dukhanefc47b82019-11-18 09:25:38 -08005678TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005679 ASSERT_EQ(xnn_status_success, xnn_initialize());
5680 DeconvolutionOperatorTester()
5681 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005682 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005683 .padding(1)
5684 .kernel_size(3, 3)
5685 .stride(2)
5686 .group_input_channels(23)
5687 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5688 .input_pixel_stride(28)
5689 .iterations(3)
5690 .TestF32();
5691}
5692
Marat Dukhanefc47b82019-11-18 09:25:38 -08005693TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005694 ASSERT_EQ(xnn_status_success, xnn_initialize());
5695 DeconvolutionOperatorTester()
5696 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005697 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005698 .padding(1)
5699 .kernel_size(3, 3)
5700 .stride(2)
5701 .group_input_channels(23)
5702 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5703 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
5704 .iterations(3)
5705 .TestF32();
5706}
5707
Marat Dukhanefc47b82019-11-18 09:25:38 -08005708TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005709 ASSERT_EQ(xnn_status_success, xnn_initialize());
5710 DeconvolutionOperatorTester()
5711 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005712 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005713 .padding(1)
5714 .kernel_size(3, 3)
5715 .stride(2)
5716 .group_input_channels(23)
5717 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5718 .qmin(128)
5719 .iterations(3)
5720 .TestF32();
5721}
5722
Marat Dukhanefc47b82019-11-18 09:25:38 -08005723TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005724 ASSERT_EQ(xnn_status_success, xnn_initialize());
5725 DeconvolutionOperatorTester()
5726 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005727 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005728 .padding(1)
5729 .kernel_size(3, 3)
5730 .stride(2)
5731 .group_input_channels(23)
5732 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005733 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005734 .iterations(3)
5735 .TestF32();
5736}
5737
Marat Dukhanefc47b82019-11-18 09:25:38 -08005738TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07005739 ASSERT_EQ(xnn_status_success, xnn_initialize());
5740 DeconvolutionOperatorTester()
5741 .has_bias(false)
5742 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005743 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005744 .padding(1)
5745 .kernel_size(3, 3)
5746 .stride(2)
5747 .group_input_channels(23)
5748 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5749 .iterations(3)
5750 .TestF32();
5751}
5752
XNNPACK Teamb455b122019-09-27 18:10:33 -07005753/**************************** SUBCONV2D path, grouped, batched ****************************/
5754
Marat Dukhanefc47b82019-11-18 09:25:38 -08005755TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005756 ASSERT_EQ(xnn_status_success, xnn_initialize());
5757 DeconvolutionOperatorTester()
5758 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005759 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005760 .padding(1)
5761 .kernel_size(3, 3)
5762 .stride(2)
5763 .groups(2)
5764 .group_input_channels(17)
5765 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5766 .iterations(3)
5767 .TestF32();
5768}
5769
Marat Dukhanefc47b82019-11-18 09:25:38 -08005770TEST(DECONVOLUTION_NHWC_F32, batched_grouped_Kx3s2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005771 ASSERT_EQ(xnn_status_success, xnn_initialize());
5772 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
5773 DeconvolutionOperatorTester()
5774 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005775 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005776 .padding_width(1)
5777 .kernel_size(kernel_height, 3)
5778 .stride(2)
5779 .groups(2)
5780 .group_input_channels(17)
5781 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5782 .iterations(3)
5783 .TestF32();
5784 }
5785}
5786
Marat Dukhanefc47b82019-11-18 09:25:38 -08005787TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3xKs2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005788 ASSERT_EQ(xnn_status_success, xnn_initialize());
5789 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
5790 DeconvolutionOperatorTester()
5791 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005792 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005793 .padding_height(1)
5794 .kernel_size(3, kernel_width)
5795 .stride(2)
5796 .groups(2)
5797 .group_input_channels(17)
5798 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5799 .iterations(3)
5800 .TestF32();
5801 }
5802}
5803
Marat Dukhanefc47b82019-11-18 09:25:38 -08005804TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3sSx1) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005805 ASSERT_EQ(xnn_status_success, xnn_initialize());
5806 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
5807 DeconvolutionOperatorTester()
5808 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005809 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005810 .padding(1)
5811 .padding_width(1)
5812 .kernel_size(3, 3)
5813 .stride_height(stride_height)
5814 .groups(2)
5815 .group_input_channels(17)
5816 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5817 .iterations(3)
5818 .TestF32();
5819 }
5820}
5821
Marat Dukhanefc47b82019-11-18 09:25:38 -08005822TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s1xS) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005823 ASSERT_EQ(xnn_status_success, xnn_initialize());
5824 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
5825 DeconvolutionOperatorTester()
5826 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005827 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005828 .padding(1)
5829 .padding_width(1)
5830 .kernel_size(3, 3)
5831 .stride_width(stride_width)
5832 .groups(2)
5833 .group_input_channels(17)
5834 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5835 .iterations(3)
5836 .TestF32();
5837 }
5838}
5839
Marat Dukhanefc47b82019-11-18 09:25:38 -08005840TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_height_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005841 ASSERT_EQ(xnn_status_success, xnn_initialize());
5842 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5843 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5844 DeconvolutionOperatorTester()
5845 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005846 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005847 .padding_width(1)
5848 .padding_top(padding_top)
5849 .padding_bottom(padding_bottom)
5850 .kernel_size(3, 3)
5851 .stride(2)
5852 .groups(2)
5853 .group_input_channels(17)
5854 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5855 .iterations(1)
5856 .TestF32();
5857 }
5858 }
5859}
5860
Marat Dukhanefc47b82019-11-18 09:25:38 -08005861TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_width_padding) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005862 ASSERT_EQ(xnn_status_success, xnn_initialize());
5863 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5864 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5865 DeconvolutionOperatorTester()
5866 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005867 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005868 .padding_height(1)
5869 .padding_left(padding_left)
5870 .padding_right(padding_right)
5871 .kernel_size(3, 3)
5872 .stride(2)
5873 .groups(2)
5874 .group_input_channels(17)
5875 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5876 .iterations(1)
5877 .TestF32();
5878 }
5879 }
5880}
5881
Marat Dukhanefc47b82019-11-18 09:25:38 -08005882TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_height_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005883 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005884 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005885 DeconvolutionOperatorTester()
5886 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005887 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005888 .padding(1)
5889 .adjustment_height(adjustment_height)
5890 .kernel_size(3, 3)
5891 .stride(2)
5892 .groups(2)
5893 .group_input_channels(17)
5894 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5895 .iterations(1)
5896 .TestF32();
5897 }
5898}
5899
Marat Dukhanefc47b82019-11-18 09:25:38 -08005900TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_width_adjustment) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005901 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhan1898b912019-11-05 12:25:18 -08005902 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005903 DeconvolutionOperatorTester()
5904 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005905 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005906 .padding(1)
5907 .adjustment_width(adjustment_width)
5908 .kernel_size(3, 3)
5909 .stride(2)
5910 .groups(2)
5911 .group_input_channels(17)
5912 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5913 .iterations(1)
5914 .TestF32();
5915 }
5916}
5917
Marat Dukhanefc47b82019-11-18 09:25:38 -08005918TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005919 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005920 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005921 DeconvolutionOperatorTester()
5922 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005923 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005924 .padding(1)
5925 .kernel_size(3, 3)
5926 .stride(2)
5927 .groups(2)
5928 .group_input_channels(17)
5929 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5930 .iterations(1)
5931 .TestF32();
5932 }
5933}
5934
Marat Dukhanefc47b82019-11-18 09:25:38 -08005935TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005936 ASSERT_EQ(xnn_status_success, xnn_initialize());
Marat Dukhana41533d2019-11-04 10:40:51 -08005937 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005938 DeconvolutionOperatorTester()
5939 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005940 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005941 .padding(1)
5942 .kernel_size(3, 3)
5943 .stride(2)
5944 .groups(2)
5945 .group_input_channels(17)
5946 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5947 .iterations(1)
5948 .TestF32();
5949 }
5950}
5951
Marat Dukhanefc47b82019-11-18 09:25:38 -08005952TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005953 ASSERT_EQ(xnn_status_success, xnn_initialize());
5954 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
5955 DeconvolutionOperatorTester()
5956 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005957 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005958 .padding(1)
5959 .kernel_size(3, 3)
5960 .stride(2)
5961 .groups(2)
5962 .group_input_channels(input_channels)
5963 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5964 .iterations(1)
5965 .TestF32();
5966 }
5967}
5968
Marat Dukhanefc47b82019-11-18 09:25:38 -08005969TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_output_channels) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005970 ASSERT_EQ(xnn_status_success, xnn_initialize());
5971 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
5972 DeconvolutionOperatorTester()
5973 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005974 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005975 .padding(1)
5976 .kernel_size(3, 3)
5977 .stride(2)
5978 .groups(2)
5979 .group_input_channels(17)
5980 .group_output_channels(output_channels)
5981 .iterations(1)
5982 .TestF32();
5983 }
5984}
5985
Marat Dukhanefc47b82019-11-18 09:25:38 -08005986TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_input_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005987 ASSERT_EQ(xnn_status_success, xnn_initialize());
5988 DeconvolutionOperatorTester()
5989 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005990 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005991 .padding(1)
5992 .kernel_size(3, 3)
5993 .stride(2)
5994 .groups(2)
5995 .group_input_channels(17)
5996 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
5997 .input_pixel_stride(37)
5998 .iterations(3)
5999 .TestF32();
6000}
6001
Marat Dukhanefc47b82019-11-18 09:25:38 -08006002TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_output_stride) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006003 ASSERT_EQ(xnn_status_success, xnn_initialize());
6004 DeconvolutionOperatorTester()
6005 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006006 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006007 .padding(1)
6008 .kernel_size(3, 3)
6009 .stride(2)
6010 .groups(2)
6011 .group_input_channels(17)
6012 .group_output_channels(xnn_params.f32.gemm.nr + 3)
6013 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
6014 .iterations(3)
6015 .TestF32();
6016}
6017
Marat Dukhanefc47b82019-11-18 09:25:38 -08006018TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_qmin) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006019 ASSERT_EQ(xnn_status_success, xnn_initialize());
6020 DeconvolutionOperatorTester()
6021 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006022 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006023 .padding(1)
6024 .kernel_size(3, 3)
6025 .stride(2)
6026 .groups(2)
6027 .group_input_channels(17)
6028 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
6029 .qmin(128)
6030 .iterations(3)
6031 .TestF32();
6032}
6033
Marat Dukhanefc47b82019-11-18 09:25:38 -08006034TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_qmax) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006035 ASSERT_EQ(xnn_status_success, xnn_initialize());
6036 DeconvolutionOperatorTester()
6037 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006038 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006039 .padding(1)
6040 .kernel_size(3, 3)
6041 .stride(2)
6042 .groups(2)
6043 .group_input_channels(17)
6044 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07006045 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006046 .iterations(3)
6047 .TestF32();
6048}
6049
Marat Dukhanefc47b82019-11-18 09:25:38 -08006050TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_without_bias) {
Marat Dukhanf568f082019-10-30 09:47:07 -07006051 ASSERT_EQ(xnn_status_success, xnn_initialize());
6052 DeconvolutionOperatorTester()
6053 .has_bias(false)
6054 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006055 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07006056 .padding(1)
6057 .kernel_size(3, 3)
6058 .stride(2)
6059 .groups(2)
6060 .group_input_channels(17)
6061 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
6062 .iterations(3)
6063 .TestF32();
6064}
6065
XNNPACK Teamb455b122019-09-27 18:10:33 -07006066/**************************** SUBCONV2D path, setup ****************************/
6067
Marat Dukhanefc47b82019-11-18 09:25:38 -08006068TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_batch) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006069 ASSERT_EQ(xnn_status_success, xnn_initialize());
6070 DeconvolutionOperatorTester()
6071 .batch_size(2)
6072 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08006073 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006074 .kernel_height(3)
6075 .kernel_width(5)
6076 .stride(2)
6077 .groups(2)
6078 .group_input_channels(15)
6079 .group_output_channels(17)
6080 .TestSetupF32();
6081}
6082
Marat Dukhanefc47b82019-11-18 09:25:38 -08006083TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_height) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006084 ASSERT_EQ(xnn_status_success, xnn_initialize());
6085 DeconvolutionOperatorTester()
6086 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006087 .input_size(kStridedInputHeight, kStridedInputWidth)
6088 .next_input_height(kStridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006089 .kernel_height(3)
6090 .kernel_width(5)
6091 .stride(2)
6092 .groups(2)
6093 .group_input_channels(15)
6094 .group_output_channels(17)
6095 .TestSetupF32();
6096}
6097
Marat Dukhanefc47b82019-11-18 09:25:38 -08006098TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_width) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006099 ASSERT_EQ(xnn_status_success, xnn_initialize());
6100 DeconvolutionOperatorTester()
6101 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006102 .input_size(kStridedInputHeight, kStridedInputWidth)
6103 .next_input_width(kStridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006104 .kernel_height(3)
6105 .kernel_width(5)
6106 .stride(2)
6107 .groups(2)
6108 .group_input_channels(15)
6109 .group_output_channels(17)
6110 .TestSetupF32();
6111}