blob: 42101f3989c10da8097d9c450bf2ed86f8f1e428 [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 Dukhanbea849a2021-07-30 16:25:30 -070021TEST(DECONVOLUTION_NHWC_QS8, 1x1) {
22 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
23 DeconvolutionOperatorTester()
24 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
25 .kernel_size(1, 1)
26 .group_input_channels(23)
27 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
28 .iterations(3)
29 .TestQS8();
30}
31
32TEST(DECONVOLUTION_NHWC_QS8, 1x1_varying_input_width) {
33 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
34 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
35 DeconvolutionOperatorTester()
36 .input_size(input_height, kUnstridedInputWidth)
37 .kernel_size(1, 1)
38 .group_input_channels(23)
39 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
40 .iterations(1)
41 .TestQS8();
42 }
43}
44
45TEST(DECONVOLUTION_NHWC_QS8, 1x1_varying_input_height) {
46 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
47 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
48 DeconvolutionOperatorTester()
49 .input_size(kUnstridedInputHeight, input_width)
50 .kernel_size(1, 1)
51 .group_input_channels(23)
52 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
53 .iterations(1)
54 .TestQS8();
55 }
56}
57
58TEST(DECONVOLUTION_NHWC_QS8, 1x1_varying_input_channels) {
59 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
60 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
61 DeconvolutionOperatorTester()
62 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
63 .kernel_size(1, 1)
64 .group_input_channels(input_channels)
65 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
66 .iterations(1)
67 .TestQS8();
68 }
69}
70
71TEST(DECONVOLUTION_NHWC_QS8, 1x1_varying_output_channels) {
72 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
73 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
74 DeconvolutionOperatorTester()
75 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
76 .kernel_size(1, 1)
77 .group_input_channels(23)
78 .group_output_channels(output_channels)
79 .iterations(1)
80 .TestQS8();
81 }
82}
83
84TEST(DECONVOLUTION_NHWC_QS8, 1x1_with_input_stride) {
85 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
86 DeconvolutionOperatorTester()
87 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
88 .kernel_size(1, 1)
89 .group_input_channels(23)
90 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
91 .input_pixel_stride(28)
92 .iterations(3)
93 .TestQS8();
94}
95
96TEST(DECONVOLUTION_NHWC_QS8, 1x1_with_output_stride) {
97 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
98 DeconvolutionOperatorTester()
99 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
100 .kernel_size(1, 1)
101 .group_input_channels(23)
102 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
103 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
104 .iterations(3)
105 .TestQS8();
106}
107
108TEST(DECONVOLUTION_NHWC_QS8, 1x1_with_qmin) {
109 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
110 DeconvolutionOperatorTester()
111 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
112 .kernel_size(1, 1)
113 .group_input_channels(23)
114 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
115 .qmin(128)
116 .iterations(3)
117 .TestQS8();
118}
119
120TEST(DECONVOLUTION_NHWC_QS8, 1x1_with_qmax) {
121 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
122 DeconvolutionOperatorTester()
123 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
124 .kernel_size(1, 1)
125 .group_input_channels(23)
126 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
127 .qmax(128)
128 .iterations(3)
129 .TestQS8();
130}
131
132TEST(DECONVOLUTION_NHWC_QS8, 1x1_without_bias) {
133 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
134 DeconvolutionOperatorTester()
135 .has_bias(false)
136 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
137 .kernel_size(1, 1)
138 .group_input_channels(23)
139 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
140 .iterations(3)
141 .TestQS8();
142}
143
144/**************************** Future GEMM path, grouped ****************************/
145
146TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1) {
147 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
148 DeconvolutionOperatorTester()
149 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
150 .kernel_size(1, 1)
151 .groups(2)
152 .group_input_channels(23)
153 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
154 .iterations(3)
155 .TestQS8();
156}
157
158TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_varying_input_width) {
159 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
160 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
161 DeconvolutionOperatorTester()
162 .input_size(input_height, kUnstridedInputWidth)
163 .kernel_size(1, 1)
164 .groups(2)
165 .group_input_channels(23)
166 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
167 .iterations(1)
168 .TestQS8();
169 }
170}
171
172TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_varying_input_height) {
173 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
174 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
175 DeconvolutionOperatorTester()
176 .input_size(kUnstridedInputHeight, input_width)
177 .kernel_size(1, 1)
178 .groups(2)
179 .group_input_channels(23)
180 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
181 .iterations(1)
182 .TestQS8();
183 }
184}
185
186TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_varying_input_channels) {
187 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
188 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
189 DeconvolutionOperatorTester()
190 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
191 .kernel_size(1, 1)
192 .groups(2)
193 .group_input_channels(input_channels)
194 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
195 .iterations(1)
196 .TestQS8();
197 }
198}
199
200TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_varying_output_channels) {
201 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
202 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
203 DeconvolutionOperatorTester()
204 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
205 .kernel_size(1, 1)
206 .groups(2)
207 .group_input_channels(23)
208 .group_output_channels(output_channels)
209 .iterations(1)
210 .TestQS8();
211 }
212}
213
214TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_with_input_stride) {
215 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
216 DeconvolutionOperatorTester()
217 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
218 .kernel_size(1, 1)
219 .groups(2)
220 .group_input_channels(23)
221 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
222 .input_pixel_stride(47)
223 .iterations(3)
224 .TestQS8();
225}
226
227TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_with_output_stride) {
228 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
229 DeconvolutionOperatorTester()
230 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
231 .kernel_size(1, 1)
232 .groups(2)
233 .group_input_channels(23)
234 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
235 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
236 .iterations(3)
237 .TestQS8();
238}
239
240TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_with_qmin) {
241 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
242 DeconvolutionOperatorTester()
243 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
244 .kernel_size(1, 1)
245 .groups(2)
246 .group_input_channels(23)
247 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
248 .qmin(128)
249 .iterations(3)
250 .TestQS8();
251}
252
253TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_with_qmax) {
254 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
255 DeconvolutionOperatorTester()
256 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
257 .kernel_size(1, 1)
258 .groups(2)
259 .group_input_channels(23)
260 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
261 .qmax(128)
262 .iterations(3)
263 .TestQS8();
264}
265
266TEST(DECONVOLUTION_NHWC_QS8, grouped_1x1_without_bias) {
267 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
268 DeconvolutionOperatorTester()
269 .has_bias(false)
270 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
271 .kernel_size(1, 1)
272 .groups(2)
273 .group_input_channels(23)
274 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
275 .iterations(3)
276 .TestQS8();
277}
278
279/**************************** Future GEMM path, batched ****************************/
280
281TEST(DECONVOLUTION_NHWC_QS8, batched_1x1) {
282 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
283 DeconvolutionOperatorTester()
284 .batch_size(2)
285 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
286 .kernel_size(1, 1)
287 .group_input_channels(23)
288 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
289 .iterations(3)
290 .TestQS8();
291}
292
293TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_varying_input_width) {
294 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
295 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
296 DeconvolutionOperatorTester()
297 .batch_size(2)
298 .input_size(input_height, kUnstridedInputWidth)
299 .kernel_size(1, 1)
300 .group_input_channels(23)
301 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
302 .iterations(1)
303 .TestQS8();
304 }
305}
306
307TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_varying_input_height) {
308 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
309 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
310 DeconvolutionOperatorTester()
311 .batch_size(2)
312 .input_size(kUnstridedInputHeight, input_width)
313 .kernel_size(1, 1)
314 .group_input_channels(23)
315 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
316 .iterations(1)
317 .TestQS8();
318 }
319}
320
321TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_varying_input_channels) {
322 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
323 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
324 DeconvolutionOperatorTester()
325 .batch_size(2)
326 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
327 .kernel_size(1, 1)
328 .group_input_channels(input_channels)
329 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
330 .iterations(1)
331 .TestQS8();
332 }
333}
334
335TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_varying_output_channels) {
336 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
337 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
338 DeconvolutionOperatorTester()
339 .batch_size(2)
340 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
341 .kernel_size(1, 1)
342 .group_input_channels(23)
343 .group_output_channels(output_channels)
344 .iterations(1)
345 .TestQS8();
346 }
347}
348
349TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_with_input_stride) {
350 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
351 DeconvolutionOperatorTester()
352 .batch_size(2)
353 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
354 .kernel_size(1, 1)
355 .group_input_channels(23)
356 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
357 .input_pixel_stride(28)
358 .iterations(3)
359 .TestQS8();
360}
361
362TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_with_output_stride) {
363 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
364 DeconvolutionOperatorTester()
365 .batch_size(2)
366 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
367 .kernel_size(1, 1)
368 .group_input_channels(23)
369 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
370 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
371 .iterations(3)
372 .TestQS8();
373}
374
375TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_with_qmin) {
376 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
377 DeconvolutionOperatorTester()
378 .batch_size(2)
379 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
380 .kernel_size(1, 1)
381 .group_input_channels(23)
382 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
383 .qmin(128)
384 .iterations(3)
385 .TestQS8();
386}
387
388TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_with_qmax) {
389 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
390 DeconvolutionOperatorTester()
391 .batch_size(2)
392 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
393 .kernel_size(1, 1)
394 .group_input_channels(23)
395 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
396 .qmax(128)
397 .iterations(3)
398 .TestQS8();
399}
400
401TEST(DECONVOLUTION_NHWC_QS8, batched_1x1_without_bias) {
402 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
403 DeconvolutionOperatorTester()
404 .has_bias(false)
405 .batch_size(2)
406 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
407 .kernel_size(1, 1)
408 .group_input_channels(23)
409 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
410 .iterations(3)
411 .TestQS8();
412}
413
414/**************************** Future GEMM path, batched, grouped ****************************/
415
416TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1) {
417 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
418 DeconvolutionOperatorTester()
419 .batch_size(2)
420 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
421 .kernel_size(1, 1)
422 .groups(2)
423 .group_input_channels(23)
424 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
425 .iterations(3)
426 .TestQS8();
427}
428
429TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_varying_input_width) {
430 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
431 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
432 DeconvolutionOperatorTester()
433 .batch_size(2)
434 .input_size(input_height, kUnstridedInputWidth)
435 .kernel_size(1, 1)
436 .groups(2)
437 .group_input_channels(23)
438 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
439 .iterations(1)
440 .TestQS8();
441 }
442}
443
444TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_varying_input_height) {
445 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
446 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
447 DeconvolutionOperatorTester()
448 .batch_size(2)
449 .input_size(kUnstridedInputHeight, input_width)
450 .kernel_size(1, 1)
451 .groups(2)
452 .group_input_channels(23)
453 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
454 .iterations(1)
455 .TestQS8();
456 }
457}
458
459TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_varying_input_channels) {
460 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
461 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
462 DeconvolutionOperatorTester()
463 .batch_size(2)
464 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
465 .kernel_size(1, 1)
466 .groups(2)
467 .group_input_channels(input_channels)
468 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
469 .iterations(1)
470 .TestQS8();
471 }
472}
473
474TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_varying_output_channels) {
475 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
476 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
477 DeconvolutionOperatorTester()
478 .batch_size(2)
479 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
480 .kernel_size(1, 1)
481 .groups(2)
482 .group_input_channels(23)
483 .group_output_channels(output_channels)
484 .iterations(1)
485 .TestQS8();
486 }
487}
488
489TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_with_input_stride) {
490 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
491 DeconvolutionOperatorTester()
492 .batch_size(2)
493 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
494 .kernel_size(1, 1)
495 .groups(2)
496 .group_input_channels(23)
497 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
498 .input_pixel_stride(47)
499 .iterations(3)
500 .TestQS8();
501}
502
503TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_with_output_stride) {
504 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
505 DeconvolutionOperatorTester()
506 .batch_size(2)
507 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
508 .kernel_size(1, 1)
509 .groups(2)
510 .group_input_channels(23)
511 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
512 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
513 .iterations(3)
514 .TestQS8();
515}
516
517TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_with_qmin) {
518 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
519 DeconvolutionOperatorTester()
520 .batch_size(2)
521 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
522 .kernel_size(1, 1)
523 .groups(2)
524 .group_input_channels(23)
525 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
526 .qmin(128)
527 .iterations(3)
528 .TestQS8();
529}
530
531TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_with_qmax) {
532 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
533 DeconvolutionOperatorTester()
534 .batch_size(2)
535 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
536 .kernel_size(1, 1)
537 .groups(2)
538 .group_input_channels(23)
539 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
540 .qmax(128)
541 .iterations(3)
542 .TestQS8();
543}
544
545TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_1x1_without_bias) {
546 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
547 DeconvolutionOperatorTester()
548 .has_bias(false)
549 .batch_size(2)
550 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
551 .kernel_size(1, 1)
552 .groups(2)
553 .group_input_channels(23)
554 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
555 .iterations(3)
556 .TestQS8();
557}
558
559/**************************** CONV path ****************************/
560
561TEST(DECONVOLUTION_NHWC_QS8, 3x3) {
562 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
563 DeconvolutionOperatorTester()
564 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
565 .padding(1)
566 .kernel_size(3, 3)
567 .group_input_channels(15)
568 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
569 .iterations(3)
570 .TestQS8();
571}
572
573TEST(DECONVOLUTION_NHWC_QS8, Kx3) {
574 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
575 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
576 DeconvolutionOperatorTester()
577 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
578 .padding_width(1)
579 .kernel_size(kernel_height, 3)
580 .group_input_channels(17)
581 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
582 .iterations(3)
583 .TestQS8();
584 }
585}
586
587TEST(DECONVOLUTION_NHWC_QS8, 3xK) {
588 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
589 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
590 DeconvolutionOperatorTester()
591 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
592 .padding_height(1)
593 .kernel_size(3, kernel_width)
594 .group_input_channels(17)
595 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
596 .iterations(3)
597 .TestQS8();
598 }
599}
600
601TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_height_padding) {
602 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
606 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
607 .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.qu8.gemm.nr * 2 + 3)
613 .iterations(1)
614 .TestQS8();
615 }
616 }
617}
618
619TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_width_padding) {
620 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
624 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
625 .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.qu8.gemm.nr * 2 + 3)
631 .iterations(1)
632 .TestQS8();
633 }
634 }
635}
636
637TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_height_adjustment) {
638 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
639 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
640 DeconvolutionOperatorTester()
641 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
642 .padding(1)
643 .stride_height(adjustment_height + 1)
644 .adjustment_height(adjustment_height)
645 .kernel_size(3, 3)
646 .group_input_channels(15)
647 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
648 .iterations(1)
649 .TestQS8();
650 }
651}
652
653TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_width_adjustment) {
654 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
655 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
656 DeconvolutionOperatorTester()
657 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
658 .padding(1)
659 .stride_width(adjustment_width + 1)
660 .adjustment_width(adjustment_width)
661 .kernel_size(3, 3)
662 .group_input_channels(15)
663 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
664 .iterations(1)
665 .TestQS8();
666 }
667}
668
669TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_input_height) {
670 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
671 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
672 DeconvolutionOperatorTester()
673 .input_size(input_height, kUnstridedInputWidth)
674 .padding(1)
675 .kernel_size(3, 3)
676 .group_input_channels(15)
677 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
678 .iterations(1)
679 .TestQS8();
680 }
681}
682
683TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_input_width) {
684 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
685 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
686 DeconvolutionOperatorTester()
687 .input_size(kUnstridedInputHeight, input_width)
688 .padding(1)
689 .kernel_size(3, 3)
690 .group_input_channels(15)
691 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
692 .iterations(1)
693 .TestQS8();
694 }
695}
696
Marat Dukhanbea849a2021-07-30 16:25:30 -0700697TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_input_channels) {
698 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
699 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
700 DeconvolutionOperatorTester()
701 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
702 .padding(1)
703 .kernel_size(3, 3)
704 .group_input_channels(input_channels)
705 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
706 .iterations(1)
707 .TestQS8();
708 }
709}
710
711TEST(DECONVOLUTION_NHWC_QS8, 3x3_varying_output_channels) {
712 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
713 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
714 DeconvolutionOperatorTester()
715 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
716 .padding(1)
717 .kernel_size(3, 3)
718 .group_input_channels(23)
719 .group_output_channels(output_channels)
720 .iterations(1)
721 .TestQS8();
722 }
723}
724
725TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_height_dilation) {
726 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
727 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
728 DeconvolutionOperatorTester()
729 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
730 .padding(1)
731 .kernel_size(3, 3)
732 .dilation_height(dilation_height)
733 .group_input_channels(23)
734 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
735 .iterations(3)
736 .TestQS8();
737 }
738}
739
740TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_width_dilation) {
741 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
742 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
743 DeconvolutionOperatorTester()
744 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
745 .padding(1)
746 .kernel_size(3, 3)
747 .dilation_width(dilation_width)
748 .group_input_channels(23)
749 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
750 .iterations(3)
751 .TestQS8();
752 }
753}
754
755TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_height_dilation_and_stride) {
756 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
757 DeconvolutionOperatorTester()
758 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
759 .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.qu8.gemm.nr * 2 + 3)
765 .iterations(3)
766 .TestQS8();
767}
768
769TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_width_dilation_and_stride) {
770 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
771 DeconvolutionOperatorTester()
772 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
773 .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.qu8.gemm.nr * 2 + 3)
779 .iterations(3)
780 .TestQS8();
781}
782
783TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_input_stride) {
784 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
785 DeconvolutionOperatorTester()
786 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
787 .padding(1)
788 .kernel_size(3, 3)
789 .group_input_channels(23)
790 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
791 .input_pixel_stride(28)
792 .iterations(3)
793 .TestQS8();
794}
795
796TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_output_stride) {
797 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
798 DeconvolutionOperatorTester()
799 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
800 .padding(1)
801 .kernel_size(3, 3)
802 .group_input_channels(23)
803 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
804 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
805 .iterations(3)
806 .TestQS8();
807}
808
809TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_qmin) {
810 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
811 DeconvolutionOperatorTester()
812 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
813 .padding(1)
814 .kernel_size(3, 3)
815 .group_input_channels(23)
816 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
817 .qmin(128)
818 .iterations(3)
819 .TestQS8();
820}
821
822TEST(DECONVOLUTION_NHWC_QS8, 3x3_with_qmax) {
823 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
824 DeconvolutionOperatorTester()
825 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
826 .padding(1)
827 .kernel_size(3, 3)
828 .group_input_channels(23)
829 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
830 .qmax(128)
831 .iterations(3)
832 .TestQS8();
833}
834
835TEST(DECONVOLUTION_NHWC_QS8, 3x3_without_bias) {
836 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
837 DeconvolutionOperatorTester()
838 .has_bias(false)
839 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
840 .padding(1)
841 .kernel_size(3, 3)
842 .group_input_channels(23)
843 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
844 .iterations(3)
845 .TestQS8();
846}
847
848/**************************** CONV path, grouped ****************************/
849
850TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3) {
851 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
852 DeconvolutionOperatorTester()
853 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
854 .padding(1)
855 .kernel_size(3, 3)
856 .groups(2)
857 .group_input_channels(15)
858 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
859 .iterations(3)
860 .TestQS8();
861}
862
863TEST(DECONVOLUTION_NHWC_QS8, grouped_Kx3) {
864 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
865 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
866 DeconvolutionOperatorTester()
867 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
868 .padding_width(1)
869 .kernel_size(kernel_height, 3)
870 .groups(2)
871 .group_input_channels(17)
872 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
873 .iterations(3)
874 .TestQS8();
875 }
876}
877
878TEST(DECONVOLUTION_NHWC_QS8, grouped_3xK) {
879 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
880 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
881 DeconvolutionOperatorTester()
882 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
883 .padding_height(1)
884 .kernel_size(3, kernel_width)
885 .groups(2)
886 .group_input_channels(17)
887 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
888 .iterations(3)
889 .TestQS8();
890 }
891}
892
893TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_height_padding) {
894 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
898 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
899 .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.qu8.gemm.nr * 2 + 3)
906 .iterations(1)
907 .TestQS8();
908 }
909 }
910}
911
912TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_width_padding) {
913 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
917 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
918 .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.qu8.gemm.nr * 2 + 3)
925 .iterations(1)
926 .TestQS8();
927 }
928 }
929}
930
931TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_height_adjustment) {
932 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
933 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
934 DeconvolutionOperatorTester()
935 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
936 .padding(1)
937 .stride_height(adjustment_height + 1)
938 .adjustment_height(adjustment_height)
939 .kernel_size(3, 3)
940 .groups(2)
941 .group_input_channels(15)
942 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
943 .iterations(1)
944 .TestQS8();
945 }
946}
947
948TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_width_adjustment) {
949 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
950 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
951 DeconvolutionOperatorTester()
952 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
953 .padding(1)
954 .stride_width(adjustment_width + 1)
955 .adjustment_width(adjustment_width)
956 .kernel_size(3, 3)
957 .groups(2)
958 .group_input_channels(15)
959 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
960 .iterations(1)
961 .TestQS8();
962 }
963}
964
965TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_input_height) {
966 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
967 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
968 DeconvolutionOperatorTester()
969 .input_size(input_height, kUnstridedInputWidth)
970 .padding(1)
971 .kernel_size(3, 3)
972 .groups(2)
973 .group_input_channels(15)
974 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
975 .iterations(1)
976 .TestQS8();
977 }
978}
979
980TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_input_width) {
981 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
982 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
983 DeconvolutionOperatorTester()
984 .input_size(kUnstridedInputHeight, input_width)
985 .padding(1)
986 .kernel_size(3, 3)
987 .groups(2)
988 .group_input_channels(15)
989 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
990 .iterations(1)
991 .TestQS8();
992 }
993}
994
Marat Dukhanbea849a2021-07-30 16:25:30 -0700995TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_input_channels) {
996 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
997 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
998 DeconvolutionOperatorTester()
999 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1000 .padding(1)
1001 .kernel_size(3, 3)
1002 .groups(2)
1003 .group_input_channels(input_channels)
1004 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1005 .iterations(1)
1006 .TestQS8();
1007 }
1008}
1009
1010TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_varying_output_channels) {
1011 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1012 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
1013 DeconvolutionOperatorTester()
1014 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1015 .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 .TestQS8();
1022 }
1023}
1024
1025TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_height_dilation) {
1026 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1027 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1028 DeconvolutionOperatorTester()
1029 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1030 .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.qu8.gemm.nr * 2 + 3)
1036 .iterations(3)
1037 .TestQS8();
1038 }
1039}
1040
1041TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_width_dilation) {
1042 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1043 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1044 DeconvolutionOperatorTester()
1045 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1046 .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.qu8.gemm.nr * 2 + 3)
1052 .iterations(3)
1053 .TestQS8();
1054 }
1055}
1056
1057TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_height_dilation_and_stride) {
1058 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1059 DeconvolutionOperatorTester()
1060 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1061 .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.qu8.gemm.nr * 2 + 3)
1068 .iterations(3)
1069 .TestQS8();
1070}
1071
1072TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_width_dilation_and_stride) {
1073 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1074 DeconvolutionOperatorTester()
1075 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1076 .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.qu8.gemm.nr * 2 + 3)
1083 .iterations(3)
1084 .TestQS8();
1085}
1086
1087TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_input_stride) {
1088 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1089 DeconvolutionOperatorTester()
1090 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1091 .padding(1)
1092 .kernel_size(3, 3)
1093 .groups(2)
1094 .group_input_channels(23)
1095 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1096 .input_pixel_stride(47)
1097 .iterations(3)
1098 .TestQS8();
1099}
1100
1101TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_output_stride) {
1102 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1103 DeconvolutionOperatorTester()
1104 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1105 .padding(1)
1106 .kernel_size(3, 3)
1107 .groups(2)
1108 .group_input_channels(23)
1109 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
1110 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
1111 .iterations(3)
1112 .TestQS8();
1113}
1114
1115TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_qmin) {
1116 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1117 DeconvolutionOperatorTester()
1118 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1119 .padding(1)
1120 .kernel_size(3, 3)
1121 .groups(2)
1122 .group_input_channels(23)
1123 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1124 .qmin(128)
1125 .iterations(3)
1126 .TestQS8();
1127}
1128
1129TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_with_qmax) {
1130 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1131 DeconvolutionOperatorTester()
1132 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1133 .padding(1)
1134 .kernel_size(3, 3)
1135 .groups(2)
1136 .group_input_channels(23)
1137 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1138 .qmax(128)
1139 .iterations(3)
1140 .TestQS8();
1141}
1142
1143TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3_without_bias) {
1144 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1145 DeconvolutionOperatorTester()
1146 .has_bias(false)
1147 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1148 .padding(1)
1149 .kernel_size(3, 3)
1150 .groups(2)
1151 .group_input_channels(23)
1152 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1153 .iterations(3)
1154 .TestQS8();
1155}
1156
1157/**************************** CONV path, batched ****************************/
1158
1159TEST(DECONVOLUTION_NHWC_QS8, batched_3x3) {
1160 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1161 DeconvolutionOperatorTester()
1162 .batch_size(2)
1163 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1164 .padding(1)
1165 .kernel_size(3, 3)
1166 .group_input_channels(15)
1167 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1168 .iterations(3)
1169 .TestQS8();
1170}
1171
1172TEST(DECONVOLUTION_NHWC_QS8, batched_Kx3) {
1173 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1174 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
1175 DeconvolutionOperatorTester()
1176 .batch_size(2)
1177 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1178 .padding_width(1)
1179 .kernel_size(kernel_height, 3)
1180 .group_input_channels(17)
1181 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1182 .iterations(3)
1183 .TestQS8();
1184 }
1185}
1186
1187TEST(DECONVOLUTION_NHWC_QS8, batched_3xK) {
1188 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1189 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
1190 DeconvolutionOperatorTester()
1191 .batch_size(2)
1192 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1193 .padding_height(1)
1194 .kernel_size(3, kernel_width)
1195 .group_input_channels(17)
1196 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1197 .iterations(3)
1198 .TestQS8();
1199 }
1200}
1201
1202TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_height_padding) {
1203 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
1208 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1209 .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.qu8.gemm.nr * 2 + 3)
1215 .iterations(1)
1216 .TestQS8();
1217 }
1218 }
1219}
1220
1221TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_width_padding) {
1222 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
1227 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1228 .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.qu8.gemm.nr * 2 + 3)
1234 .iterations(1)
1235 .TestQS8();
1236 }
1237 }
1238}
1239
1240TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_height_adjustment) {
1241 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1242 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
1243 DeconvolutionOperatorTester()
1244 .batch_size(2)
1245 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1246 .padding(1)
1247 .stride_height(adjustment_height + 1)
1248 .adjustment_height(adjustment_height)
1249 .kernel_size(3, 3)
1250 .group_input_channels(15)
1251 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1252 .iterations(1)
1253 .TestQS8();
1254 }
1255}
1256
1257TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_width_adjustment) {
1258 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1259 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
1260 DeconvolutionOperatorTester()
1261 .batch_size(2)
1262 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1263 .padding(1)
1264 .stride_width(adjustment_width + 1)
1265 .adjustment_width(adjustment_width)
1266 .kernel_size(3, 3)
1267 .group_input_channels(15)
1268 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1269 .iterations(1)
1270 .TestQS8();
1271 }
1272}
1273
1274TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_input_height) {
1275 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1276 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
1277 DeconvolutionOperatorTester()
1278 .batch_size(2)
1279 .input_size(input_height, kUnstridedInputWidth)
1280 .padding(1)
1281 .kernel_size(3, 3)
1282 .group_input_channels(15)
1283 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1284 .iterations(1)
1285 .TestQS8();
1286 }
1287}
1288
1289TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_input_width) {
1290 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1291 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
1292 DeconvolutionOperatorTester()
1293 .batch_size(2)
1294 .input_size(kUnstridedInputHeight, input_width)
1295 .padding(1)
1296 .kernel_size(3, 3)
1297 .group_input_channels(15)
1298 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1299 .iterations(1)
1300 .TestQS8();
1301 }
1302}
1303
Marat Dukhanbea849a2021-07-30 16:25:30 -07001304TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_input_channels) {
1305 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1306 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
1307 DeconvolutionOperatorTester()
1308 .batch_size(2)
1309 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1310 .padding(1)
1311 .kernel_size(3, 3)
1312 .group_input_channels(input_channels)
1313 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1314 .iterations(1)
1315 .TestQS8();
1316 }
1317}
1318
1319TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_varying_output_channels) {
1320 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1321 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
1322 DeconvolutionOperatorTester()
1323 .batch_size(2)
1324 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1325 .padding(1)
1326 .kernel_size(3, 3)
1327 .group_input_channels(23)
1328 .group_output_channels(output_channels)
1329 .iterations(1)
1330 .TestQS8();
1331 }
1332}
1333
1334TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_height_dilation) {
1335 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1336 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1337 DeconvolutionOperatorTester()
1338 .batch_size(2)
1339 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1340 .padding(1)
1341 .kernel_size(3, 3)
1342 .dilation_height(dilation_height)
1343 .group_input_channels(23)
1344 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1345 .iterations(3)
1346 .TestQS8();
1347 }
1348}
1349
1350TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_width_dilation) {
1351 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1352 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1353 DeconvolutionOperatorTester()
1354 .batch_size(2)
1355 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1356 .padding(1)
1357 .kernel_size(3, 3)
1358 .dilation_width(dilation_width)
1359 .group_input_channels(23)
1360 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1361 .iterations(3)
1362 .TestQS8();
1363 }
1364}
1365
1366TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_height_dilation_and_stride) {
1367 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1368 DeconvolutionOperatorTester()
1369 .batch_size(2)
1370 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1371 .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.qu8.gemm.nr * 2 + 3)
1377 .iterations(3)
1378 .TestQS8();
1379}
1380
1381TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_width_dilation_and_stride) {
1382 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1383 DeconvolutionOperatorTester()
1384 .batch_size(2)
1385 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1386 .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.qu8.gemm.nr * 2 + 3)
1392 .iterations(3)
1393 .TestQS8();
1394}
1395
1396TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_input_stride) {
1397 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1398 DeconvolutionOperatorTester()
1399 .batch_size(2)
1400 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1401 .padding(1)
1402 .kernel_size(3, 3)
1403 .group_input_channels(23)
1404 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1405 .input_pixel_stride(28)
1406 .iterations(3)
1407 .TestQS8();
1408}
1409
1410TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_output_stride) {
1411 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1412 DeconvolutionOperatorTester()
1413 .batch_size(2)
1414 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1415 .padding(1)
1416 .kernel_size(3, 3)
1417 .group_input_channels(23)
1418 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1419 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
1420 .iterations(3)
1421 .TestQS8();
1422}
1423
1424TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_qmin) {
1425 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1426 DeconvolutionOperatorTester()
1427 .batch_size(2)
1428 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1429 .padding(1)
1430 .kernel_size(3, 3)
1431 .group_input_channels(23)
1432 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1433 .qmin(128)
1434 .iterations(3)
1435 .TestQS8();
1436}
1437
1438TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_with_qmax) {
1439 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1440 DeconvolutionOperatorTester()
1441 .batch_size(2)
1442 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1443 .padding(1)
1444 .kernel_size(3, 3)
1445 .group_input_channels(23)
1446 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1447 .qmax(128)
1448 .iterations(3)
1449 .TestQS8();
1450}
1451
1452TEST(DECONVOLUTION_NHWC_QS8, batched_3x3_without_bias) {
1453 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1454 DeconvolutionOperatorTester()
1455 .has_bias(false)
1456 .batch_size(2)
1457 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1458 .padding(1)
1459 .kernel_size(3, 3)
1460 .group_input_channels(23)
1461 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1462 .iterations(3)
1463 .TestQS8();
1464}
1465
1466/**************************** CONV path, grouped, batched ****************************/
1467
1468TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3) {
1469 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1470 DeconvolutionOperatorTester()
1471 .batch_size(2)
1472 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1473 .padding(1)
1474 .kernel_size(3, 3)
1475 .groups(2)
1476 .group_input_channels(15)
1477 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1478 .iterations(3)
1479 .TestQS8();
1480}
1481
1482TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_Kx3) {
1483 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1484 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
1485 DeconvolutionOperatorTester()
1486 .batch_size(2)
1487 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1488 .padding_width(1)
1489 .kernel_size(kernel_height, 3)
1490 .groups(2)
1491 .group_input_channels(17)
1492 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1493 .iterations(3)
1494 .TestQS8();
1495 }
1496}
1497
1498TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3xK) {
1499 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1500 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
1501 DeconvolutionOperatorTester()
1502 .batch_size(2)
1503 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1504 .padding_height(1)
1505 .kernel_size(3, kernel_width)
1506 .groups(2)
1507 .group_input_channels(17)
1508 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1509 .iterations(3)
1510 .TestQS8();
1511 }
1512}
1513
1514TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_height_padding) {
1515 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
1520 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1521 .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.qu8.gemm.nr * 2 + 3)
1528 .iterations(1)
1529 .TestQS8();
1530 }
1531 }
1532}
1533
1534TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_width_padding) {
1535 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
1540 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1541 .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.qu8.gemm.nr * 2 + 3)
1548 .iterations(1)
1549 .TestQS8();
1550 }
1551 }
1552}
1553
1554TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_height_adjustment) {
1555 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1556 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
1557 DeconvolutionOperatorTester()
1558 .batch_size(2)
1559 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1560 .padding(1)
1561 .stride_height(adjustment_height + 1)
1562 .adjustment_height(adjustment_height)
1563 .kernel_size(3, 3)
1564 .groups(2)
1565 .group_input_channels(15)
1566 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1567 .iterations(1)
1568 .TestQS8();
1569 }
1570}
1571
1572TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_width_adjustment) {
1573 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1574 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
1575 DeconvolutionOperatorTester()
1576 .batch_size(2)
1577 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1578 .padding(1)
1579 .stride_width(adjustment_width + 1)
1580 .adjustment_width(adjustment_width)
1581 .kernel_size(3, 3)
1582 .groups(2)
1583 .group_input_channels(15)
1584 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1585 .iterations(1)
1586 .TestQS8();
1587 }
1588}
1589
1590TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_input_height) {
1591 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1592 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
1593 DeconvolutionOperatorTester()
1594 .batch_size(2)
1595 .input_size(input_height, kUnstridedInputWidth)
1596 .padding(1)
1597 .kernel_size(3, 3)
1598 .groups(2)
1599 .group_input_channels(15)
1600 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1601 .iterations(1)
1602 .TestQS8();
1603 }
1604}
1605
1606TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_input_width) {
1607 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1608 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
1609 DeconvolutionOperatorTester()
1610 .batch_size(2)
1611 .input_size(kUnstridedInputHeight, input_width)
1612 .padding(1)
1613 .kernel_size(3, 3)
1614 .groups(2)
1615 .group_input_channels(15)
1616 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1617 .iterations(1)
1618 .TestQS8();
1619 }
1620}
1621
Marat Dukhanbea849a2021-07-30 16:25:30 -07001622TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_input_channels) {
1623 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1624 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
1625 DeconvolutionOperatorTester()
1626 .batch_size(2)
1627 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1628 .padding(1)
1629 .kernel_size(3, 3)
1630 .groups(2)
1631 .group_input_channels(input_channels)
1632 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1633 .iterations(1)
1634 .TestQS8();
1635 }
1636}
1637
1638TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_varying_output_channels) {
1639 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1640 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
1641 DeconvolutionOperatorTester()
1642 .batch_size(2)
1643 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1644 .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 .TestQS8();
1651 }
1652}
1653
1654TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_height_dilation) {
1655 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1656 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
1657 DeconvolutionOperatorTester()
1658 .batch_size(2)
1659 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1660 .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.qu8.gemm.nr * 2 + 3)
1666 .iterations(3)
1667 .TestQS8();
1668 }
1669}
1670
1671TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_width_dilation) {
1672 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1673 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
1674 DeconvolutionOperatorTester()
1675 .batch_size(2)
1676 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1677 .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.qu8.gemm.nr * 2 + 3)
1683 .iterations(3)
1684 .TestQS8();
1685 }
1686}
1687
1688TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_height_dilation_and_stride) {
1689 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1690 DeconvolutionOperatorTester()
1691 .batch_size(2)
1692 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1693 .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.qu8.gemm.nr * 2 + 3)
1700 .iterations(3)
1701 .TestQS8();
1702}
1703
1704TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_width_dilation_and_stride) {
1705 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1706 DeconvolutionOperatorTester()
1707 .batch_size(2)
1708 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1709 .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.qu8.gemm.nr * 2 + 3)
1716 .iterations(3)
1717 .TestQS8();
1718}
1719
1720TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_input_stride) {
1721 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1722 DeconvolutionOperatorTester()
1723 .batch_size(2)
1724 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1725 .padding(1)
1726 .kernel_size(3, 3)
1727 .groups(2)
1728 .group_input_channels(23)
1729 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1730 .input_pixel_stride(47)
1731 .iterations(3)
1732 .TestQS8();
1733}
1734
1735TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_output_stride) {
1736 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1737 DeconvolutionOperatorTester()
1738 .batch_size(2)
1739 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1740 .padding(1)
1741 .kernel_size(3, 3)
1742 .groups(2)
1743 .group_input_channels(23)
1744 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
1745 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
1746 .iterations(3)
1747 .TestQS8();
1748}
1749
1750TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_qmin) {
1751 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1752 DeconvolutionOperatorTester()
1753 .batch_size(2)
1754 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1755 .padding(1)
1756 .kernel_size(3, 3)
1757 .groups(2)
1758 .group_input_channels(23)
1759 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1760 .qmin(128)
1761 .iterations(3)
1762 .TestQS8();
1763}
1764
1765TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_with_qmax) {
1766 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1767 DeconvolutionOperatorTester()
1768 .batch_size(2)
1769 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1770 .padding(1)
1771 .kernel_size(3, 3)
1772 .groups(2)
1773 .group_input_channels(23)
1774 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1775 .qmax(128)
1776 .iterations(3)
1777 .TestQS8();
1778}
1779
1780TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3_without_bias) {
1781 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1782 DeconvolutionOperatorTester()
1783 .has_bias(false)
1784 .batch_size(2)
1785 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1786 .padding(1)
1787 .kernel_size(3, 3)
1788 .groups(2)
1789 .group_input_channels(23)
1790 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1791 .iterations(3)
1792 .TestQS8();
1793}
1794
1795/**************************** CONV path, setup ****************************/
1796
1797TEST(DECONVOLUTION_NHWC_QS8, 3x3_setup_changing_batch) {
1798 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1799 DeconvolutionOperatorTester()
1800 .batch_size(2)
1801 .next_batch_size(5)
1802 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1803 .kernel_height(3)
1804 .kernel_width(5)
1805 .groups(2)
1806 .group_input_channels(15)
1807 .group_output_channels(17)
1808 .TestSetupQS8();
1809}
1810
1811TEST(DECONVOLUTION_NHWC_QS8, 3x3_setup_changing_height) {
1812 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1813 DeconvolutionOperatorTester()
1814 .batch_size(2)
1815 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1816 .next_input_height(kUnstridedInputHeight + 3)
1817 .kernel_height(3)
1818 .kernel_width(5)
1819 .groups(2)
1820 .group_input_channels(15)
1821 .group_output_channels(17)
1822 .TestSetupQS8();
1823}
1824
1825TEST(DECONVOLUTION_NHWC_QS8, 3x3_setup_changing_width) {
1826 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1827 DeconvolutionOperatorTester()
1828 .batch_size(2)
1829 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
1830 .next_input_width(kUnstridedInputWidth + 3)
1831 .kernel_height(3)
1832 .kernel_width(5)
1833 .groups(2)
1834 .group_input_channels(15)
1835 .group_output_channels(17)
1836 .TestSetupQS8();
1837}
1838
1839/**************************** SUBCONV2D/IGEMM path ****************************/
1840
1841TEST(DECONVOLUTION_NHWC_QS8, 3x3s2) {
1842 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1843 DeconvolutionOperatorTester()
1844 .input_size(kStridedInputHeight, kStridedInputWidth)
1845 .padding(1)
1846 .kernel_size(3, 3)
1847 .stride(2)
1848 .group_input_channels(15)
1849 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1850 .iterations(3)
1851 .TestQS8();
1852}
1853
1854TEST(DECONVOLUTION_NHWC_QS8, Kx3s2) {
1855 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1856 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
1857 DeconvolutionOperatorTester()
1858 .input_size(kStridedInputHeight, kStridedInputWidth)
1859 .padding_width(1)
1860 .kernel_size(kernel_height, 3)
1861 .stride(2)
1862 .group_input_channels(17)
1863 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1864 .iterations(3)
1865 .TestQS8();
1866 }
1867}
1868
1869TEST(DECONVOLUTION_NHWC_QS8, 3xKs2) {
1870 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1871 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
1872 DeconvolutionOperatorTester()
1873 .input_size(kStridedInputHeight, kStridedInputWidth)
1874 .padding_height(1)
1875 .kernel_size(3, kernel_width)
1876 .stride(2)
1877 .group_input_channels(17)
1878 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1879 .iterations(3)
1880 .TestQS8();
1881 }
1882}
1883
1884TEST(DECONVOLUTION_NHWC_QS8, 3x3sSx1) {
1885 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1886 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
1887 DeconvolutionOperatorTester()
1888 .input_size(kStridedInputHeight, kStridedInputWidth)
1889 .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.qu8.gemm.nr * 2 + 3)
1895 .iterations(3)
1896 .TestQS8();
1897 }
1898}
1899
1900TEST(DECONVOLUTION_NHWC_QS8, 3x3s1xS) {
1901 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1902 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
1903 DeconvolutionOperatorTester()
1904 .input_size(kStridedInputHeight, kStridedInputWidth)
1905 .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.qu8.gemm.nr * 2 + 3)
1911 .iterations(3)
1912 .TestQS8();
1913 }
1914}
1915
1916TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_height_padding) {
1917 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
1921 .input_size(kStridedInputHeight, kStridedInputWidth)
1922 .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.qu8.gemm.nr * 2 + 3)
1929 .iterations(1)
1930 .TestQS8();
1931 }
1932 }
1933}
1934
1935TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_width_padding) {
1936 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
1940 .input_size(kStridedInputHeight, kStridedInputWidth)
1941 .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.qu8.gemm.nr * 2 + 3)
1948 .iterations(1)
1949 .TestQS8();
1950 }
1951 }
1952}
1953
1954TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_height_adjustment) {
1955 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1956 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
1957 DeconvolutionOperatorTester()
1958 .input_size(kStridedInputHeight, kStridedInputWidth)
1959 .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.qu8.gemm.nr * 2 + 3)
1965 .iterations(1)
1966 .TestQS8();
1967 }
1968}
1969
1970TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_width_adjustment) {
1971 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1972 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
1973 DeconvolutionOperatorTester()
1974 .input_size(kStridedInputHeight, kStridedInputWidth)
1975 .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.qu8.gemm.nr * 2 + 3)
1981 .iterations(1)
1982 .TestQS8();
1983 }
1984}
1985
1986TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_input_height) {
1987 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1988 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
1989 DeconvolutionOperatorTester()
1990 .input_size(input_height, kStridedInputWidth)
1991 .padding(1)
1992 .kernel_size(3, 3)
1993 .stride(2)
1994 .group_input_channels(15)
1995 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
1996 .iterations(1)
1997 .TestQS8();
1998 }
1999}
2000
2001TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_input_width) {
2002 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2003 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
2004 DeconvolutionOperatorTester()
2005 .input_size(kStridedInputHeight, kStridedInputWidth)
2006 .padding(1)
2007 .kernel_size(3, 3)
2008 .stride(2)
2009 .group_input_channels(15)
2010 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2011 .iterations(1)
2012 .TestQS8();
2013 }
2014}
2015
Marat Dukhanbea849a2021-07-30 16:25:30 -07002016TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_input_channels) {
2017 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2018 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
2019 DeconvolutionOperatorTester()
2020 .input_size(kStridedInputHeight, kStridedInputWidth)
2021 .padding(1)
2022 .kernel_size(3, 3)
2023 .stride(2)
2024 .group_input_channels(input_channels)
2025 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2026 .iterations(1)
2027 .TestQS8();
2028 }
2029}
2030
2031TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_varying_output_channels) {
2032 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2033 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
2034 DeconvolutionOperatorTester()
2035 .input_size(kStridedInputHeight, kStridedInputWidth)
2036 .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 .TestQS8();
2043 }
2044}
2045
2046TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_with_input_stride) {
2047 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2048 DeconvolutionOperatorTester()
2049 .input_size(kStridedInputHeight, kStridedInputWidth)
2050 .padding(1)
2051 .kernel_size(3, 3)
2052 .stride(2)
2053 .group_input_channels(23)
2054 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2055 .input_pixel_stride(28)
2056 .iterations(3)
2057 .TestQS8();
2058}
2059
2060TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_with_output_stride) {
2061 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2062 DeconvolutionOperatorTester()
2063 .input_size(kStridedInputHeight, kStridedInputWidth)
2064 .padding(1)
2065 .kernel_size(3, 3)
2066 .stride(2)
2067 .group_input_channels(23)
2068 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2069 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
2070 .iterations(3)
2071 .TestQS8();
2072}
2073
2074TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_with_qmin) {
2075 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2076 DeconvolutionOperatorTester()
2077 .input_size(kStridedInputHeight, kStridedInputWidth)
2078 .padding(1)
2079 .kernel_size(3, 3)
2080 .stride(2)
2081 .group_input_channels(23)
2082 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2083 .qmin(128)
2084 .iterations(3)
2085 .TestQS8();
2086}
2087
2088TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_with_qmax) {
2089 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2090 DeconvolutionOperatorTester()
2091 .input_size(kStridedInputHeight, kStridedInputWidth)
2092 .padding(1)
2093 .kernel_size(3, 3)
2094 .stride(2)
2095 .group_input_channels(23)
2096 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2097 .qmax(128)
2098 .iterations(3)
2099 .TestQS8();
2100}
2101
2102TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_without_bias) {
2103 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2104 DeconvolutionOperatorTester()
2105 .has_bias(false)
2106 .input_size(kStridedInputHeight, kStridedInputWidth)
2107 .padding(1)
2108 .kernel_size(3, 3)
2109 .stride(2)
2110 .group_input_channels(23)
2111 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2112 .iterations(3)
2113 .TestQS8();
2114}
2115
2116/**************************** SUBCONV2D/IGEMM path, grouped ****************************/
2117
2118TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2) {
2119 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2120 DeconvolutionOperatorTester()
2121 .input_size(kStridedInputHeight, kStridedInputWidth)
2122 .padding(1)
2123 .kernel_size(3, 3)
2124 .stride(2)
2125 .groups(2)
2126 .group_input_channels(17)
2127 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2128 .iterations(3)
2129 .TestQS8();
2130}
2131
2132TEST(DECONVOLUTION_NHWC_QS8, grouped_Kx3s2) {
2133 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2134 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2135 DeconvolutionOperatorTester()
2136 .input_size(kStridedInputHeight, kStridedInputWidth)
2137 .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.qu8.gemm.nr * 2 + 3)
2143 .iterations(3)
2144 .TestQS8();
2145 }
2146}
2147
2148TEST(DECONVOLUTION_NHWC_QS8, grouped_3xKs2) {
2149 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2150 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2151 DeconvolutionOperatorTester()
2152 .input_size(kStridedInputHeight, kStridedInputWidth)
2153 .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.qu8.gemm.nr * 2 + 3)
2159 .iterations(3)
2160 .TestQS8();
2161 }
2162}
2163
2164TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3sSx1) {
2165 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2166 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2167 DeconvolutionOperatorTester()
2168 .input_size(kStridedInputHeight, kStridedInputWidth)
2169 .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.qu8.gemm.nr * 2 + 3)
2176 .iterations(3)
2177 .TestQS8();
2178 }
2179}
2180
2181TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s1xS) {
2182 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2183 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2184 DeconvolutionOperatorTester()
2185 .input_size(kStridedInputHeight, kStridedInputWidth)
2186 .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.qu8.gemm.nr * 2 + 3)
2193 .iterations(3)
2194 .TestQS8();
2195 }
2196}
2197
2198TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_height_padding) {
2199 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
2203 .input_size(kStridedInputHeight, kStridedInputWidth)
2204 .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.qu8.gemm.nr * 2 + 3)
2212 .iterations(1)
2213 .TestQS8();
2214 }
2215 }
2216}
2217
2218TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_width_padding) {
2219 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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()
2223 .input_size(kStridedInputHeight, kStridedInputWidth)
2224 .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.qu8.gemm.nr * 2 + 3)
2232 .iterations(1)
2233 .TestQS8();
2234 }
2235 }
2236}
2237
2238TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_height_adjustment) {
2239 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2240 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
2241 DeconvolutionOperatorTester()
2242 .input_size(kStridedInputHeight, kStridedInputWidth)
2243 .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.qu8.gemm.nr * 2 + 3)
2250 .iterations(1)
2251 .TestQS8();
2252 }
2253}
2254
2255TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_width_adjustment) {
2256 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2257 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
2258 DeconvolutionOperatorTester()
2259 .input_size(kStridedInputHeight, kStridedInputWidth)
2260 .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.qu8.gemm.nr * 2 + 3)
2267 .iterations(1)
2268 .TestQS8();
2269 }
2270}
2271
2272TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_input_height) {
2273 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2274 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
2275 DeconvolutionOperatorTester()
2276 .input_size(input_height, kStridedInputWidth)
2277 .padding(1)
2278 .kernel_size(3, 3)
2279 .stride(2)
2280 .groups(2)
2281 .group_input_channels(17)
2282 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2283 .iterations(1)
2284 .TestQS8();
2285 }
2286}
2287
2288TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_input_width) {
2289 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2290 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
2291 DeconvolutionOperatorTester()
2292 .input_size(kStridedInputHeight, kStridedInputWidth)
2293 .padding(1)
2294 .kernel_size(3, 3)
2295 .stride(2)
2296 .groups(2)
2297 .group_input_channels(17)
2298 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2299 .iterations(1)
2300 .TestQS8();
2301 }
2302}
2303
Marat Dukhanbea849a2021-07-30 16:25:30 -07002304TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_input_channels) {
2305 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2306 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
2307 DeconvolutionOperatorTester()
2308 .input_size(kStridedInputHeight, kStridedInputWidth)
2309 .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.qu8.gemm.nr * 2 + 3)
2315 .iterations(1)
2316 .TestQS8();
2317 }
2318}
2319
2320TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_varying_output_channels) {
2321 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2322 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
2323 DeconvolutionOperatorTester()
2324 .input_size(kStridedInputHeight, kStridedInputWidth)
2325 .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 .TestQS8();
2333 }
2334}
2335
2336TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_with_input_stride) {
2337 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2338 DeconvolutionOperatorTester()
2339 .input_size(kStridedInputHeight, kStridedInputWidth)
2340 .padding(1)
2341 .kernel_size(3, 3)
2342 .stride(2)
2343 .groups(2)
2344 .group_input_channels(17)
2345 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2346 .input_pixel_stride(37)
2347 .iterations(3)
2348 .TestQS8();
2349}
2350
2351TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_with_output_stride) {
2352 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2353 DeconvolutionOperatorTester()
2354 .input_size(kStridedInputHeight, kStridedInputWidth)
2355 .padding(1)
2356 .kernel_size(3, 3)
2357 .stride(2)
2358 .groups(2)
2359 .group_input_channels(17)
2360 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
2361 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
2362 .iterations(3)
2363 .TestQS8();
2364}
2365
2366TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_with_qmin) {
2367 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2368 DeconvolutionOperatorTester()
2369 .input_size(kStridedInputHeight, kStridedInputWidth)
2370 .padding(1)
2371 .kernel_size(3, 3)
2372 .stride(2)
2373 .groups(2)
2374 .group_input_channels(17)
2375 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2376 .qmin(128)
2377 .iterations(3)
2378 .TestQS8();
2379}
2380
2381TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_with_qmax) {
2382 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2383 DeconvolutionOperatorTester()
2384 .input_size(kStridedInputHeight, kStridedInputWidth)
2385 .padding(1)
2386 .kernel_size(3, 3)
2387 .stride(2)
2388 .groups(2)
2389 .group_input_channels(17)
2390 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2391 .qmax(128)
2392 .iterations(3)
2393 .TestQS8();
2394}
2395
2396TEST(DECONVOLUTION_NHWC_QS8, grouped_3x3s2_without_bias) {
2397 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2398 DeconvolutionOperatorTester()
2399 .has_bias(false)
2400 .input_size(kStridedInputHeight, kStridedInputWidth)
2401 .padding(1)
2402 .kernel_size(3, 3)
2403 .stride(2)
2404 .groups(2)
2405 .group_input_channels(17)
2406 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2407 .iterations(3)
2408 .TestQS8();
2409}
2410
2411/**************************** SUBCONV2D/IGEMM path, batched ****************************/
2412
2413TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2) {
2414 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2415 DeconvolutionOperatorTester()
2416 .batch_size(2)
2417 .input_size(kStridedInputHeight, kStridedInputWidth)
2418 .padding(1)
2419 .kernel_size(3, 3)
2420 .stride(2)
2421 .group_input_channels(15)
2422 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2423 .iterations(3)
2424 .TestQS8();
2425}
2426
2427TEST(DECONVOLUTION_NHWC_QS8, batched_Kx3s2) {
2428 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2429 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2430 DeconvolutionOperatorTester()
2431 .batch_size(2)
2432 .input_size(kStridedInputHeight, kStridedInputWidth)
2433 .padding_width(1)
2434 .kernel_size(kernel_height, 3)
2435 .stride(2)
2436 .group_input_channels(17)
2437 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2438 .iterations(3)
2439 .TestQS8();
2440 }
2441}
2442
2443TEST(DECONVOLUTION_NHWC_QS8, batched_3xKs2) {
2444 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2445 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2446 DeconvolutionOperatorTester()
2447 .batch_size(2)
2448 .input_size(kStridedInputHeight, kStridedInputWidth)
2449 .padding_height(1)
2450 .kernel_size(3, kernel_width)
2451 .stride(2)
2452 .group_input_channels(17)
2453 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2454 .iterations(3)
2455 .TestQS8();
2456 }
2457}
2458
2459TEST(DECONVOLUTION_NHWC_QS8, batched_3x3sSx1) {
2460 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2461 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2462 DeconvolutionOperatorTester()
2463 .batch_size(2)
2464 .input_size(kStridedInputHeight, kStridedInputWidth)
2465 .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.qu8.gemm.nr * 2 + 3)
2471 .iterations(3)
2472 .TestQS8();
2473 }
2474}
2475
2476TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s1xS) {
2477 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2478 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2479 DeconvolutionOperatorTester()
2480 .batch_size(2)
2481 .input_size(kStridedInputHeight, kStridedInputWidth)
2482 .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.qu8.gemm.nr * 2 + 3)
2488 .iterations(3)
2489 .TestQS8();
2490 }
2491}
2492
2493TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_height_padding) {
2494 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
2499 .input_size(kStridedInputHeight, kStridedInputWidth)
2500 .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.qu8.gemm.nr * 2 + 3)
2507 .iterations(1)
2508 .TestQS8();
2509 }
2510 }
2511}
2512
2513TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_width_padding) {
2514 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
2519 .input_size(kStridedInputHeight, kStridedInputWidth)
2520 .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.qu8.gemm.nr * 2 + 3)
2527 .iterations(1)
2528 .TestQS8();
2529 }
2530 }
2531}
2532
2533TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_height_adjustment) {
2534 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2535 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
2536 DeconvolutionOperatorTester()
2537 .batch_size(2)
2538 .input_size(kStridedInputHeight, kStridedInputWidth)
2539 .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.qu8.gemm.nr * 2 + 3)
2545 .iterations(1)
2546 .TestQS8();
2547 }
2548}
2549
2550TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_width_adjustment) {
2551 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2552 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
2553 DeconvolutionOperatorTester()
2554 .batch_size(2)
2555 .input_size(kStridedInputHeight, kStridedInputWidth)
2556 .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.qu8.gemm.nr * 2 + 3)
2562 .iterations(1)
2563 .TestQS8();
2564 }
2565}
2566
2567TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_input_height) {
2568 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2569 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
2570 DeconvolutionOperatorTester()
2571 .batch_size(2)
2572 .input_size(input_height, kStridedInputWidth)
2573 .padding(1)
2574 .kernel_size(3, 3)
2575 .stride(2)
2576 .group_input_channels(15)
2577 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2578 .iterations(1)
2579 .TestQS8();
2580 }
2581}
2582
2583TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_input_width) {
2584 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2585 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
2586 DeconvolutionOperatorTester()
2587 .batch_size(2)
2588 .input_size(kStridedInputHeight, kStridedInputWidth)
2589 .padding(1)
2590 .kernel_size(3, 3)
2591 .stride(2)
2592 .group_input_channels(15)
2593 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2594 .iterations(1)
2595 .TestQS8();
2596 }
2597}
2598
Marat Dukhanbea849a2021-07-30 16:25:30 -07002599TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_input_channels) {
2600 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2601 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
2602 DeconvolutionOperatorTester()
2603 .batch_size(2)
2604 .input_size(kStridedInputHeight, kStridedInputWidth)
2605 .padding(1)
2606 .kernel_size(3, 3)
2607 .stride(2)
2608 .group_input_channels(input_channels)
2609 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2610 .iterations(1)
2611 .TestQS8();
2612 }
2613}
2614
2615TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_varying_output_channels) {
2616 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2617 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
2618 DeconvolutionOperatorTester()
2619 .batch_size(2)
2620 .input_size(kStridedInputHeight, kStridedInputWidth)
2621 .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 .TestQS8();
2628 }
2629}
2630
2631TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_with_input_stride) {
2632 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2633 DeconvolutionOperatorTester()
2634 .batch_size(2)
2635 .input_size(kStridedInputHeight, kStridedInputWidth)
2636 .padding(1)
2637 .kernel_size(3, 3)
2638 .stride(2)
2639 .group_input_channels(23)
2640 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2641 .input_pixel_stride(28)
2642 .iterations(3)
2643 .TestQS8();
2644}
2645
2646TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_with_output_stride) {
2647 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2648 DeconvolutionOperatorTester()
2649 .batch_size(2)
2650 .input_size(kStridedInputHeight, kStridedInputWidth)
2651 .padding(1)
2652 .kernel_size(3, 3)
2653 .stride(2)
2654 .group_input_channels(23)
2655 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2656 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
2657 .iterations(3)
2658 .TestQS8();
2659}
2660
2661TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_with_qmin) {
2662 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2663 DeconvolutionOperatorTester()
2664 .batch_size(2)
2665 .input_size(kStridedInputHeight, kStridedInputWidth)
2666 .padding(1)
2667 .kernel_size(3, 3)
2668 .stride(2)
2669 .group_input_channels(23)
2670 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2671 .qmin(128)
2672 .iterations(3)
2673 .TestQS8();
2674}
2675
2676TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_with_qmax) {
2677 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2678 DeconvolutionOperatorTester()
2679 .batch_size(2)
2680 .input_size(kStridedInputHeight, kStridedInputWidth)
2681 .padding(1)
2682 .kernel_size(3, 3)
2683 .stride(2)
2684 .group_input_channels(23)
2685 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2686 .qmax(128)
2687 .iterations(3)
2688 .TestQS8();
2689}
2690
2691TEST(DECONVOLUTION_NHWC_QS8, batched_3x3s2_without_bias) {
2692 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2693 DeconvolutionOperatorTester()
2694 .has_bias(false)
2695 .batch_size(2)
2696 .input_size(kStridedInputHeight, kStridedInputWidth)
2697 .padding(1)
2698 .kernel_size(3, 3)
2699 .stride(2)
2700 .group_input_channels(23)
2701 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2702 .iterations(3)
2703 .TestQS8();
2704}
2705
2706/**************************** SUBCONV2D/IGEMM path, grouped, batched ****************************/
2707
2708TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2) {
2709 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2710 DeconvolutionOperatorTester()
2711 .batch_size(2)
2712 .input_size(kStridedInputHeight, kStridedInputWidth)
2713 .padding(1)
2714 .kernel_size(3, 3)
2715 .stride(2)
2716 .groups(2)
2717 .group_input_channels(17)
2718 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2719 .iterations(3)
2720 .TestQS8();
2721}
2722
2723TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_Kx3s2) {
2724 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2725 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
2726 DeconvolutionOperatorTester()
2727 .batch_size(2)
2728 .input_size(kStridedInputHeight, kStridedInputWidth)
2729 .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.qu8.gemm.nr * 2 + 3)
2735 .iterations(3)
2736 .TestQS8();
2737 }
2738}
2739
2740TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3xKs2) {
2741 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2742 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
2743 DeconvolutionOperatorTester()
2744 .batch_size(2)
2745 .input_size(kStridedInputHeight, kStridedInputWidth)
2746 .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.qu8.gemm.nr * 2 + 3)
2752 .iterations(3)
2753 .TestQS8();
2754 }
2755}
2756
2757TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3sSx1) {
2758 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2759 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
2760 DeconvolutionOperatorTester()
2761 .batch_size(2)
2762 .input_size(kStridedInputHeight, kStridedInputWidth)
2763 .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.qu8.gemm.nr * 2 + 3)
2770 .iterations(3)
2771 .TestQS8();
2772 }
2773}
2774
2775TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s1xS) {
2776 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2777 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
2778 DeconvolutionOperatorTester()
2779 .batch_size(2)
2780 .input_size(kStridedInputHeight, kStridedInputWidth)
2781 .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.qu8.gemm.nr * 2 + 3)
2788 .iterations(3)
2789 .TestQS8();
2790 }
2791}
2792
2793TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_height_padding) {
2794 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
2799 .input_size(kStridedInputHeight, kStridedInputWidth)
2800 .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.qu8.gemm.nr * 2 + 3)
2808 .iterations(1)
2809 .TestQS8();
2810 }
2811 }
2812}
2813
2814TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_width_padding) {
2815 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
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)
2820 .input_size(kStridedInputHeight, kStridedInputWidth)
2821 .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.qu8.gemm.nr * 2 + 3)
2829 .iterations(1)
2830 .TestQS8();
2831 }
2832 }
2833}
2834
2835TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_height_adjustment) {
2836 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2837 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
2838 DeconvolutionOperatorTester()
2839 .batch_size(2)
2840 .input_size(kStridedInputHeight, kStridedInputWidth)
2841 .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.qu8.gemm.nr * 2 + 3)
2848 .iterations(1)
2849 .TestQS8();
2850 }
2851}
2852
2853TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_width_adjustment) {
2854 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2855 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
2856 DeconvolutionOperatorTester()
2857 .batch_size(2)
2858 .input_size(kStridedInputHeight, kStridedInputWidth)
2859 .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.qu8.gemm.nr * 2 + 3)
2866 .iterations(1)
2867 .TestQS8();
2868 }
2869}
2870
2871TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_input_height) {
2872 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2873 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
2874 DeconvolutionOperatorTester()
2875 .batch_size(2)
2876 .input_size(input_height, kStridedInputWidth)
2877 .padding(1)
2878 .kernel_size(3, 3)
2879 .stride(2)
2880 .groups(2)
2881 .group_input_channels(17)
2882 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2883 .iterations(1)
2884 .TestQS8();
2885 }
2886}
2887
2888TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_input_width) {
2889 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2890 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
2891 DeconvolutionOperatorTester()
2892 .batch_size(2)
2893 .input_size(kStridedInputHeight, kStridedInputWidth)
2894 .padding(1)
2895 .kernel_size(3, 3)
2896 .stride(2)
2897 .groups(2)
2898 .group_input_channels(17)
2899 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2900 .iterations(1)
2901 .TestQS8();
2902 }
2903}
2904
Marat Dukhanbea849a2021-07-30 16:25:30 -07002905TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_input_channels) {
2906 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2907 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
2908 DeconvolutionOperatorTester()
2909 .batch_size(2)
2910 .input_size(kStridedInputHeight, kStridedInputWidth)
2911 .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.qu8.gemm.nr * 2 + 3)
2917 .iterations(1)
2918 .TestQS8();
2919 }
2920}
2921
2922TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_varying_output_channels) {
2923 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2924 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
2925 DeconvolutionOperatorTester()
2926 .batch_size(2)
2927 .input_size(kStridedInputHeight, kStridedInputWidth)
2928 .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 .TestQS8();
2936 }
2937}
2938
2939TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_with_input_stride) {
2940 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2941 DeconvolutionOperatorTester()
2942 .batch_size(2)
2943 .input_size(kStridedInputHeight, kStridedInputWidth)
2944 .padding(1)
2945 .kernel_size(3, 3)
2946 .stride(2)
2947 .groups(2)
2948 .group_input_channels(17)
2949 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2950 .input_pixel_stride(37)
2951 .iterations(3)
2952 .TestQS8();
2953}
2954
2955TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_with_output_stride) {
2956 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2957 DeconvolutionOperatorTester()
2958 .batch_size(2)
2959 .input_size(kStridedInputHeight, kStridedInputWidth)
2960 .padding(1)
2961 .kernel_size(3, 3)
2962 .stride(2)
2963 .groups(2)
2964 .group_input_channels(17)
2965 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
2966 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
2967 .iterations(3)
2968 .TestQS8();
2969}
2970
2971TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_with_qmin) {
2972 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2973 DeconvolutionOperatorTester()
2974 .batch_size(2)
2975 .input_size(kStridedInputHeight, kStridedInputWidth)
2976 .padding(1)
2977 .kernel_size(3, 3)
2978 .stride(2)
2979 .groups(2)
2980 .group_input_channels(17)
2981 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2982 .qmin(128)
2983 .iterations(3)
2984 .TestQS8();
2985}
2986
2987TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_with_qmax) {
2988 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2989 DeconvolutionOperatorTester()
2990 .batch_size(2)
2991 .input_size(kStridedInputHeight, kStridedInputWidth)
2992 .padding(1)
2993 .kernel_size(3, 3)
2994 .stride(2)
2995 .groups(2)
2996 .group_input_channels(17)
2997 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
2998 .qmax(128)
2999 .iterations(3)
3000 .TestQS8();
3001}
3002
3003TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_3x3s2_without_bias) {
3004 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3005 DeconvolutionOperatorTester()
3006 .has_bias(false)
3007 .batch_size(2)
3008 .input_size(kStridedInputHeight, kStridedInputWidth)
3009 .padding(1)
3010 .kernel_size(3, 3)
3011 .stride(2)
3012 .groups(2)
3013 .group_input_channels(17)
3014 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3015 .iterations(3)
3016 .TestQS8();
3017}
3018
3019/**************************** SUBCONV2D/IGEMM path, setup ****************************/
3020
3021TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_setup_changing_batch) {
3022 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3023 DeconvolutionOperatorTester()
3024 .batch_size(2)
3025 .next_batch_size(5)
3026 .input_size(kStridedInputHeight, kStridedInputWidth)
3027 .kernel_height(3)
3028 .kernel_width(5)
3029 .stride(2)
3030 .groups(2)
3031 .group_input_channels(15)
3032 .group_output_channels(17)
3033 .TestSetupQS8();
3034}
3035
3036TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_setup_changing_height) {
3037 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3038 DeconvolutionOperatorTester()
3039 .batch_size(2)
3040 .input_size(kStridedInputHeight, kStridedInputWidth)
3041 .next_input_height(kStridedInputHeight + 3)
3042 .kernel_height(3)
3043 .kernel_width(5)
3044 .stride(2)
3045 .groups(2)
3046 .group_input_channels(15)
3047 .group_output_channels(17)
3048 .TestSetupQS8();
3049}
3050
3051TEST(DECONVOLUTION_NHWC_QS8, 3x3s2_setup_changing_width) {
3052 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3053 DeconvolutionOperatorTester()
3054 .batch_size(2)
3055 .input_size(kStridedInputHeight, kStridedInputWidth)
3056 .next_input_width(kStridedInputWidth + 3)
3057 .kernel_height(3)
3058 .kernel_width(5)
3059 .stride(2)
3060 .groups(2)
3061 .group_input_channels(15)
3062 .group_output_channels(17)
3063 .TestSetupQS8();
3064}
3065
3066/**************************** SUBCONV2D/GEMM path ****************************/
3067
3068TEST(DECONVOLUTION_NHWC_QS8, 2x2s2) {
3069 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3070 DeconvolutionOperatorTester()
3071 .input_size(kStridedInputHeight, kStridedInputWidth)
3072 .kernel_size(2, 2)
3073 .stride(2)
3074 .group_input_channels(15)
3075 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3076 .iterations(3)
3077 .TestQS8();
3078}
3079
3080TEST(DECONVOLUTION_NHWC_QS8, Kx2sKx2) {
3081 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3082 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
3083 DeconvolutionOperatorTester()
3084 .input_size(kStridedInputHeight, kStridedInputWidth)
3085 .kernel_size(kernel_height, 2)
3086 .stride(kernel_height, 2)
3087 .group_input_channels(17)
3088 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3089 .iterations(3)
3090 .TestQS8();
3091 }
3092}
3093
3094TEST(DECONVOLUTION_NHWC_QS8, 2xKs2xK) {
3095 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3096 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
3097 DeconvolutionOperatorTester()
3098 .input_size(kStridedInputHeight, kStridedInputWidth)
3099 .kernel_size(2, kernel_width)
3100 .stride(2, kernel_width)
3101 .group_input_channels(17)
3102 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3103 .iterations(3)
3104 .TestQS8();
3105 }
3106}
3107
3108TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_height_adjustment) {
3109 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3110 DeconvolutionOperatorTester()
3111 .input_size(kStridedInputHeight, kStridedInputWidth)
3112 .adjustment_height(1)
3113 .kernel_size(2, 2)
3114 .stride(2)
3115 .group_input_channels(15)
3116 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3117 .iterations(1)
3118 .TestQS8();
3119}
3120
3121TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_width_adjustment) {
3122 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3123 DeconvolutionOperatorTester()
3124 .input_size(kStridedInputHeight, kStridedInputWidth)
3125 .adjustment_width(1)
3126 .kernel_size(2, 2)
3127 .stride(2)
3128 .group_input_channels(15)
3129 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3130 .iterations(1)
3131 .TestQS8();
3132}
3133
3134TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_varying_input_height) {
3135 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3136 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
3137 DeconvolutionOperatorTester()
3138 .input_size(input_height, kStridedInputWidth)
3139 .kernel_size(2, 2)
3140 .stride(2)
3141 .group_input_channels(15)
3142 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3143 .iterations(1)
3144 .TestQS8();
3145 }
3146}
3147
3148TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_varying_input_width) {
3149 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3150 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
3151 DeconvolutionOperatorTester()
3152 .input_size(kStridedInputHeight, kStridedInputWidth)
3153 .kernel_size(2, 2)
3154 .stride(2)
3155 .group_input_channels(15)
3156 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3157 .iterations(1)
3158 .TestQS8();
3159 }
3160}
3161
3162TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_varying_input_channels) {
3163 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3164 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3165 DeconvolutionOperatorTester()
3166 .input_size(kStridedInputHeight, kStridedInputWidth)
3167 .kernel_size(2, 2)
3168 .stride(2)
3169 .group_input_channels(input_channels)
3170 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3171 .iterations(1)
3172 .TestQS8();
3173 }
3174}
3175
3176TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_varying_output_channels) {
3177 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3178 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
3179 DeconvolutionOperatorTester()
3180 .input_size(kStridedInputHeight, kStridedInputWidth)
3181 .kernel_size(2, 2)
3182 .stride(2)
3183 .group_input_channels(23)
3184 .group_output_channels(output_channels)
3185 .iterations(1)
3186 .TestQS8();
3187 }
3188}
3189
3190TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_with_input_stride) {
3191 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3192 DeconvolutionOperatorTester()
3193 .input_size(kStridedInputHeight, kStridedInputWidth)
3194 .kernel_size(2, 2)
3195 .stride(2)
3196 .group_input_channels(23)
3197 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3198 .input_pixel_stride(28)
3199 .iterations(3)
3200 .TestQS8();
3201}
3202
3203TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_with_output_stride) {
3204 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3205 DeconvolutionOperatorTester()
3206 .input_size(kStridedInputHeight, kStridedInputWidth)
3207 .kernel_size(2, 2)
3208 .stride(2)
3209 .group_input_channels(23)
3210 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3211 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
3212 .iterations(3)
3213 .TestQS8();
3214}
3215
3216TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_with_qmin) {
3217 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3218 DeconvolutionOperatorTester()
3219 .input_size(kStridedInputHeight, kStridedInputWidth)
3220 .kernel_size(2, 2)
3221 .stride(2)
3222 .group_input_channels(23)
3223 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3224 .qmin(128)
3225 .iterations(3)
3226 .TestQS8();
3227}
3228
3229TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_with_qmax) {
3230 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3231 DeconvolutionOperatorTester()
3232 .input_size(kStridedInputHeight, kStridedInputWidth)
3233 .kernel_size(2, 2)
3234 .stride(2)
3235 .group_input_channels(23)
3236 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3237 .qmax(128)
3238 .iterations(3)
3239 .TestQS8();
3240}
3241
3242TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_without_bias) {
3243 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3244 DeconvolutionOperatorTester()
3245 .has_bias(false)
3246 .input_size(kStridedInputHeight, kStridedInputWidth)
3247 .kernel_size(2, 2)
3248 .stride(2)
3249 .group_input_channels(23)
3250 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3251 .iterations(3)
3252 .TestQS8();
3253}
3254
3255/**************************** SUBCONV2D/GEMM path, grouped ****************************/
3256
3257TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2) {
3258 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3259 DeconvolutionOperatorTester()
3260 .input_size(kStridedInputHeight, kStridedInputWidth)
3261 .kernel_size(2, 2)
3262 .stride(2)
3263 .groups(2)
3264 .group_input_channels(17)
3265 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3266 .iterations(3)
3267 .TestQS8();
3268}
3269
3270TEST(DECONVOLUTION_NHWC_QS8, grouped_Kx2sKx2) {
3271 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3272 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
3273 DeconvolutionOperatorTester()
3274 .input_size(kStridedInputHeight, kStridedInputWidth)
3275 .kernel_size(kernel_height, 2)
3276 .stride(kernel_height, 2)
3277 .groups(2)
3278 .group_input_channels(17)
3279 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3280 .iterations(3)
3281 .TestQS8();
3282 }
3283}
3284
3285TEST(DECONVOLUTION_NHWC_QS8, grouped_2xKs2xK) {
3286 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3287 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
3288 DeconvolutionOperatorTester()
3289 .input_size(kStridedInputHeight, kStridedInputWidth)
3290 .kernel_size(2, kernel_width)
3291 .stride(2, kernel_width)
3292 .groups(2)
3293 .group_input_channels(17)
3294 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3295 .iterations(3)
3296 .TestQS8();
3297 }
3298}
3299
3300TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_height_adjustment) {
3301 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3302 DeconvolutionOperatorTester()
3303 .input_size(kStridedInputHeight, kStridedInputWidth)
3304 .adjustment_height(1)
3305 .kernel_size(2, 2)
3306 .stride(2)
3307 .groups(2)
3308 .group_input_channels(17)
3309 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3310 .iterations(1)
3311 .TestQS8();
3312}
3313
3314TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_width_adjustment) {
3315 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3316 DeconvolutionOperatorTester()
3317 .input_size(kStridedInputHeight, kStridedInputWidth)
3318 .adjustment_width(1)
3319 .kernel_size(2, 2)
3320 .stride(2)
3321 .groups(2)
3322 .group_input_channels(17)
3323 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3324 .iterations(1)
3325 .TestQS8();
3326}
3327
3328TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_varying_input_height) {
3329 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3330 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
3331 DeconvolutionOperatorTester()
3332 .input_size(input_height, kStridedInputWidth)
3333 .kernel_size(2, 2)
3334 .stride(2)
3335 .groups(2)
3336 .group_input_channels(17)
3337 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3338 .iterations(1)
3339 .TestQS8();
3340 }
3341}
3342
3343TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_varying_input_width) {
3344 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3345 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
3346 DeconvolutionOperatorTester()
3347 .input_size(kStridedInputHeight, kStridedInputWidth)
3348 .kernel_size(2, 2)
3349 .stride(2)
3350 .groups(2)
3351 .group_input_channels(17)
3352 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3353 .iterations(1)
3354 .TestQS8();
3355 }
3356}
3357
3358TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_varying_input_channels) {
3359 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3360 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
3361 DeconvolutionOperatorTester()
3362 .input_size(kStridedInputHeight, kStridedInputWidth)
3363 .kernel_size(2, 2)
3364 .stride(2)
3365 .groups(2)
3366 .group_input_channels(input_channels)
3367 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3368 .iterations(1)
3369 .TestQS8();
3370 }
3371}
3372
3373TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_varying_output_channels) {
3374 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3375 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
3376 DeconvolutionOperatorTester()
3377 .input_size(kStridedInputHeight, kStridedInputWidth)
3378 .kernel_size(2, 2)
3379 .stride(2)
3380 .groups(2)
3381 .group_input_channels(17)
3382 .group_output_channels(output_channels)
3383 .iterations(1)
3384 .TestQS8();
3385 }
3386}
3387
3388TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_with_input_stride) {
3389 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3390 DeconvolutionOperatorTester()
3391 .input_size(kStridedInputHeight, kStridedInputWidth)
3392 .kernel_size(2, 2)
3393 .stride(2)
3394 .groups(2)
3395 .group_input_channels(17)
3396 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3397 .input_pixel_stride(37)
3398 .iterations(3)
3399 .TestQS8();
3400}
3401
3402TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_with_output_stride) {
3403 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3404 DeconvolutionOperatorTester()
3405 .input_size(kStridedInputHeight, kStridedInputWidth)
3406 .kernel_size(2, 2)
3407 .stride(2)
3408 .groups(2)
3409 .group_input_channels(17)
3410 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
3411 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
3412 .iterations(3)
3413 .TestQS8();
3414}
3415
3416TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_with_qmin) {
3417 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3418 DeconvolutionOperatorTester()
3419 .input_size(kStridedInputHeight, kStridedInputWidth)
3420 .kernel_size(2, 2)
3421 .stride(2)
3422 .groups(2)
3423 .group_input_channels(17)
3424 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3425 .qmin(128)
3426 .iterations(3)
3427 .TestQS8();
3428}
3429
3430TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_with_qmax) {
3431 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3432 DeconvolutionOperatorTester()
3433 .input_size(kStridedInputHeight, kStridedInputWidth)
3434 .kernel_size(2, 2)
3435 .stride(2)
3436 .groups(2)
3437 .group_input_channels(17)
3438 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3439 .qmax(128)
3440 .iterations(3)
3441 .TestQS8();
3442}
3443
3444TEST(DECONVOLUTION_NHWC_QS8, grouped_2x2s2_without_bias) {
3445 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3446 DeconvolutionOperatorTester()
3447 .has_bias(false)
3448 .input_size(kStridedInputHeight, kStridedInputWidth)
3449 .kernel_size(2, 2)
3450 .stride(2)
3451 .groups(2)
3452 .group_input_channels(17)
3453 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3454 .iterations(3)
3455 .TestQS8();
3456}
3457
3458/**************************** SUBCONV2D/GEMM path, batched ****************************/
3459
3460TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2) {
3461 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3462 DeconvolutionOperatorTester()
3463 .batch_size(2)
3464 .input_size(kStridedInputHeight, kStridedInputWidth)
3465 .kernel_size(2, 2)
3466 .stride(2)
3467 .group_input_channels(15)
3468 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3469 .iterations(3)
3470 .TestQS8();
3471}
3472
3473TEST(DECONVOLUTION_NHWC_QS8, batched_Kx2sKx2) {
3474 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3475 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
3476 DeconvolutionOperatorTester()
3477 .batch_size(2)
3478 .input_size(kStridedInputHeight, kStridedInputWidth)
3479 .kernel_size(kernel_height, 2)
3480 .stride(kernel_height, 2)
3481 .group_input_channels(17)
3482 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3483 .iterations(3)
3484 .TestQS8();
3485 }
3486}
3487
3488TEST(DECONVOLUTION_NHWC_QS8, batched_2xKs2xK) {
3489 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3490 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
3491 DeconvolutionOperatorTester()
3492 .batch_size(2)
3493 .input_size(kStridedInputHeight, kStridedInputWidth)
3494 .kernel_size(2, kernel_width)
3495 .stride(2, kernel_width)
3496 .group_input_channels(17)
3497 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3498 .iterations(3)
3499 .TestQS8();
3500 }
3501}
3502
3503TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_height_adjustment) {
3504 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3505 DeconvolutionOperatorTester()
3506 .batch_size(2)
3507 .input_size(kStridedInputHeight, kStridedInputWidth)
3508 .adjustment_height(1)
3509 .kernel_size(2, 2)
3510 .stride(2)
3511 .group_input_channels(15)
3512 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3513 .iterations(1)
3514 .TestQS8();
3515}
3516
3517TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_width_adjustment) {
3518 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3519 DeconvolutionOperatorTester()
3520 .batch_size(2)
3521 .input_size(kStridedInputHeight, kStridedInputWidth)
3522 .adjustment_width(1)
3523 .kernel_size(2, 2)
3524 .stride(2)
3525 .group_input_channels(15)
3526 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3527 .iterations(1)
3528 .TestQS8();
3529}
3530
3531TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_varying_input_height) {
3532 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3533 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
3534 DeconvolutionOperatorTester()
3535 .batch_size(2)
3536 .input_size(input_height, kStridedInputWidth)
3537 .kernel_size(2, 2)
3538 .stride(2)
3539 .group_input_channels(15)
3540 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3541 .iterations(1)
3542 .TestQS8();
3543 }
3544}
3545
3546TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_varying_input_width) {
3547 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3548 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
3549 DeconvolutionOperatorTester()
3550 .batch_size(2)
3551 .input_size(kStridedInputHeight, kStridedInputWidth)
3552 .kernel_size(2, 2)
3553 .stride(2)
3554 .group_input_channels(15)
3555 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3556 .iterations(1)
3557 .TestQS8();
3558 }
3559}
3560
3561TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_varying_input_channels) {
3562 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3563 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3564 DeconvolutionOperatorTester()
3565 .batch_size(2)
3566 .input_size(kStridedInputHeight, kStridedInputWidth)
3567 .kernel_size(2, 2)
3568 .stride(2)
3569 .group_input_channels(input_channels)
3570 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3571 .iterations(1)
3572 .TestQS8();
3573 }
3574}
3575
3576TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_varying_output_channels) {
3577 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3578 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
3579 DeconvolutionOperatorTester()
3580 .batch_size(2)
3581 .input_size(kStridedInputHeight, kStridedInputWidth)
3582 .kernel_size(2, 2)
3583 .stride(2)
3584 .group_input_channels(23)
3585 .group_output_channels(output_channels)
3586 .iterations(1)
3587 .TestQS8();
3588 }
3589}
3590
3591TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_with_input_stride) {
3592 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3593 DeconvolutionOperatorTester()
3594 .batch_size(2)
3595 .input_size(kStridedInputHeight, kStridedInputWidth)
3596 .kernel_size(2, 2)
3597 .stride(2)
3598 .group_input_channels(23)
3599 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3600 .input_pixel_stride(28)
3601 .iterations(3)
3602 .TestQS8();
3603}
3604
3605TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_with_output_stride) {
3606 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3607 DeconvolutionOperatorTester()
3608 .batch_size(2)
3609 .input_size(kStridedInputHeight, kStridedInputWidth)
3610 .kernel_size(2, 2)
3611 .stride(2)
3612 .group_input_channels(23)
3613 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3614 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
3615 .iterations(3)
3616 .TestQS8();
3617}
3618
3619TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_with_qmin) {
3620 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3621 DeconvolutionOperatorTester()
3622 .batch_size(2)
3623 .input_size(kStridedInputHeight, kStridedInputWidth)
3624 .kernel_size(2, 2)
3625 .stride(2)
3626 .group_input_channels(23)
3627 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3628 .qmin(128)
3629 .iterations(3)
3630 .TestQS8();
3631}
3632
3633TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_with_qmax) {
3634 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3635 DeconvolutionOperatorTester()
3636 .batch_size(2)
3637 .input_size(kStridedInputHeight, kStridedInputWidth)
3638 .kernel_size(2, 2)
3639 .stride(2)
3640 .group_input_channels(23)
3641 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3642 .qmax(128)
3643 .iterations(3)
3644 .TestQS8();
3645}
3646
3647TEST(DECONVOLUTION_NHWC_QS8, batched_2x2s2_without_bias) {
3648 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3649 DeconvolutionOperatorTester()
3650 .has_bias(false)
3651 .batch_size(2)
3652 .input_size(kStridedInputHeight, kStridedInputWidth)
3653 .kernel_size(2, 2)
3654 .stride(2)
3655 .group_input_channels(23)
3656 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3657 .iterations(3)
3658 .TestQS8();
3659}
3660
3661/**************************** SUBCONV2D/GEMM path, grouped, batched ****************************/
3662
3663TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2) {
3664 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3665 DeconvolutionOperatorTester()
3666 .batch_size(2)
3667 .input_size(kStridedInputHeight, kStridedInputWidth)
3668 .kernel_size(2, 2)
3669 .stride(2)
3670 .groups(2)
3671 .group_input_channels(17)
3672 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3673 .iterations(3)
3674 .TestQS8();
3675}
3676
3677TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_Kx2sKx2) {
3678 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3679 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
3680 DeconvolutionOperatorTester()
3681 .batch_size(2)
3682 .input_size(kStridedInputHeight, kStridedInputWidth)
3683 .kernel_size(kernel_height, 2)
3684 .stride(kernel_height, 2)
3685 .groups(2)
3686 .group_input_channels(17)
3687 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3688 .iterations(3)
3689 .TestQS8();
3690 }
3691}
3692
3693TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2xKs2xK) {
3694 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3695 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
3696 DeconvolutionOperatorTester()
3697 .batch_size(2)
3698 .input_size(kStridedInputHeight, kStridedInputWidth)
3699 .kernel_size(2, kernel_width)
3700 .stride(2, kernel_width)
3701 .groups(2)
3702 .group_input_channels(17)
3703 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3704 .iterations(3)
3705 .TestQS8();
3706 }
3707}
3708
3709TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_height_adjustment) {
3710 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3711 DeconvolutionOperatorTester()
3712 .batch_size(2)
3713 .input_size(kStridedInputHeight, kStridedInputWidth)
3714 .adjustment_height(1)
3715 .kernel_size(2, 2)
3716 .stride(2)
3717 .groups(2)
3718 .group_input_channels(17)
3719 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3720 .iterations(1)
3721 .TestQS8();
3722}
3723
3724TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_width_adjustment) {
3725 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3726 DeconvolutionOperatorTester()
3727 .batch_size(2)
3728 .input_size(kStridedInputHeight, kStridedInputWidth)
3729 .adjustment_width(1)
3730 .kernel_size(2, 2)
3731 .stride(2)
3732 .groups(2)
3733 .group_input_channels(17)
3734 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3735 .iterations(1)
3736 .TestQS8();
3737}
3738
3739TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_varying_input_height) {
3740 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3741 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
3742 DeconvolutionOperatorTester()
3743 .batch_size(2)
3744 .input_size(input_height, kStridedInputWidth)
3745 .kernel_size(2, 2)
3746 .stride(2)
3747 .groups(2)
3748 .group_input_channels(17)
3749 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3750 .iterations(1)
3751 .TestQS8();
3752 }
3753}
3754
3755TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_varying_input_width) {
3756 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3757 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
3758 DeconvolutionOperatorTester()
3759 .batch_size(2)
3760 .input_size(kStridedInputHeight, kStridedInputWidth)
3761 .kernel_size(2, 2)
3762 .stride(2)
3763 .groups(2)
3764 .group_input_channels(17)
3765 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3766 .iterations(1)
3767 .TestQS8();
3768 }
3769}
3770
3771TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_varying_input_channels) {
3772 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3773 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
3774 DeconvolutionOperatorTester()
3775 .batch_size(2)
3776 .input_size(kStridedInputHeight, kStridedInputWidth)
3777 .kernel_size(2, 2)
3778 .stride(2)
3779 .groups(2)
3780 .group_input_channels(input_channels)
3781 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3782 .iterations(1)
3783 .TestQS8();
3784 }
3785}
3786
3787TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_varying_output_channels) {
3788 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3789 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
3790 DeconvolutionOperatorTester()
3791 .batch_size(2)
3792 .input_size(kStridedInputHeight, kStridedInputWidth)
3793 .kernel_size(2, 2)
3794 .stride(2)
3795 .groups(2)
3796 .group_input_channels(17)
3797 .group_output_channels(output_channels)
3798 .iterations(1)
3799 .TestQS8();
3800 }
3801}
3802
3803TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_with_input_stride) {
3804 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3805 DeconvolutionOperatorTester()
3806 .batch_size(2)
3807 .input_size(kStridedInputHeight, kStridedInputWidth)
3808 .kernel_size(2, 2)
3809 .stride(2)
3810 .groups(2)
3811 .group_input_channels(17)
3812 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3813 .input_pixel_stride(37)
3814 .iterations(3)
3815 .TestQS8();
3816}
3817
3818TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_with_output_stride) {
3819 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3820 DeconvolutionOperatorTester()
3821 .batch_size(2)
3822 .input_size(kStridedInputHeight, kStridedInputWidth)
3823 .kernel_size(2, 2)
3824 .stride(2)
3825 .groups(2)
3826 .group_input_channels(17)
3827 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
3828 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
3829 .iterations(3)
3830 .TestQS8();
3831}
3832
3833TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_with_qmin) {
3834 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3835 DeconvolutionOperatorTester()
3836 .batch_size(2)
3837 .input_size(kStridedInputHeight, kStridedInputWidth)
3838 .kernel_size(2, 2)
3839 .stride(2)
3840 .groups(2)
3841 .group_input_channels(17)
3842 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3843 .qmin(128)
3844 .iterations(3)
3845 .TestQS8();
3846}
3847
3848TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_with_qmax) {
3849 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3850 DeconvolutionOperatorTester()
3851 .batch_size(2)
3852 .input_size(kStridedInputHeight, kStridedInputWidth)
3853 .kernel_size(2, 2)
3854 .stride(2)
3855 .groups(2)
3856 .group_input_channels(17)
3857 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3858 .qmax(128)
3859 .iterations(3)
3860 .TestQS8();
3861}
3862
3863TEST(DECONVOLUTION_NHWC_QS8, batched_grouped_2x2s2_without_bias) {
3864 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3865 DeconvolutionOperatorTester()
3866 .has_bias(false)
3867 .batch_size(2)
3868 .input_size(kStridedInputHeight, kStridedInputWidth)
3869 .kernel_size(2, 2)
3870 .stride(2)
3871 .groups(2)
3872 .group_input_channels(17)
3873 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
3874 .iterations(3)
3875 .TestQS8();
3876}
3877
3878/**************************** SUBCONV2D/GEMM path, setup ****************************/
3879
3880TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_setup_changing_batch) {
3881 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3882 DeconvolutionOperatorTester()
3883 .batch_size(2)
3884 .next_batch_size(5)
3885 .input_size(kStridedInputHeight, kStridedInputWidth)
3886 .kernel_size(2, 2)
3887 .stride(2)
3888 .groups(2)
3889 .group_input_channels(15)
3890 .group_output_channels(17)
3891 .TestSetupQS8();
3892}
3893
3894TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_setup_changing_height) {
3895 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3896 DeconvolutionOperatorTester()
3897 .batch_size(2)
3898 .input_size(kStridedInputHeight, kStridedInputWidth)
3899 .next_input_height(kStridedInputHeight + 3)
3900 .kernel_size(2, 2)
3901 .stride(2)
3902 .groups(2)
3903 .group_input_channels(15)
3904 .group_output_channels(17)
3905 .TestSetupQS8();
3906}
3907
3908TEST(DECONVOLUTION_NHWC_QS8, 2x2s2_setup_changing_width) {
3909 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3910 DeconvolutionOperatorTester()
3911 .batch_size(2)
3912 .input_size(kStridedInputHeight, kStridedInputWidth)
3913 .next_input_width(kStridedInputWidth + 3)
3914 .kernel_size(2, 2)
3915 .stride(2)
3916 .groups(2)
3917 .group_input_channels(15)
3918 .group_output_channels(17)
3919 .TestSetupQS8();
3920}
3921
3922/**************************** Future GEMM path ****************************/
3923
Marat Dukhan08b7a972020-07-14 18:17:29 -07003924TEST(DECONVOLUTION_NHWC_QU8, 1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003925 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07003926 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003927 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003928 .kernel_size(1, 1)
3929 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003930 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003931 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003932 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003933}
3934
Marat Dukhan08b7a972020-07-14 18:17:29 -07003935TEST(DECONVOLUTION_NHWC_QU8, 1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003936 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08003937 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003938 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003939 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003940 .kernel_size(1, 1)
3941 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003942 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003943 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003944 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003945 }
3946}
3947
Marat Dukhan08b7a972020-07-14 18:17:29 -07003948TEST(DECONVOLUTION_NHWC_QU8, 1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003949 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08003950 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003951 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003952 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003953 .kernel_size(1, 1)
3954 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003955 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003956 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003957 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003958 }
3959}
3960
Marat Dukhan08b7a972020-07-14 18:17:29 -07003961TEST(DECONVOLUTION_NHWC_QU8, 1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003962 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07003963 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
3964 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003965 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003966 .kernel_size(1, 1)
3967 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003968 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003969 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003970 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003971 }
3972}
3973
Marat Dukhan08b7a972020-07-14 18:17:29 -07003974TEST(DECONVOLUTION_NHWC_QU8, 1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003975 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07003976 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07003977 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003978 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003979 .kernel_size(1, 1)
3980 .group_input_channels(23)
3981 .group_output_channels(output_channels)
3982 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003983 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003984 }
3985}
3986
Marat Dukhan08b7a972020-07-14 18:17:29 -07003987TEST(DECONVOLUTION_NHWC_QU8, 1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08003988 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07003989 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08003990 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003991 .kernel_size(1, 1)
3992 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003993 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07003994 .input_pixel_stride(28)
3995 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07003996 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07003997}
3998
Marat Dukhan08b7a972020-07-14 18:17:29 -07003999TEST(DECONVOLUTION_NHWC_QU8, 1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004000 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004001 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004002 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004003 .kernel_size(1, 1)
4004 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004005 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
4006 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004007 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004008 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004009}
4010
Marat Dukhan08b7a972020-07-14 18:17:29 -07004011TEST(DECONVOLUTION_NHWC_QU8, 1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004012 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004013 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004014 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004015 .kernel_size(1, 1)
4016 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004017 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004018 .qmin(128)
4019 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004020 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004021}
4022
Marat Dukhan08b7a972020-07-14 18:17:29 -07004023TEST(DECONVOLUTION_NHWC_QU8, 1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004024 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004025 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004026 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004027 .kernel_size(1, 1)
4028 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004029 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004030 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004031 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004032 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004033}
4034
Marat Dukhan08b7a972020-07-14 18:17:29 -07004035TEST(DECONVOLUTION_NHWC_QU8, 1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004036 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07004037 DeconvolutionOperatorTester()
4038 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08004039 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004040 .kernel_size(1, 1)
4041 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004042 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07004043 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004044 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07004045}
4046
XNNPACK Teamb455b122019-09-27 18:10:33 -07004047/**************************** Future GEMM path, grouped ****************************/
4048
Marat Dukhan08b7a972020-07-14 18:17:29 -07004049TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004050 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004051 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004052 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004053 .kernel_size(1, 1)
4054 .groups(2)
4055 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004056 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004057 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004058 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004059}
4060
Marat Dukhan08b7a972020-07-14 18:17:29 -07004061TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004062 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004063 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004064 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004065 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004066 .kernel_size(1, 1)
4067 .groups(2)
4068 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004069 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004070 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004071 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004072 }
4073}
4074
Marat Dukhan08b7a972020-07-14 18:17:29 -07004075TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004076 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004077 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004078 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004079 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004080 .kernel_size(1, 1)
4081 .groups(2)
4082 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004083 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004084 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004085 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004086 }
4087}
4088
Marat Dukhan08b7a972020-07-14 18:17:29 -07004089TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004090 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004091 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4092 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004093 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004094 .kernel_size(1, 1)
4095 .groups(2)
4096 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004097 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004098 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004099 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004100 }
4101}
4102
Marat Dukhan08b7a972020-07-14 18:17:29 -07004103TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004104 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07004105 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004106 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004107 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004108 .kernel_size(1, 1)
4109 .groups(2)
4110 .group_input_channels(23)
4111 .group_output_channels(output_channels)
4112 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004113 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004114 }
4115}
4116
Marat Dukhan08b7a972020-07-14 18:17:29 -07004117TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004118 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004119 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004120 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004121 .kernel_size(1, 1)
4122 .groups(2)
4123 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004124 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004125 .input_pixel_stride(47)
4126 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004127 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004128}
4129
Marat Dukhan08b7a972020-07-14 18:17:29 -07004130TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004131 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004132 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004133 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004134 .kernel_size(1, 1)
4135 .groups(2)
4136 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004137 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
4138 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004139 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004140 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004141}
4142
Marat Dukhan08b7a972020-07-14 18:17:29 -07004143TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004144 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004145 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004146 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004147 .kernel_size(1, 1)
4148 .groups(2)
4149 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004150 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004151 .qmin(128)
4152 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004153 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004154}
4155
Marat Dukhan08b7a972020-07-14 18:17:29 -07004156TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004157 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004158 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004159 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004160 .kernel_size(1, 1)
4161 .groups(2)
4162 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004163 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004164 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004165 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004166 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004167}
4168
Marat Dukhan08b7a972020-07-14 18:17:29 -07004169TEST(DECONVOLUTION_NHWC_QU8, grouped_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004170 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07004171 DeconvolutionOperatorTester()
4172 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08004173 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004174 .kernel_size(1, 1)
4175 .groups(2)
4176 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004177 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07004178 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004179 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07004180}
4181
XNNPACK Teamb455b122019-09-27 18:10:33 -07004182/**************************** Future GEMM path, batched ****************************/
4183
Marat Dukhan08b7a972020-07-14 18:17:29 -07004184TEST(DECONVOLUTION_NHWC_QU8, batched_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004185 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004186 DeconvolutionOperatorTester()
4187 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004188 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004189 .kernel_size(1, 1)
4190 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004191 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004192 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004193 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004194}
4195
Marat Dukhan08b7a972020-07-14 18:17:29 -07004196TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004197 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004198 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004199 DeconvolutionOperatorTester()
4200 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004201 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004202 .kernel_size(1, 1)
4203 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004204 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004205 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004206 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004207 }
4208}
4209
Marat Dukhan08b7a972020-07-14 18:17:29 -07004210TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004211 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004212 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004213 DeconvolutionOperatorTester()
4214 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004215 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004216 .kernel_size(1, 1)
4217 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004218 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004219 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004220 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004221 }
4222}
4223
Marat Dukhan08b7a972020-07-14 18:17:29 -07004224TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004225 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004226 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4227 DeconvolutionOperatorTester()
4228 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004229 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004230 .kernel_size(1, 1)
4231 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004232 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004233 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004234 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004235 }
4236}
4237
Marat Dukhan08b7a972020-07-14 18:17:29 -07004238TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004239 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07004240 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004241 DeconvolutionOperatorTester()
4242 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004243 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004244 .kernel_size(1, 1)
4245 .group_input_channels(23)
4246 .group_output_channels(output_channels)
4247 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004248 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004249 }
4250}
4251
Marat Dukhan08b7a972020-07-14 18:17:29 -07004252TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004253 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004254 DeconvolutionOperatorTester()
4255 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004256 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004257 .kernel_size(1, 1)
4258 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004259 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004260 .input_pixel_stride(28)
4261 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004262 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004263}
4264
Marat Dukhan08b7a972020-07-14 18:17:29 -07004265TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004266 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004267 DeconvolutionOperatorTester()
4268 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004269 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004270 .kernel_size(1, 1)
4271 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004272 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
4273 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004274 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004275 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004276}
4277
Marat Dukhan08b7a972020-07-14 18:17:29 -07004278TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004279 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004280 DeconvolutionOperatorTester()
4281 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004282 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004283 .kernel_size(1, 1)
4284 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004285 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004286 .qmin(128)
4287 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004288 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004289}
4290
Marat Dukhan08b7a972020-07-14 18:17:29 -07004291TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004292 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004293 DeconvolutionOperatorTester()
4294 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004295 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004296 .kernel_size(1, 1)
4297 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004298 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004299 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004300 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004301 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004302}
4303
Marat Dukhan08b7a972020-07-14 18:17:29 -07004304TEST(DECONVOLUTION_NHWC_QU8, batched_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004305 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07004306 DeconvolutionOperatorTester()
4307 .has_bias(false)
4308 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004309 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004310 .kernel_size(1, 1)
4311 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004312 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07004313 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004314 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07004315}
4316
XNNPACK Teamb455b122019-09-27 18:10:33 -07004317/**************************** Future GEMM path, batched, grouped ****************************/
4318
Marat Dukhan08b7a972020-07-14 18:17:29 -07004319TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004320 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004321 DeconvolutionOperatorTester()
4322 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004323 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004324 .kernel_size(1, 1)
4325 .groups(2)
4326 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004327 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004328 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004329 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004330}
4331
Marat Dukhan08b7a972020-07-14 18:17:29 -07004332TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004333 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004334 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004335 DeconvolutionOperatorTester()
4336 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004337 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004338 .kernel_size(1, 1)
4339 .groups(2)
4340 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004341 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004342 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004343 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004344 }
4345}
4346
Marat Dukhan08b7a972020-07-14 18:17:29 -07004347TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004348 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004349 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004350 DeconvolutionOperatorTester()
4351 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004352 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004353 .kernel_size(1, 1)
4354 .groups(2)
4355 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004356 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004357 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004358 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004359 }
4360}
4361
Marat Dukhan08b7a972020-07-14 18:17:29 -07004362TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004363 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004364 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4365 DeconvolutionOperatorTester()
4366 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004367 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004368 .kernel_size(1, 1)
4369 .groups(2)
4370 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004371 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004372 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004373 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004374 }
4375}
4376
Marat Dukhan08b7a972020-07-14 18:17:29 -07004377TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004378 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07004379 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004380 DeconvolutionOperatorTester()
4381 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004382 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004383 .kernel_size(1, 1)
4384 .groups(2)
4385 .group_input_channels(23)
4386 .group_output_channels(output_channels)
4387 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004388 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004389 }
4390}
4391
Marat Dukhan08b7a972020-07-14 18:17:29 -07004392TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004393 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004394 DeconvolutionOperatorTester()
4395 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004396 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004397 .kernel_size(1, 1)
4398 .groups(2)
4399 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004400 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004401 .input_pixel_stride(47)
4402 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004403 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004404}
4405
Marat Dukhan08b7a972020-07-14 18:17:29 -07004406TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004407 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004408 DeconvolutionOperatorTester()
4409 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004410 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004411 .kernel_size(1, 1)
4412 .groups(2)
4413 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004414 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
4415 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004416 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004417 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004418}
4419
Marat Dukhan08b7a972020-07-14 18:17:29 -07004420TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004421 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004422 DeconvolutionOperatorTester()
4423 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004424 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004425 .kernel_size(1, 1)
4426 .groups(2)
4427 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004428 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004429 .qmin(128)
4430 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004431 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004432}
4433
Marat Dukhan08b7a972020-07-14 18:17:29 -07004434TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004435 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004436 DeconvolutionOperatorTester()
4437 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004438 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004439 .kernel_size(1, 1)
4440 .groups(2)
4441 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004442 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004443 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004444 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004445 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004446}
4447
Marat Dukhan08b7a972020-07-14 18:17:29 -07004448TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004449 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07004450 DeconvolutionOperatorTester()
4451 .has_bias(false)
4452 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08004453 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004454 .kernel_size(1, 1)
4455 .groups(2)
4456 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004457 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07004458 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004459 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07004460}
4461
XNNPACK Teamb455b122019-09-27 18:10:33 -07004462/**************************** CONV path ****************************/
4463
Marat Dukhan08b7a972020-07-14 18:17:29 -07004464TEST(DECONVOLUTION_NHWC_QU8, 3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004465 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004466 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004467 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004468 .padding(1)
4469 .kernel_size(3, 3)
4470 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004471 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004472 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004473 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004474}
4475
Marat Dukhan08b7a972020-07-14 18:17:29 -07004476TEST(DECONVOLUTION_NHWC_QU8, Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004477 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004478 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
4479 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004480 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004481 .padding_width(1)
4482 .kernel_size(kernel_height, 3)
4483 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004484 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004485 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004486 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004487 }
4488}
4489
Marat Dukhan08b7a972020-07-14 18:17:29 -07004490TEST(DECONVOLUTION_NHWC_QU8, 3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004491 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004492 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
4493 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004494 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004495 .padding_height(1)
4496 .kernel_size(3, kernel_width)
4497 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004498 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004499 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004500 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004501 }
4502}
4503
Marat Dukhan08b7a972020-07-14 18:17:29 -07004504TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004505 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004506 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
4507 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
4508 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004509 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004510 .padding_width(1)
4511 .padding_top(padding_top)
4512 .padding_bottom(padding_bottom)
4513 .kernel_size(3, 3)
4514 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004515 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004516 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004517 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004518 }
4519 }
4520}
4521
Marat Dukhan08b7a972020-07-14 18:17:29 -07004522TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004523 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004524 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
4525 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
4526 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004527 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004528 .padding_height(1)
4529 .padding_left(padding_left)
4530 .padding_right(padding_right)
4531 .kernel_size(3, 3)
4532 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004533 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004534 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004535 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004536 }
4537 }
4538}
4539
Marat Dukhan08b7a972020-07-14 18:17:29 -07004540TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004541 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004542 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
4543 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004544 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004545 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004546 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004547 .adjustment_height(adjustment_height)
4548 .kernel_size(3, 3)
4549 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004550 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004551 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004552 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004553 }
4554}
4555
Marat Dukhan08b7a972020-07-14 18:17:29 -07004556TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004557 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004558 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
4559 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004560 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004561 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004562 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004563 .adjustment_width(adjustment_width)
4564 .kernel_size(3, 3)
4565 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004566 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004567 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004568 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004569 }
4570}
4571
Marat Dukhan08b7a972020-07-14 18:17:29 -07004572TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004573 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004574 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004575 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004576 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004577 .padding(1)
4578 .kernel_size(3, 3)
4579 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004580 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004581 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004582 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004583 }
4584}
4585
Marat Dukhan08b7a972020-07-14 18:17:29 -07004586TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004587 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004588 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004589 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004590 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004591 .padding(1)
4592 .kernel_size(3, 3)
4593 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004594 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004595 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004596 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004597 }
4598}
4599
Marat Dukhan08b7a972020-07-14 18:17:29 -07004600TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004601 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004602 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4603 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004604 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004605 .padding(1)
4606 .kernel_size(3, 3)
4607 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004608 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004609 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004610 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004611 }
4612}
4613
Marat Dukhan08b7a972020-07-14 18:17:29 -07004614TEST(DECONVOLUTION_NHWC_QU8, 3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004615 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07004616 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004617 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004618 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004619 .padding(1)
4620 .kernel_size(3, 3)
4621 .group_input_channels(23)
4622 .group_output_channels(output_channels)
4623 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004624 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004625 }
4626}
4627
Marat Dukhan08b7a972020-07-14 18:17:29 -07004628TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004629 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004630 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
4631 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004632 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004633 .padding(1)
4634 .kernel_size(3, 3)
4635 .dilation_height(dilation_height)
4636 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004637 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004638 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004639 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004640 }
4641}
4642
Marat Dukhan08b7a972020-07-14 18:17:29 -07004643TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004644 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004645 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
4646 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004647 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004648 .padding(1)
4649 .kernel_size(3, 3)
4650 .dilation_width(dilation_width)
4651 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004652 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004653 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004654 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004655 }
4656}
4657
Marat Dukhan08b7a972020-07-14 18:17:29 -07004658TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004659 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004660 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004661 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004662 .padding(1)
4663 .kernel_size(3, 3)
4664 .dilation_height(3)
4665 .stride_height(2)
4666 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004667 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004668 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004669 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004670}
4671
Marat Dukhan08b7a972020-07-14 18:17:29 -07004672TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004673 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004674 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004675 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004676 .padding(1)
4677 .kernel_size(3, 3)
4678 .dilation_width(3)
4679 .stride_width(2)
4680 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004681 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004682 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004683 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004684}
4685
Marat Dukhan08b7a972020-07-14 18:17:29 -07004686TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004687 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004688 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004689 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004690 .padding(1)
4691 .kernel_size(3, 3)
4692 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004693 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004694 .input_pixel_stride(28)
4695 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004696 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004697}
4698
Marat Dukhan08b7a972020-07-14 18:17:29 -07004699TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004700 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004701 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004702 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004703 .padding(1)
4704 .kernel_size(3, 3)
4705 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004706 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
4707 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004708 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004709 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004710}
4711
Marat Dukhan08b7a972020-07-14 18:17:29 -07004712TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004713 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004714 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004715 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004716 .padding(1)
4717 .kernel_size(3, 3)
4718 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004719 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004720 .qmin(128)
4721 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004722 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004723}
4724
Marat Dukhan08b7a972020-07-14 18:17:29 -07004725TEST(DECONVOLUTION_NHWC_QU8, 3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004726 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004727 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004728 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004729 .padding(1)
4730 .kernel_size(3, 3)
4731 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004732 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07004733 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004734 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004735 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004736}
4737
Marat Dukhan08b7a972020-07-14 18:17:29 -07004738TEST(DECONVOLUTION_NHWC_QU8, 3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004739 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07004740 DeconvolutionOperatorTester()
4741 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08004742 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07004743 .padding(1)
4744 .kernel_size(3, 3)
4745 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004746 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07004747 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004748 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07004749}
4750
XNNPACK Teamb455b122019-09-27 18:10:33 -07004751/**************************** CONV path, grouped ****************************/
4752
Marat Dukhan08b7a972020-07-14 18:17:29 -07004753TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004754 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004755 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004756 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004757 .padding(1)
4758 .kernel_size(3, 3)
4759 .groups(2)
4760 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004761 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004762 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004763 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004764}
4765
Marat Dukhan08b7a972020-07-14 18:17:29 -07004766TEST(DECONVOLUTION_NHWC_QU8, grouped_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004767 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004768 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
4769 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004770 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004771 .padding_width(1)
4772 .kernel_size(kernel_height, 3)
4773 .groups(2)
4774 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004775 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004776 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004777 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004778 }
4779}
4780
Marat Dukhan08b7a972020-07-14 18:17:29 -07004781TEST(DECONVOLUTION_NHWC_QU8, grouped_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004782 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004783 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
4784 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004785 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004786 .padding_height(1)
4787 .kernel_size(3, kernel_width)
4788 .groups(2)
4789 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004790 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004791 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004792 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004793 }
4794}
4795
Marat Dukhan08b7a972020-07-14 18:17:29 -07004796TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004797 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004798 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
4799 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
4800 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004801 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004802 .padding_width(1)
4803 .padding_top(padding_top)
4804 .padding_bottom(padding_bottom)
4805 .kernel_size(3, 3)
4806 .groups(2)
4807 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004808 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004809 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004810 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004811 }
4812 }
4813}
4814
Marat Dukhan08b7a972020-07-14 18:17:29 -07004815TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004816 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004817 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
4818 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
4819 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004820 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004821 .padding_height(1)
4822 .padding_left(padding_left)
4823 .padding_right(padding_right)
4824 .kernel_size(3, 3)
4825 .groups(2)
4826 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004827 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004828 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004829 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004830 }
4831 }
4832}
4833
Marat Dukhan08b7a972020-07-14 18:17:29 -07004834TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004835 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004836 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
4837 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004838 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004839 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004840 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004841 .adjustment_height(adjustment_height)
4842 .kernel_size(3, 3)
4843 .groups(2)
4844 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004845 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004846 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004847 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004848 }
4849}
4850
Marat Dukhan08b7a972020-07-14 18:17:29 -07004851TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004852 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004853 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
4854 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004855 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004856 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08004857 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004858 .adjustment_width(adjustment_width)
4859 .kernel_size(3, 3)
4860 .groups(2)
4861 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004862 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004863 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004864 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004865 }
4866}
4867
Marat Dukhan08b7a972020-07-14 18:17:29 -07004868TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004869 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004870 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004871 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004872 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004873 .padding(1)
4874 .kernel_size(3, 3)
4875 .groups(2)
4876 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004877 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004878 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004879 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004880 }
4881}
4882
Marat Dukhan08b7a972020-07-14 18:17:29 -07004883TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004884 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08004885 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004886 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004887 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004888 .padding(1)
4889 .kernel_size(3, 3)
4890 .groups(2)
4891 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004892 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004893 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004894 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004895 }
4896}
4897
Marat Dukhan08b7a972020-07-14 18:17:29 -07004898TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004899 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004900 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
4901 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004902 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004903 .padding(1)
4904 .kernel_size(3, 3)
4905 .groups(2)
4906 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004907 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004908 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004909 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004910 }
4911}
4912
Marat Dukhan08b7a972020-07-14 18:17:29 -07004913TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004914 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07004915 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07004916 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004917 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004918 .padding(1)
4919 .kernel_size(3, 3)
4920 .groups(2)
4921 .group_input_channels(23)
4922 .group_output_channels(output_channels)
4923 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004924 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004925 }
4926}
4927
Marat Dukhan08b7a972020-07-14 18:17:29 -07004928TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004929 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004930 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
4931 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004932 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004933 .padding(1)
4934 .kernel_size(3, 3)
4935 .dilation_height(dilation_height)
4936 .groups(2)
4937 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004938 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004939 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004940 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004941 }
4942}
4943
Marat Dukhan08b7a972020-07-14 18:17:29 -07004944TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004945 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004946 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
4947 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004948 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004949 .padding(1)
4950 .kernel_size(3, 3)
4951 .dilation_width(dilation_width)
4952 .groups(2)
4953 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004954 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004955 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004956 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004957 }
4958}
4959
Marat Dukhan08b7a972020-07-14 18:17:29 -07004960TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004961 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004962 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004963 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004964 .padding(1)
4965 .kernel_size(3, 3)
4966 .dilation_height(3)
4967 .stride_height(2)
4968 .groups(2)
4969 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004970 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004971 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004972 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004973}
4974
Marat Dukhan08b7a972020-07-14 18:17:29 -07004975TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004976 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004977 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004978 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004979 .padding(1)
4980 .kernel_size(3, 3)
4981 .dilation_width(3)
4982 .stride_width(2)
4983 .groups(2)
4984 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004985 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004986 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004987 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07004988}
4989
Marat Dukhan08b7a972020-07-14 18:17:29 -07004990TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08004991 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07004992 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08004993 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004994 .padding(1)
4995 .kernel_size(3, 3)
4996 .groups(2)
4997 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07004998 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07004999 .input_pixel_stride(47)
5000 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005001 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005002}
5003
Marat Dukhan08b7a972020-07-14 18:17:29 -07005004TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005005 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005006 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005007 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005008 .padding(1)
5009 .kernel_size(3, 3)
5010 .groups(2)
5011 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005012 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
5013 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005014 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005015 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005016}
5017
Marat Dukhan08b7a972020-07-14 18:17:29 -07005018TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005019 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005020 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005021 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005022 .padding(1)
5023 .kernel_size(3, 3)
5024 .groups(2)
5025 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005026 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005027 .qmin(128)
5028 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005029 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005030}
5031
Marat Dukhan08b7a972020-07-14 18:17:29 -07005032TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005033 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005034 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005035 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005036 .padding(1)
5037 .kernel_size(3, 3)
5038 .groups(2)
5039 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005040 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005041 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005042 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005043 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005044}
5045
Marat Dukhan08b7a972020-07-14 18:17:29 -07005046TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005047 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07005048 DeconvolutionOperatorTester()
5049 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08005050 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005051 .padding(1)
5052 .kernel_size(3, 3)
5053 .groups(2)
5054 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005055 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07005056 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005057 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07005058}
5059
XNNPACK Teamb455b122019-09-27 18:10:33 -07005060/**************************** CONV path, batched ****************************/
5061
Marat Dukhan08b7a972020-07-14 18:17:29 -07005062TEST(DECONVOLUTION_NHWC_QU8, batched_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005063 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005064 DeconvolutionOperatorTester()
5065 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005066 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005067 .padding(1)
5068 .kernel_size(3, 3)
5069 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005070 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005071 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005072 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005073}
5074
Marat Dukhan08b7a972020-07-14 18:17:29 -07005075TEST(DECONVOLUTION_NHWC_QU8, batched_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005076 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005077 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
5078 DeconvolutionOperatorTester()
5079 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005080 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005081 .padding_width(1)
5082 .kernel_size(kernel_height, 3)
5083 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005084 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005085 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005086 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005087 }
5088}
5089
Marat Dukhan08b7a972020-07-14 18:17:29 -07005090TEST(DECONVOLUTION_NHWC_QU8, batched_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005091 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005092 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
5093 DeconvolutionOperatorTester()
5094 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005095 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005096 .padding_height(1)
5097 .kernel_size(3, kernel_width)
5098 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005099 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005100 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005101 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005102 }
5103}
5104
Marat Dukhan08b7a972020-07-14 18:17:29 -07005105TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005106 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005107 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5108 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5109 DeconvolutionOperatorTester()
5110 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005111 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005112 .padding_width(1)
5113 .padding_top(padding_top)
5114 .padding_bottom(padding_bottom)
5115 .kernel_size(3, 3)
5116 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005117 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005118 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005119 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005120 }
5121 }
5122}
5123
Marat Dukhan08b7a972020-07-14 18:17:29 -07005124TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005125 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005126 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5127 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5128 DeconvolutionOperatorTester()
5129 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005130 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005131 .padding_height(1)
5132 .padding_left(padding_left)
5133 .padding_right(padding_right)
5134 .kernel_size(3, 3)
5135 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005136 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005137 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005138 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005139 }
5140 }
5141}
5142
Marat Dukhan08b7a972020-07-14 18:17:29 -07005143TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005144 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005145 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
5146 DeconvolutionOperatorTester()
5147 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005148 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005149 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08005150 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005151 .adjustment_height(adjustment_height)
5152 .kernel_size(3, 3)
5153 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005154 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005155 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005156 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005157 }
5158}
5159
Marat Dukhan08b7a972020-07-14 18:17:29 -07005160TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005161 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005162 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
5163 DeconvolutionOperatorTester()
5164 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005165 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005166 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08005167 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005168 .adjustment_width(adjustment_width)
5169 .kernel_size(3, 3)
5170 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005171 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005172 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005173 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005174 }
5175}
5176
Marat Dukhan08b7a972020-07-14 18:17:29 -07005177TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005178 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005179 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005180 DeconvolutionOperatorTester()
5181 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005182 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005183 .padding(1)
5184 .kernel_size(3, 3)
5185 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005186 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005187 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005188 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005189 }
5190}
5191
Marat Dukhan08b7a972020-07-14 18:17:29 -07005192TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005193 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005194 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005195 DeconvolutionOperatorTester()
5196 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005197 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005198 .padding(1)
5199 .kernel_size(3, 3)
5200 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005201 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005202 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005203 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005204 }
5205}
5206
Marat Dukhan08b7a972020-07-14 18:17:29 -07005207TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005208 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005209 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
5210 DeconvolutionOperatorTester()
5211 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005212 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005213 .padding(1)
5214 .kernel_size(3, 3)
5215 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005216 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005217 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005218 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005219 }
5220}
5221
Marat Dukhan08b7a972020-07-14 18:17:29 -07005222TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005223 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07005224 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005225 DeconvolutionOperatorTester()
5226 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005227 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005228 .padding(1)
5229 .kernel_size(3, 3)
5230 .group_input_channels(23)
5231 .group_output_channels(output_channels)
5232 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005233 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005234 }
5235}
5236
Marat Dukhan08b7a972020-07-14 18:17:29 -07005237TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005238 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005239 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
5240 DeconvolutionOperatorTester()
5241 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005242 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005243 .padding(1)
5244 .kernel_size(3, 3)
5245 .dilation_height(dilation_height)
5246 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005247 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005248 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005249 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005250 }
5251}
5252
Marat Dukhan08b7a972020-07-14 18:17:29 -07005253TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005254 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005255 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
5256 DeconvolutionOperatorTester()
5257 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005258 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005259 .padding(1)
5260 .kernel_size(3, 3)
5261 .dilation_width(dilation_width)
5262 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005263 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005264 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005265 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005266 }
5267}
5268
Marat Dukhan08b7a972020-07-14 18:17:29 -07005269TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005270 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005271 DeconvolutionOperatorTester()
5272 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005273 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005274 .padding(1)
5275 .kernel_size(3, 3)
5276 .dilation_height(3)
5277 .stride_height(2)
5278 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005279 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005280 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005281 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005282}
5283
Marat Dukhan08b7a972020-07-14 18:17:29 -07005284TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005285 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005286 DeconvolutionOperatorTester()
5287 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005288 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005289 .padding(1)
5290 .kernel_size(3, 3)
5291 .dilation_width(3)
5292 .stride_width(2)
5293 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005294 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005295 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005296 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005297}
5298
Marat Dukhan08b7a972020-07-14 18:17:29 -07005299TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005300 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005301 DeconvolutionOperatorTester()
5302 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005303 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005304 .padding(1)
5305 .kernel_size(3, 3)
5306 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005307 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005308 .input_pixel_stride(28)
5309 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005310 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005311}
5312
Marat Dukhan08b7a972020-07-14 18:17:29 -07005313TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005314 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005315 DeconvolutionOperatorTester()
5316 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005317 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005318 .padding(1)
5319 .kernel_size(3, 3)
5320 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005321 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
5322 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005323 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005324 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005325}
5326
Marat Dukhan08b7a972020-07-14 18:17:29 -07005327TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005328 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005329 DeconvolutionOperatorTester()
5330 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005331 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005332 .padding(1)
5333 .kernel_size(3, 3)
5334 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005335 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005336 .qmin(128)
5337 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005338 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005339}
5340
Marat Dukhan08b7a972020-07-14 18:17:29 -07005341TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005342 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005343 DeconvolutionOperatorTester()
5344 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005345 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005346 .padding(1)
5347 .kernel_size(3, 3)
5348 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005349 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005350 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005351 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005352 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005353}
5354
Marat Dukhan08b7a972020-07-14 18:17:29 -07005355TEST(DECONVOLUTION_NHWC_QU8, batched_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005356 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07005357 DeconvolutionOperatorTester()
5358 .has_bias(false)
5359 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005360 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005361 .padding(1)
5362 .kernel_size(3, 3)
5363 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005364 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07005365 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005366 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07005367}
5368
XNNPACK Teamb455b122019-09-27 18:10:33 -07005369/**************************** CONV path, grouped, batched ****************************/
5370
Marat Dukhan08b7a972020-07-14 18:17:29 -07005371TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005372 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005373 DeconvolutionOperatorTester()
5374 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005375 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005376 .padding(1)
5377 .kernel_size(3, 3)
5378 .groups(2)
5379 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005380 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005381 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005382 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005383}
5384
Marat Dukhan08b7a972020-07-14 18:17:29 -07005385TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005386 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005387 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
5388 DeconvolutionOperatorTester()
5389 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005390 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005391 .padding_width(1)
5392 .kernel_size(kernel_height, 3)
5393 .groups(2)
5394 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005395 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005396 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005397 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005398 }
5399}
5400
Marat Dukhan08b7a972020-07-14 18:17:29 -07005401TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005402 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005403 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
5404 DeconvolutionOperatorTester()
5405 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005406 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005407 .padding_height(1)
5408 .kernel_size(3, kernel_width)
5409 .groups(2)
5410 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005411 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005412 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005413 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005414 }
5415}
5416
Marat Dukhan08b7a972020-07-14 18:17:29 -07005417TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005418 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005419 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5420 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5421 DeconvolutionOperatorTester()
5422 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005423 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005424 .padding_width(1)
5425 .padding_top(padding_top)
5426 .padding_bottom(padding_bottom)
5427 .kernel_size(3, 3)
5428 .groups(2)
5429 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005430 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005431 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005432 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005433 }
5434 }
5435}
5436
Marat Dukhan08b7a972020-07-14 18:17:29 -07005437TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005438 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005439 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5440 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5441 DeconvolutionOperatorTester()
5442 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005443 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005444 .padding_height(1)
5445 .padding_left(padding_left)
5446 .padding_right(padding_right)
5447 .kernel_size(3, 3)
5448 .groups(2)
5449 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005450 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005451 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005452 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005453 }
5454 }
5455}
5456
Marat Dukhan08b7a972020-07-14 18:17:29 -07005457TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005458 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005459 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
5460 DeconvolutionOperatorTester()
5461 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005462 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005463 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08005464 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005465 .adjustment_height(adjustment_height)
5466 .kernel_size(3, 3)
5467 .groups(2)
5468 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005469 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005470 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005471 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005472 }
5473}
5474
Marat Dukhan08b7a972020-07-14 18:17:29 -07005475TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005476 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005477 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
5478 DeconvolutionOperatorTester()
5479 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005480 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005481 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08005482 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005483 .adjustment_width(adjustment_width)
5484 .kernel_size(3, 3)
5485 .groups(2)
5486 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005487 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005488 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005489 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005490 }
5491}
5492
Marat Dukhan08b7a972020-07-14 18:17:29 -07005493TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005494 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005495 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005496 DeconvolutionOperatorTester()
5497 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005498 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005499 .padding(1)
5500 .kernel_size(3, 3)
5501 .groups(2)
5502 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005503 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005504 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005505 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005506 }
5507}
5508
Marat Dukhan08b7a972020-07-14 18:17:29 -07005509TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005510 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005511 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005512 DeconvolutionOperatorTester()
5513 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005514 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005515 .padding(1)
5516 .kernel_size(3, 3)
5517 .groups(2)
5518 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005519 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005520 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005521 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005522 }
5523}
5524
Marat Dukhan08b7a972020-07-14 18:17:29 -07005525TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005526 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005527 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
5528 DeconvolutionOperatorTester()
5529 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005530 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005531 .padding(1)
5532 .kernel_size(3, 3)
5533 .groups(2)
5534 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005535 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005536 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005537 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005538 }
5539}
5540
Marat Dukhan08b7a972020-07-14 18:17:29 -07005541TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005542 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07005543 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005544 DeconvolutionOperatorTester()
5545 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005546 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005547 .padding(1)
5548 .kernel_size(3, 3)
5549 .groups(2)
5550 .group_input_channels(23)
5551 .group_output_channels(output_channels)
5552 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005553 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005554 }
5555}
5556
Marat Dukhan08b7a972020-07-14 18:17:29 -07005557TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005558 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005559 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
5560 DeconvolutionOperatorTester()
5561 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005562 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005563 .padding(1)
5564 .kernel_size(3, 3)
5565 .dilation_height(dilation_height)
5566 .groups(2)
5567 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005568 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005569 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005570 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005571 }
5572}
5573
Marat Dukhan08b7a972020-07-14 18:17:29 -07005574TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005575 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005576 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
5577 DeconvolutionOperatorTester()
5578 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005579 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005580 .padding(1)
5581 .kernel_size(3, 3)
5582 .dilation_width(dilation_width)
5583 .groups(2)
5584 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005585 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005586 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005587 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005588 }
5589}
5590
Marat Dukhan08b7a972020-07-14 18:17:29 -07005591TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005592 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005593 DeconvolutionOperatorTester()
5594 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005595 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005596 .padding(1)
5597 .kernel_size(3, 3)
5598 .dilation_height(3)
5599 .stride_width(2)
5600 .groups(2)
5601 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005602 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005603 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005604 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005605}
5606
Marat Dukhan08b7a972020-07-14 18:17:29 -07005607TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005608 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005609 DeconvolutionOperatorTester()
5610 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005611 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005612 .padding(1)
5613 .kernel_size(3, 3)
5614 .dilation_width(3)
5615 .stride_width(2)
5616 .groups(2)
5617 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005618 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005619 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005620 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005621}
5622
Marat Dukhan08b7a972020-07-14 18:17:29 -07005623TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005624 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005625 DeconvolutionOperatorTester()
5626 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005627 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005628 .padding(1)
5629 .kernel_size(3, 3)
5630 .groups(2)
5631 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005632 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005633 .input_pixel_stride(47)
5634 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005635 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005636}
5637
Marat Dukhan08b7a972020-07-14 18:17:29 -07005638TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005639 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005640 DeconvolutionOperatorTester()
5641 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005642 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005643 .padding(1)
5644 .kernel_size(3, 3)
5645 .groups(2)
5646 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005647 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
5648 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005649 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005650 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005651}
5652
Marat Dukhan08b7a972020-07-14 18:17:29 -07005653TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005654 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005655 DeconvolutionOperatorTester()
5656 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005657 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005658 .padding(1)
5659 .kernel_size(3, 3)
5660 .groups(2)
5661 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005662 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005663 .qmin(128)
5664 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005665 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005666}
5667
Marat Dukhan08b7a972020-07-14 18:17:29 -07005668TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005669 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005670 DeconvolutionOperatorTester()
5671 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005672 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005673 .padding(1)
5674 .kernel_size(3, 3)
5675 .groups(2)
5676 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005677 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07005678 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005679 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005680 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005681}
5682
Marat Dukhan08b7a972020-07-14 18:17:29 -07005683TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005684 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07005685 DeconvolutionOperatorTester()
5686 .has_bias(false)
5687 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005688 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07005689 .padding(1)
5690 .kernel_size(3, 3)
5691 .groups(2)
5692 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005693 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07005694 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005695 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07005696}
5697
XNNPACK Teamb455b122019-09-27 18:10:33 -07005698/**************************** CONV path, setup ****************************/
5699
Marat Dukhan08b7a972020-07-14 18:17:29 -07005700TEST(DECONVOLUTION_NHWC_QU8, 3x3_setup_changing_batch) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005701 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005702 DeconvolutionOperatorTester()
5703 .batch_size(2)
5704 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08005705 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005706 .kernel_height(3)
5707 .kernel_width(5)
5708 .groups(2)
5709 .group_input_channels(15)
5710 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005711 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005712}
5713
Marat Dukhan08b7a972020-07-14 18:17:29 -07005714TEST(DECONVOLUTION_NHWC_QU8, 3x3_setup_changing_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005715 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005716 DeconvolutionOperatorTester()
5717 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005718 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
5719 .next_input_height(kUnstridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005720 .kernel_height(3)
5721 .kernel_width(5)
5722 .groups(2)
5723 .group_input_channels(15)
5724 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005725 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005726}
5727
Marat Dukhan08b7a972020-07-14 18:17:29 -07005728TEST(DECONVOLUTION_NHWC_QU8, 3x3_setup_changing_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005729 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005730 DeconvolutionOperatorTester()
5731 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08005732 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
5733 .next_input_width(kUnstridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005734 .kernel_height(3)
5735 .kernel_width(5)
5736 .groups(2)
5737 .group_input_channels(15)
5738 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005739 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005740}
5741
Marat Dukhan29954272020-02-13 17:56:11 -08005742/**************************** SUBCONV2D/IGEMM path ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07005743
Marat Dukhan08b7a972020-07-14 18:17:29 -07005744TEST(DECONVOLUTION_NHWC_QU8, 3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005745 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005746 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005747 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005748 .padding(1)
5749 .kernel_size(3, 3)
5750 .stride(2)
5751 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005752 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005753 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005754 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005755}
5756
Marat Dukhan08b7a972020-07-14 18:17:29 -07005757TEST(DECONVOLUTION_NHWC_QU8, Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005758 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005759 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
5760 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005761 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005762 .padding_width(1)
5763 .kernel_size(kernel_height, 3)
5764 .stride(2)
5765 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005766 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005767 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005768 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005769 }
5770}
5771
Marat Dukhan08b7a972020-07-14 18:17:29 -07005772TEST(DECONVOLUTION_NHWC_QU8, 3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005773 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005774 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
5775 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005776 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005777 .padding_height(1)
5778 .kernel_size(3, kernel_width)
5779 .stride(2)
5780 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005781 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005782 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005783 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005784 }
5785}
5786
Marat Dukhan08b7a972020-07-14 18:17:29 -07005787TEST(DECONVOLUTION_NHWC_QU8, 3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005788 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005789 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
5790 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005791 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005792 .padding(1)
5793 .padding_width(1)
5794 .kernel_size(3, 3)
5795 .stride_height(stride_height)
5796 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005797 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005798 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005799 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005800 }
5801}
5802
Marat Dukhan08b7a972020-07-14 18:17:29 -07005803TEST(DECONVOLUTION_NHWC_QU8, 3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005804 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005805 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
5806 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005807 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005808 .padding(1)
5809 .padding_width(1)
5810 .kernel_size(3, 3)
5811 .stride_width(stride_width)
5812 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005813 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005814 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005815 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005816 }
5817}
5818
Marat Dukhan08b7a972020-07-14 18:17:29 -07005819TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005820 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005821 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
5822 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
5823 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005824 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005825 .padding_width(1)
5826 .padding_top(padding_top)
5827 .padding_bottom(padding_bottom)
5828 .kernel_size(3, 3)
5829 .stride(2)
5830 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005831 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005832 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005833 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005834 }
5835 }
5836}
5837
Marat Dukhan08b7a972020-07-14 18:17:29 -07005838TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005839 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005840 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
5841 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
5842 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005843 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005844 .padding_height(1)
5845 .padding_left(padding_left)
5846 .padding_right(padding_right)
5847 .kernel_size(3, 3)
5848 .stride(2)
5849 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005850 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005851 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005852 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005853 }
5854 }
5855}
5856
Marat Dukhan08b7a972020-07-14 18:17:29 -07005857TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005858 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08005859 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005860 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005861 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005862 .padding(1)
5863 .adjustment_height(adjustment_height)
5864 .kernel_size(3, 3)
5865 .stride(2)
5866 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005867 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005868 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005869 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005870 }
5871}
5872
Marat Dukhan08b7a972020-07-14 18:17:29 -07005873TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005874 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08005875 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005876 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005877 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005878 .padding(1)
5879 .adjustment_width(adjustment_width)
5880 .kernel_size(3, 3)
5881 .stride(2)
5882 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005883 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005884 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005885 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005886 }
5887}
5888
Marat Dukhan08b7a972020-07-14 18:17:29 -07005889TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005890 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005891 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005892 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005893 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005894 .padding(1)
5895 .kernel_size(3, 3)
5896 .stride(2)
5897 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005898 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005899 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005900 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005901 }
5902}
5903
Marat Dukhan08b7a972020-07-14 18:17:29 -07005904TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005905 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08005906 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005907 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005908 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005909 .padding(1)
5910 .kernel_size(3, 3)
5911 .stride(2)
5912 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005913 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005914 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005915 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005916 }
5917}
5918
Marat Dukhan08b7a972020-07-14 18:17:29 -07005919TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005920 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005921 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
5922 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005923 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005924 .padding(1)
5925 .kernel_size(3, 3)
5926 .stride(2)
5927 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005928 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005929 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005930 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005931 }
5932}
5933
Marat Dukhan08b7a972020-07-14 18:17:29 -07005934TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005935 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07005936 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07005937 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005938 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005939 .padding(1)
5940 .kernel_size(3, 3)
5941 .stride(2)
5942 .group_input_channels(23)
5943 .group_output_channels(output_channels)
5944 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005945 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005946 }
5947}
5948
Marat Dukhan08b7a972020-07-14 18:17:29 -07005949TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005950 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005951 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005952 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005953 .padding(1)
5954 .kernel_size(3, 3)
5955 .stride(2)
5956 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005957 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005958 .input_pixel_stride(28)
5959 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005960 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005961}
5962
Marat Dukhan08b7a972020-07-14 18:17:29 -07005963TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005964 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005965 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005966 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005967 .padding(1)
5968 .kernel_size(3, 3)
5969 .stride(2)
5970 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005971 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
5972 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005973 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005974 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005975}
5976
Marat Dukhan08b7a972020-07-14 18:17:29 -07005977TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005978 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005979 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005980 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005981 .padding(1)
5982 .kernel_size(3, 3)
5983 .stride(2)
5984 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005985 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005986 .qmin(128)
5987 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005988 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07005989}
5990
Marat Dukhan08b7a972020-07-14 18:17:29 -07005991TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08005992 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07005993 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08005994 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07005995 .padding(1)
5996 .kernel_size(3, 3)
5997 .stride(2)
5998 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07005999 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07006000 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006001 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006002 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006003}
6004
Marat Dukhan08b7a972020-07-14 18:17:29 -07006005TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006006 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07006007 DeconvolutionOperatorTester()
6008 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08006009 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07006010 .padding(1)
6011 .kernel_size(3, 3)
6012 .stride(2)
6013 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006014 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07006015 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006016 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07006017}
6018
Marat Dukhan29954272020-02-13 17:56:11 -08006019/**************************** SUBCONV2D/IGEMM path, grouped ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07006020
Marat Dukhan08b7a972020-07-14 18:17:29 -07006021TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006022 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006023 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006024 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006025 .padding(1)
6026 .kernel_size(3, 3)
6027 .stride(2)
6028 .groups(2)
6029 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006030 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006031 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006032 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006033}
6034
Marat Dukhan08b7a972020-07-14 18:17:29 -07006035TEST(DECONVOLUTION_NHWC_QU8, grouped_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006036 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006037 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
6038 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006039 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006040 .padding_width(1)
6041 .kernel_size(kernel_height, 3)
6042 .stride(2)
6043 .groups(2)
6044 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006045 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006046 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006047 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006048 }
6049}
6050
Marat Dukhan08b7a972020-07-14 18:17:29 -07006051TEST(DECONVOLUTION_NHWC_QU8, grouped_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006052 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006053 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
6054 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006055 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006056 .padding_height(1)
6057 .kernel_size(3, kernel_width)
6058 .stride(2)
6059 .groups(2)
6060 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006061 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006062 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006063 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006064 }
6065}
6066
Marat Dukhan08b7a972020-07-14 18:17:29 -07006067TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006068 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006069 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
6070 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006071 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006072 .padding(1)
6073 .padding_width(1)
6074 .kernel_size(3, 3)
6075 .stride_height(stride_height)
6076 .groups(2)
6077 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006078 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006079 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006080 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006081 }
6082}
6083
Marat Dukhan08b7a972020-07-14 18:17:29 -07006084TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006085 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006086 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
6087 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006088 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006089 .padding(1)
6090 .padding_width(1)
6091 .kernel_size(3, 3)
6092 .stride_width(stride_width)
6093 .groups(2)
6094 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006095 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006096 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006097 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006098 }
6099}
6100
Marat Dukhan08b7a972020-07-14 18:17:29 -07006101TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006102 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006103 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
6104 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
6105 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006106 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006107 .padding_width(1)
6108 .padding_top(padding_top)
6109 .padding_bottom(padding_bottom)
6110 .kernel_size(3, 3)
6111 .stride(2)
6112 .groups(2)
6113 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006114 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006115 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006116 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006117 }
6118 }
6119}
6120
Marat Dukhan08b7a972020-07-14 18:17:29 -07006121TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006122 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006123 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
6124 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
6125 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006126 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006127 .padding_height(1)
6128 .padding_left(padding_left)
6129 .padding_right(padding_right)
6130 .kernel_size(3, 3)
6131 .stride(2)
6132 .groups(2)
6133 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006134 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006135 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006136 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006137 }
6138 }
6139}
6140
Marat Dukhan08b7a972020-07-14 18:17:29 -07006141TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006142 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006143 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006144 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006145 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006146 .padding(1)
6147 .adjustment_height(adjustment_height)
6148 .kernel_size(3, 3)
6149 .stride(2)
6150 .groups(2)
6151 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006152 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006153 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006154 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006155 }
6156}
6157
Marat Dukhan08b7a972020-07-14 18:17:29 -07006158TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006159 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006160 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006161 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006162 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006163 .padding(1)
6164 .adjustment_width(adjustment_width)
6165 .kernel_size(3, 3)
6166 .stride(2)
6167 .groups(2)
6168 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006169 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006170 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006171 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006172 }
6173}
6174
Marat Dukhan08b7a972020-07-14 18:17:29 -07006175TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006176 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006177 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006178 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006179 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006180 .padding(1)
6181 .kernel_size(3, 3)
6182 .stride(2)
6183 .groups(2)
6184 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006185 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006186 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006187 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006188 }
6189}
6190
Marat Dukhan08b7a972020-07-14 18:17:29 -07006191TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006192 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006193 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006194 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006195 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006196 .padding(1)
6197 .kernel_size(3, 3)
6198 .stride(2)
6199 .groups(2)
6200 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006201 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006202 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006203 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006204 }
6205}
6206
Marat Dukhan08b7a972020-07-14 18:17:29 -07006207TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006208 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006209 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
6210 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006211 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006212 .padding(1)
6213 .kernel_size(3, 3)
6214 .stride(2)
6215 .groups(2)
6216 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006217 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006218 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006219 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006220 }
6221}
6222
Marat Dukhan08b7a972020-07-14 18:17:29 -07006223TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006224 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07006225 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006226 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006227 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006228 .padding(1)
6229 .kernel_size(3, 3)
6230 .stride(2)
6231 .groups(2)
6232 .group_input_channels(17)
6233 .group_output_channels(output_channels)
6234 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006235 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006236 }
6237}
6238
Marat Dukhan08b7a972020-07-14 18:17:29 -07006239TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006240 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006241 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006242 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006243 .padding(1)
6244 .kernel_size(3, 3)
6245 .stride(2)
6246 .groups(2)
6247 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006248 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006249 .input_pixel_stride(37)
6250 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006251 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006252}
6253
Marat Dukhan08b7a972020-07-14 18:17:29 -07006254TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006255 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006256 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006257 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006258 .padding(1)
6259 .kernel_size(3, 3)
6260 .stride(2)
6261 .groups(2)
6262 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006263 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
6264 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006265 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006266 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006267}
6268
Marat Dukhan08b7a972020-07-14 18:17:29 -07006269TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006270 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006271 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006272 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006273 .padding(1)
6274 .kernel_size(3, 3)
6275 .stride(2)
6276 .groups(2)
6277 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006278 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006279 .qmin(128)
6280 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006281 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006282}
6283
Marat Dukhan08b7a972020-07-14 18:17:29 -07006284TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006285 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006286 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08006287 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006288 .padding(1)
6289 .kernel_size(3, 3)
6290 .stride(2)
6291 .groups(2)
6292 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006293 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07006294 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006295 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006296 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006297}
6298
Marat Dukhan08b7a972020-07-14 18:17:29 -07006299TEST(DECONVOLUTION_NHWC_QU8, grouped_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006300 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07006301 DeconvolutionOperatorTester()
6302 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08006303 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07006304 .padding(1)
6305 .kernel_size(3, 3)
6306 .stride(2)
6307 .groups(2)
6308 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006309 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07006310 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006311 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07006312}
6313
Marat Dukhan29954272020-02-13 17:56:11 -08006314/**************************** SUBCONV2D/IGEMM path, batched ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07006315
Marat Dukhan08b7a972020-07-14 18:17:29 -07006316TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006317 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006318 DeconvolutionOperatorTester()
6319 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006320 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006321 .padding(1)
6322 .kernel_size(3, 3)
6323 .stride(2)
6324 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006325 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006326 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006327 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006328}
6329
Marat Dukhan08b7a972020-07-14 18:17:29 -07006330TEST(DECONVOLUTION_NHWC_QU8, batched_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006331 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006332 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
6333 DeconvolutionOperatorTester()
6334 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006335 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006336 .padding_width(1)
6337 .kernel_size(kernel_height, 3)
6338 .stride(2)
6339 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006340 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006341 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006342 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006343 }
6344}
6345
Marat Dukhan08b7a972020-07-14 18:17:29 -07006346TEST(DECONVOLUTION_NHWC_QU8, batched_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006347 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006348 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
6349 DeconvolutionOperatorTester()
6350 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006351 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006352 .padding_height(1)
6353 .kernel_size(3, kernel_width)
6354 .stride(2)
6355 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006356 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006357 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006358 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006359 }
6360}
6361
Marat Dukhan08b7a972020-07-14 18:17:29 -07006362TEST(DECONVOLUTION_NHWC_QU8, batched_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006363 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006364 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
6365 DeconvolutionOperatorTester()
6366 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006367 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006368 .padding(1)
6369 .padding_width(1)
6370 .kernel_size(3, 3)
6371 .stride_height(stride_height)
6372 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006373 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006374 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006375 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006376 }
6377}
6378
Marat Dukhan08b7a972020-07-14 18:17:29 -07006379TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006380 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006381 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
6382 DeconvolutionOperatorTester()
6383 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006384 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006385 .padding(1)
6386 .padding_width(1)
6387 .kernel_size(3, 3)
6388 .stride_width(stride_width)
6389 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006390 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006391 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006392 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006393 }
6394}
6395
Marat Dukhan08b7a972020-07-14 18:17:29 -07006396TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006397 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006398 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
6399 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
6400 DeconvolutionOperatorTester()
6401 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006402 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006403 .padding_width(1)
6404 .padding_top(padding_top)
6405 .padding_bottom(padding_bottom)
6406 .kernel_size(3, 3)
6407 .stride(2)
6408 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006409 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006410 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006411 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006412 }
6413 }
6414}
6415
Marat Dukhan08b7a972020-07-14 18:17:29 -07006416TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006417 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006418 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
6419 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
6420 DeconvolutionOperatorTester()
6421 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006422 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006423 .padding_height(1)
6424 .padding_left(padding_left)
6425 .padding_right(padding_right)
6426 .kernel_size(3, 3)
6427 .stride(2)
6428 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006429 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006430 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006431 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006432 }
6433 }
6434}
6435
Marat Dukhan08b7a972020-07-14 18:17:29 -07006436TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006437 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006438 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006439 DeconvolutionOperatorTester()
6440 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006441 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006442 .padding(1)
6443 .adjustment_height(adjustment_height)
6444 .kernel_size(3, 3)
6445 .stride(2)
6446 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006447 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006448 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006449 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006450 }
6451}
6452
Marat Dukhan08b7a972020-07-14 18:17:29 -07006453TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006454 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006455 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006456 DeconvolutionOperatorTester()
6457 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006458 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006459 .padding(1)
6460 .adjustment_width(adjustment_width)
6461 .kernel_size(3, 3)
6462 .stride(2)
6463 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006464 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006465 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006466 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006467 }
6468}
6469
Marat Dukhan08b7a972020-07-14 18:17:29 -07006470TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006471 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006472 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006473 DeconvolutionOperatorTester()
6474 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006475 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006476 .padding(1)
6477 .kernel_size(3, 3)
6478 .stride(2)
6479 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006480 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006481 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006482 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006483 }
6484}
6485
Marat Dukhan08b7a972020-07-14 18:17:29 -07006486TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006487 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006488 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006489 DeconvolutionOperatorTester()
6490 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006491 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006492 .padding(1)
6493 .kernel_size(3, 3)
6494 .stride(2)
6495 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006496 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006497 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006498 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006499 }
6500}
6501
Marat Dukhan08b7a972020-07-14 18:17:29 -07006502TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006503 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006504 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
6505 DeconvolutionOperatorTester()
6506 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006507 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006508 .padding(1)
6509 .kernel_size(3, 3)
6510 .stride(2)
6511 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006512 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006513 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006514 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006515 }
6516}
6517
Marat Dukhan08b7a972020-07-14 18:17:29 -07006518TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006519 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07006520 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006521 DeconvolutionOperatorTester()
6522 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006523 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006524 .padding(1)
6525 .kernel_size(3, 3)
6526 .stride(2)
6527 .group_input_channels(23)
6528 .group_output_channels(output_channels)
6529 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006530 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006531 }
6532}
6533
Marat Dukhan08b7a972020-07-14 18:17:29 -07006534TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006535 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006536 DeconvolutionOperatorTester()
6537 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006538 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006539 .padding(1)
6540 .kernel_size(3, 3)
6541 .stride(2)
6542 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006543 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006544 .input_pixel_stride(28)
6545 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006546 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006547}
6548
Marat Dukhan08b7a972020-07-14 18:17:29 -07006549TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006550 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006551 DeconvolutionOperatorTester()
6552 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006553 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006554 .padding(1)
6555 .kernel_size(3, 3)
6556 .stride(2)
6557 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006558 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
6559 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006560 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006561 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006562}
6563
Marat Dukhan08b7a972020-07-14 18:17:29 -07006564TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006565 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006566 DeconvolutionOperatorTester()
6567 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006568 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006569 .padding(1)
6570 .kernel_size(3, 3)
6571 .stride(2)
6572 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006573 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006574 .qmin(128)
6575 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006576 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006577}
6578
Marat Dukhan08b7a972020-07-14 18:17:29 -07006579TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006580 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006581 DeconvolutionOperatorTester()
6582 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006583 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006584 .padding(1)
6585 .kernel_size(3, 3)
6586 .stride(2)
6587 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006588 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07006589 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006590 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006591 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006592}
6593
Marat Dukhan08b7a972020-07-14 18:17:29 -07006594TEST(DECONVOLUTION_NHWC_QU8, batched_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006595 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07006596 DeconvolutionOperatorTester()
6597 .has_bias(false)
6598 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006599 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07006600 .padding(1)
6601 .kernel_size(3, 3)
6602 .stride(2)
6603 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006604 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07006605 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006606 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07006607}
6608
Marat Dukhan29954272020-02-13 17:56:11 -08006609/**************************** SUBCONV2D/IGEMM path, grouped, batched ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07006610
Marat Dukhan08b7a972020-07-14 18:17:29 -07006611TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006612 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006613 DeconvolutionOperatorTester()
6614 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006615 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006616 .padding(1)
6617 .kernel_size(3, 3)
6618 .stride(2)
6619 .groups(2)
6620 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006621 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006622 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006623 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006624}
6625
Marat Dukhan08b7a972020-07-14 18:17:29 -07006626TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006627 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006628 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
6629 DeconvolutionOperatorTester()
6630 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006631 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006632 .padding_width(1)
6633 .kernel_size(kernel_height, 3)
6634 .stride(2)
6635 .groups(2)
6636 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006637 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006638 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006639 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006640 }
6641}
6642
Marat Dukhan08b7a972020-07-14 18:17:29 -07006643TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006644 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006645 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
6646 DeconvolutionOperatorTester()
6647 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006648 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006649 .padding_height(1)
6650 .kernel_size(3, kernel_width)
6651 .stride(2)
6652 .groups(2)
6653 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006654 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006655 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006656 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006657 }
6658}
6659
Marat Dukhan08b7a972020-07-14 18:17:29 -07006660TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006661 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006662 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
6663 DeconvolutionOperatorTester()
6664 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006665 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006666 .padding(1)
6667 .padding_width(1)
6668 .kernel_size(3, 3)
6669 .stride_height(stride_height)
6670 .groups(2)
6671 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006672 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006673 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006674 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006675 }
6676}
6677
Marat Dukhan08b7a972020-07-14 18:17:29 -07006678TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006679 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006680 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
6681 DeconvolutionOperatorTester()
6682 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006683 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006684 .padding(1)
6685 .padding_width(1)
6686 .kernel_size(3, 3)
6687 .stride_width(stride_width)
6688 .groups(2)
6689 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006690 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006691 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006692 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006693 }
6694}
6695
Marat Dukhan08b7a972020-07-14 18:17:29 -07006696TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006697 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006698 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
6699 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
6700 DeconvolutionOperatorTester()
6701 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006702 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006703 .padding_width(1)
6704 .padding_top(padding_top)
6705 .padding_bottom(padding_bottom)
6706 .kernel_size(3, 3)
6707 .stride(2)
6708 .groups(2)
6709 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006710 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006711 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006712 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006713 }
6714 }
6715}
6716
Marat Dukhan08b7a972020-07-14 18:17:29 -07006717TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006718 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006719 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
6720 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
6721 DeconvolutionOperatorTester()
6722 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006723 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006724 .padding_height(1)
6725 .padding_left(padding_left)
6726 .padding_right(padding_right)
6727 .kernel_size(3, 3)
6728 .stride(2)
6729 .groups(2)
6730 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006731 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006732 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006733 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006734 }
6735 }
6736}
6737
Marat Dukhan08b7a972020-07-14 18:17:29 -07006738TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006739 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006740 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006741 DeconvolutionOperatorTester()
6742 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006743 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006744 .padding(1)
6745 .adjustment_height(adjustment_height)
6746 .kernel_size(3, 3)
6747 .stride(2)
6748 .groups(2)
6749 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006750 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006751 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006752 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006753 }
6754}
6755
Marat Dukhan08b7a972020-07-14 18:17:29 -07006756TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006757 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08006758 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006759 DeconvolutionOperatorTester()
6760 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006761 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006762 .padding(1)
6763 .adjustment_width(adjustment_width)
6764 .kernel_size(3, 3)
6765 .stride(2)
6766 .groups(2)
6767 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006768 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006769 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006770 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006771 }
6772}
6773
Marat Dukhan08b7a972020-07-14 18:17:29 -07006774TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006775 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006776 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006777 DeconvolutionOperatorTester()
6778 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006779 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006780 .padding(1)
6781 .kernel_size(3, 3)
6782 .stride(2)
6783 .groups(2)
6784 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006785 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006786 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006787 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006788 }
6789}
6790
Marat Dukhan08b7a972020-07-14 18:17:29 -07006791TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006792 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08006793 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006794 DeconvolutionOperatorTester()
6795 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006796 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006797 .padding(1)
6798 .kernel_size(3, 3)
6799 .stride(2)
6800 .groups(2)
6801 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006802 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006803 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006804 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006805 }
6806}
6807
Marat Dukhan08b7a972020-07-14 18:17:29 -07006808TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006809 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006810 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
6811 DeconvolutionOperatorTester()
6812 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006813 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006814 .padding(1)
6815 .kernel_size(3, 3)
6816 .stride(2)
6817 .groups(2)
6818 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006819 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006820 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006821 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006822 }
6823}
6824
Marat Dukhan08b7a972020-07-14 18:17:29 -07006825TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006826 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07006827 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07006828 DeconvolutionOperatorTester()
6829 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006830 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006831 .padding(1)
6832 .kernel_size(3, 3)
6833 .stride(2)
6834 .groups(2)
6835 .group_input_channels(17)
6836 .group_output_channels(output_channels)
6837 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006838 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006839 }
6840}
6841
Marat Dukhan08b7a972020-07-14 18:17:29 -07006842TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006843 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006844 DeconvolutionOperatorTester()
6845 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006846 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006847 .padding(1)
6848 .kernel_size(3, 3)
6849 .stride(2)
6850 .groups(2)
6851 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006852 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006853 .input_pixel_stride(37)
6854 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006855 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006856}
6857
Marat Dukhan08b7a972020-07-14 18:17:29 -07006858TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006859 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006860 DeconvolutionOperatorTester()
6861 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006862 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006863 .padding(1)
6864 .kernel_size(3, 3)
6865 .stride(2)
6866 .groups(2)
6867 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006868 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
6869 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006870 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006871 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006872}
6873
Marat Dukhan08b7a972020-07-14 18:17:29 -07006874TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006875 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006876 DeconvolutionOperatorTester()
6877 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006878 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006879 .padding(1)
6880 .kernel_size(3, 3)
6881 .stride(2)
6882 .groups(2)
6883 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006884 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006885 .qmin(128)
6886 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006887 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006888}
6889
Marat Dukhan08b7a972020-07-14 18:17:29 -07006890TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006891 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006892 DeconvolutionOperatorTester()
6893 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006894 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006895 .padding(1)
6896 .kernel_size(3, 3)
6897 .stride(2)
6898 .groups(2)
6899 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006900 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07006901 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006902 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006903 .TestQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006904}
6905
Marat Dukhan08b7a972020-07-14 18:17:29 -07006906TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006907 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07006908 DeconvolutionOperatorTester()
6909 .has_bias(false)
6910 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006911 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07006912 .padding(1)
6913 .kernel_size(3, 3)
6914 .stride(2)
6915 .groups(2)
6916 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006917 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhanf568f082019-10-30 09:47:07 -07006918 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006919 .TestQU8();
Marat Dukhanf568f082019-10-30 09:47:07 -07006920}
6921
Marat Dukhan29954272020-02-13 17:56:11 -08006922/**************************** SUBCONV2D/IGEMM path, setup ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07006923
Marat Dukhan08b7a972020-07-14 18:17:29 -07006924TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_setup_changing_batch) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006925 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006926 DeconvolutionOperatorTester()
6927 .batch_size(2)
6928 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08006929 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006930 .kernel_height(3)
6931 .kernel_width(5)
6932 .stride(2)
6933 .groups(2)
6934 .group_input_channels(15)
6935 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006936 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006937}
6938
Marat Dukhan08b7a972020-07-14 18:17:29 -07006939TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_setup_changing_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006940 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006941 DeconvolutionOperatorTester()
6942 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006943 .input_size(kStridedInputHeight, kStridedInputWidth)
6944 .next_input_height(kStridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006945 .kernel_height(3)
6946 .kernel_width(5)
6947 .stride(2)
6948 .groups(2)
6949 .group_input_channels(15)
6950 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006951 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006952}
6953
Marat Dukhan08b7a972020-07-14 18:17:29 -07006954TEST(DECONVOLUTION_NHWC_QU8, 3x3s2_setup_changing_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08006955 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07006956 DeconvolutionOperatorTester()
6957 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08006958 .input_size(kStridedInputHeight, kStridedInputWidth)
6959 .next_input_width(kStridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07006960 .kernel_height(3)
6961 .kernel_width(5)
6962 .stride(2)
6963 .groups(2)
6964 .group_input_channels(15)
6965 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006966 .TestSetupQU8();
XNNPACK Teamb455b122019-09-27 18:10:33 -07006967}
6968
Marat Dukhan29954272020-02-13 17:56:11 -08006969/**************************** SUBCONV2D/GEMM path ****************************/
6970
Marat Dukhan08b7a972020-07-14 18:17:29 -07006971TEST(DECONVOLUTION_NHWC_QU8, 2x2s2) {
Marat Dukhan29954272020-02-13 17:56:11 -08006972 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
6973 DeconvolutionOperatorTester()
6974 .input_size(kStridedInputHeight, kStridedInputWidth)
6975 .kernel_size(2, 2)
6976 .stride(2)
6977 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006978 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08006979 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006980 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08006981}
6982
Marat Dukhan08b7a972020-07-14 18:17:29 -07006983TEST(DECONVOLUTION_NHWC_QU8, Kx2sKx2) {
Marat Dukhan29954272020-02-13 17:56:11 -08006984 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
6985 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
6986 DeconvolutionOperatorTester()
6987 .input_size(kStridedInputHeight, kStridedInputWidth)
6988 .kernel_size(kernel_height, 2)
6989 .stride(kernel_height, 2)
6990 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006991 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08006992 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07006993 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08006994 }
6995}
6996
Marat Dukhan08b7a972020-07-14 18:17:29 -07006997TEST(DECONVOLUTION_NHWC_QU8, 2xKs2xK) {
Marat Dukhan29954272020-02-13 17:56:11 -08006998 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
6999 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
7000 DeconvolutionOperatorTester()
7001 .input_size(kStridedInputHeight, kStridedInputWidth)
7002 .kernel_size(2, kernel_width)
7003 .stride(2, kernel_width)
7004 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007005 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007006 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007007 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007008 }
7009}
7010
Marat Dukhan08b7a972020-07-14 18:17:29 -07007011TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_height_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007012 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7013 DeconvolutionOperatorTester()
7014 .input_size(kStridedInputHeight, kStridedInputWidth)
7015 .adjustment_height(1)
7016 .kernel_size(2, 2)
7017 .stride(2)
7018 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007019 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007020 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007021 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007022}
7023
Marat Dukhan08b7a972020-07-14 18:17:29 -07007024TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_width_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007025 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7026 DeconvolutionOperatorTester()
7027 .input_size(kStridedInputHeight, kStridedInputWidth)
7028 .adjustment_width(1)
7029 .kernel_size(2, 2)
7030 .stride(2)
7031 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007032 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007033 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007034 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007035}
7036
Marat Dukhan08b7a972020-07-14 18:17:29 -07007037TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_varying_input_height) {
Marat Dukhan29954272020-02-13 17:56:11 -08007038 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7039 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
7040 DeconvolutionOperatorTester()
7041 .input_size(input_height, kStridedInputWidth)
7042 .kernel_size(2, 2)
7043 .stride(2)
7044 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007045 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007046 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007047 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007048 }
7049}
7050
Marat Dukhan08b7a972020-07-14 18:17:29 -07007051TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_varying_input_width) {
Marat Dukhan29954272020-02-13 17:56:11 -08007052 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7053 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
7054 DeconvolutionOperatorTester()
7055 .input_size(kStridedInputHeight, kStridedInputWidth)
7056 .kernel_size(2, 2)
7057 .stride(2)
7058 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007059 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007060 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007061 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007062 }
7063}
7064
Marat Dukhan08b7a972020-07-14 18:17:29 -07007065TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_varying_input_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007066 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7067 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
7068 DeconvolutionOperatorTester()
7069 .input_size(kStridedInputHeight, kStridedInputWidth)
7070 .kernel_size(2, 2)
7071 .stride(2)
7072 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007073 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007074 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007075 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007076 }
7077}
7078
Marat Dukhan08b7a972020-07-14 18:17:29 -07007079TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_varying_output_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007080 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07007081 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007082 DeconvolutionOperatorTester()
7083 .input_size(kStridedInputHeight, kStridedInputWidth)
7084 .kernel_size(2, 2)
7085 .stride(2)
7086 .group_input_channels(23)
7087 .group_output_channels(output_channels)
7088 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007089 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007090 }
7091}
7092
Marat Dukhan08b7a972020-07-14 18:17:29 -07007093TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_with_input_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007094 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7095 DeconvolutionOperatorTester()
7096 .input_size(kStridedInputHeight, kStridedInputWidth)
7097 .kernel_size(2, 2)
7098 .stride(2)
7099 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007100 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007101 .input_pixel_stride(28)
7102 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007103 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007104}
7105
Marat Dukhan08b7a972020-07-14 18:17:29 -07007106TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_with_output_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007107 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7108 DeconvolutionOperatorTester()
7109 .input_size(kStridedInputHeight, kStridedInputWidth)
7110 .kernel_size(2, 2)
7111 .stride(2)
7112 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007113 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
7114 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
Marat Dukhan29954272020-02-13 17:56:11 -08007115 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007116 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007117}
7118
Marat Dukhan08b7a972020-07-14 18:17:29 -07007119TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_with_qmin) {
Marat Dukhan29954272020-02-13 17:56:11 -08007120 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7121 DeconvolutionOperatorTester()
7122 .input_size(kStridedInputHeight, kStridedInputWidth)
7123 .kernel_size(2, 2)
7124 .stride(2)
7125 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007126 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007127 .qmin(128)
7128 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007129 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007130}
7131
Marat Dukhan08b7a972020-07-14 18:17:29 -07007132TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_with_qmax) {
Marat Dukhan29954272020-02-13 17:56:11 -08007133 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7134 DeconvolutionOperatorTester()
7135 .input_size(kStridedInputHeight, kStridedInputWidth)
7136 .kernel_size(2, 2)
7137 .stride(2)
7138 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007139 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007140 .qmax(128)
7141 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007142 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007143}
7144
Marat Dukhan08b7a972020-07-14 18:17:29 -07007145TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_without_bias) {
Marat Dukhan29954272020-02-13 17:56:11 -08007146 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7147 DeconvolutionOperatorTester()
7148 .has_bias(false)
7149 .input_size(kStridedInputHeight, kStridedInputWidth)
7150 .kernel_size(2, 2)
7151 .stride(2)
7152 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007153 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007154 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007155 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007156}
7157
7158/**************************** SUBCONV2D/GEMM path, grouped ****************************/
7159
Marat Dukhan08b7a972020-07-14 18:17:29 -07007160TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007161 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7162 DeconvolutionOperatorTester()
7163 .input_size(kStridedInputHeight, kStridedInputWidth)
7164 .kernel_size(2, 2)
7165 .stride(2)
7166 .groups(2)
7167 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007168 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007169 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007170 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007171}
7172
Marat Dukhan08b7a972020-07-14 18:17:29 -07007173TEST(DECONVOLUTION_NHWC_QU8, grouped_Kx2sKx2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007174 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7175 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
7176 DeconvolutionOperatorTester()
7177 .input_size(kStridedInputHeight, kStridedInputWidth)
7178 .kernel_size(kernel_height, 2)
7179 .stride(kernel_height, 2)
7180 .groups(2)
7181 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007182 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007183 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007184 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007185 }
7186}
7187
Marat Dukhan08b7a972020-07-14 18:17:29 -07007188TEST(DECONVOLUTION_NHWC_QU8, grouped_2xKs2xK) {
Marat Dukhan29954272020-02-13 17:56:11 -08007189 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7190 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
7191 DeconvolutionOperatorTester()
7192 .input_size(kStridedInputHeight, kStridedInputWidth)
7193 .kernel_size(2, kernel_width)
7194 .stride(2, kernel_width)
7195 .groups(2)
7196 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007197 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007198 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007199 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007200 }
7201}
7202
Marat Dukhan08b7a972020-07-14 18:17:29 -07007203TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_height_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007204 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7205 DeconvolutionOperatorTester()
7206 .input_size(kStridedInputHeight, kStridedInputWidth)
7207 .adjustment_height(1)
7208 .kernel_size(2, 2)
7209 .stride(2)
7210 .groups(2)
7211 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007212 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007213 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007214 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007215}
7216
Marat Dukhan08b7a972020-07-14 18:17:29 -07007217TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_width_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007218 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7219 DeconvolutionOperatorTester()
7220 .input_size(kStridedInputHeight, kStridedInputWidth)
7221 .adjustment_width(1)
7222 .kernel_size(2, 2)
7223 .stride(2)
7224 .groups(2)
7225 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007226 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007227 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007228 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007229}
7230
Marat Dukhan08b7a972020-07-14 18:17:29 -07007231TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_varying_input_height) {
Marat Dukhan29954272020-02-13 17:56:11 -08007232 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7233 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
7234 DeconvolutionOperatorTester()
7235 .input_size(input_height, kStridedInputWidth)
7236 .kernel_size(2, 2)
7237 .stride(2)
7238 .groups(2)
7239 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007240 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007241 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007242 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007243 }
7244}
7245
Marat Dukhan08b7a972020-07-14 18:17:29 -07007246TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_varying_input_width) {
Marat Dukhan29954272020-02-13 17:56:11 -08007247 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7248 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
7249 DeconvolutionOperatorTester()
7250 .input_size(kStridedInputHeight, kStridedInputWidth)
7251 .kernel_size(2, 2)
7252 .stride(2)
7253 .groups(2)
7254 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007255 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007256 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007257 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007258 }
7259}
7260
Marat Dukhan08b7a972020-07-14 18:17:29 -07007261TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_varying_input_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007262 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7263 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
7264 DeconvolutionOperatorTester()
7265 .input_size(kStridedInputHeight, kStridedInputWidth)
7266 .kernel_size(2, 2)
7267 .stride(2)
7268 .groups(2)
7269 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007270 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007271 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007272 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007273 }
7274}
7275
Marat Dukhan08b7a972020-07-14 18:17:29 -07007276TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_varying_output_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007277 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07007278 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007279 DeconvolutionOperatorTester()
7280 .input_size(kStridedInputHeight, kStridedInputWidth)
7281 .kernel_size(2, 2)
7282 .stride(2)
7283 .groups(2)
7284 .group_input_channels(17)
7285 .group_output_channels(output_channels)
7286 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007287 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007288 }
7289}
7290
Marat Dukhan08b7a972020-07-14 18:17:29 -07007291TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_with_input_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007292 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7293 DeconvolutionOperatorTester()
7294 .input_size(kStridedInputHeight, kStridedInputWidth)
7295 .kernel_size(2, 2)
7296 .stride(2)
7297 .groups(2)
7298 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007299 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007300 .input_pixel_stride(37)
7301 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007302 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007303}
7304
Marat Dukhan08b7a972020-07-14 18:17:29 -07007305TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_with_output_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007306 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7307 DeconvolutionOperatorTester()
7308 .input_size(kStridedInputHeight, kStridedInputWidth)
7309 .kernel_size(2, 2)
7310 .stride(2)
7311 .groups(2)
7312 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007313 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
7314 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
Marat Dukhan29954272020-02-13 17:56:11 -08007315 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007316 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007317}
7318
Marat Dukhan08b7a972020-07-14 18:17:29 -07007319TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_with_qmin) {
Marat Dukhan29954272020-02-13 17:56:11 -08007320 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7321 DeconvolutionOperatorTester()
7322 .input_size(kStridedInputHeight, kStridedInputWidth)
7323 .kernel_size(2, 2)
7324 .stride(2)
7325 .groups(2)
7326 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007327 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007328 .qmin(128)
7329 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007330 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007331}
7332
Marat Dukhan08b7a972020-07-14 18:17:29 -07007333TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_with_qmax) {
Marat Dukhan29954272020-02-13 17:56:11 -08007334 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7335 DeconvolutionOperatorTester()
7336 .input_size(kStridedInputHeight, kStridedInputWidth)
7337 .kernel_size(2, 2)
7338 .stride(2)
7339 .groups(2)
7340 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007341 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007342 .qmax(128)
7343 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007344 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007345}
7346
Marat Dukhan08b7a972020-07-14 18:17:29 -07007347TEST(DECONVOLUTION_NHWC_QU8, grouped_2x2s2_without_bias) {
Marat Dukhan29954272020-02-13 17:56:11 -08007348 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7349 DeconvolutionOperatorTester()
7350 .has_bias(false)
7351 .input_size(kStridedInputHeight, kStridedInputWidth)
7352 .kernel_size(2, 2)
7353 .stride(2)
7354 .groups(2)
7355 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007356 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007357 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007358 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007359}
7360
7361/**************************** SUBCONV2D/GEMM path, batched ****************************/
7362
Marat Dukhan08b7a972020-07-14 18:17:29 -07007363TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007364 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7365 DeconvolutionOperatorTester()
7366 .batch_size(2)
7367 .input_size(kStridedInputHeight, kStridedInputWidth)
7368 .kernel_size(2, 2)
7369 .stride(2)
7370 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007371 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007372 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007373 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007374}
7375
Marat Dukhan08b7a972020-07-14 18:17:29 -07007376TEST(DECONVOLUTION_NHWC_QU8, batched_Kx2sKx2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007377 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7378 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
7379 DeconvolutionOperatorTester()
7380 .batch_size(2)
7381 .input_size(kStridedInputHeight, kStridedInputWidth)
7382 .kernel_size(kernel_height, 2)
7383 .stride(kernel_height, 2)
7384 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007385 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007386 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007387 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007388 }
7389}
7390
Marat Dukhan08b7a972020-07-14 18:17:29 -07007391TEST(DECONVOLUTION_NHWC_QU8, batched_2xKs2xK) {
Marat Dukhan29954272020-02-13 17:56:11 -08007392 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7393 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
7394 DeconvolutionOperatorTester()
7395 .batch_size(2)
7396 .input_size(kStridedInputHeight, kStridedInputWidth)
7397 .kernel_size(2, kernel_width)
7398 .stride(2, kernel_width)
7399 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007400 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007401 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007402 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007403 }
7404}
7405
Marat Dukhan08b7a972020-07-14 18:17:29 -07007406TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_height_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007407 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7408 DeconvolutionOperatorTester()
7409 .batch_size(2)
7410 .input_size(kStridedInputHeight, kStridedInputWidth)
7411 .adjustment_height(1)
7412 .kernel_size(2, 2)
7413 .stride(2)
7414 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007415 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007416 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007417 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007418}
7419
Marat Dukhan08b7a972020-07-14 18:17:29 -07007420TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_width_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007421 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7422 DeconvolutionOperatorTester()
7423 .batch_size(2)
7424 .input_size(kStridedInputHeight, kStridedInputWidth)
7425 .adjustment_width(1)
7426 .kernel_size(2, 2)
7427 .stride(2)
7428 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007429 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007430 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007431 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007432}
7433
Marat Dukhan08b7a972020-07-14 18:17:29 -07007434TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_varying_input_height) {
Marat Dukhan29954272020-02-13 17:56:11 -08007435 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7436 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
7437 DeconvolutionOperatorTester()
7438 .batch_size(2)
7439 .input_size(input_height, kStridedInputWidth)
7440 .kernel_size(2, 2)
7441 .stride(2)
7442 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007443 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007444 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007445 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007446 }
7447}
7448
Marat Dukhan08b7a972020-07-14 18:17:29 -07007449TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_varying_input_width) {
Marat Dukhan29954272020-02-13 17:56:11 -08007450 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7451 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
7452 DeconvolutionOperatorTester()
7453 .batch_size(2)
7454 .input_size(kStridedInputHeight, kStridedInputWidth)
7455 .kernel_size(2, 2)
7456 .stride(2)
7457 .group_input_channels(15)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007458 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007459 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007460 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007461 }
7462}
7463
Marat Dukhan08b7a972020-07-14 18:17:29 -07007464TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_varying_input_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007465 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7466 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
7467 DeconvolutionOperatorTester()
7468 .batch_size(2)
7469 .input_size(kStridedInputHeight, kStridedInputWidth)
7470 .kernel_size(2, 2)
7471 .stride(2)
7472 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007473 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007474 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007475 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007476 }
7477}
7478
Marat Dukhan08b7a972020-07-14 18:17:29 -07007479TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_varying_output_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007480 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07007481 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007482 DeconvolutionOperatorTester()
7483 .batch_size(2)
7484 .input_size(kStridedInputHeight, kStridedInputWidth)
7485 .kernel_size(2, 2)
7486 .stride(2)
7487 .group_input_channels(23)
7488 .group_output_channels(output_channels)
7489 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007490 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007491 }
7492}
7493
Marat Dukhan08b7a972020-07-14 18:17:29 -07007494TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_with_input_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007495 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7496 DeconvolutionOperatorTester()
7497 .batch_size(2)
7498 .input_size(kStridedInputHeight, kStridedInputWidth)
7499 .kernel_size(2, 2)
7500 .stride(2)
7501 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007502 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007503 .input_pixel_stride(28)
7504 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007505 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007506}
7507
Marat Dukhan08b7a972020-07-14 18:17:29 -07007508TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_with_output_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007509 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7510 DeconvolutionOperatorTester()
7511 .batch_size(2)
7512 .input_size(kStridedInputHeight, kStridedInputWidth)
7513 .kernel_size(2, 2)
7514 .stride(2)
7515 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007516 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
7517 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
Marat Dukhan29954272020-02-13 17:56:11 -08007518 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007519 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007520}
7521
Marat Dukhan08b7a972020-07-14 18:17:29 -07007522TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_with_qmin) {
Marat Dukhan29954272020-02-13 17:56:11 -08007523 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7524 DeconvolutionOperatorTester()
7525 .batch_size(2)
7526 .input_size(kStridedInputHeight, kStridedInputWidth)
7527 .kernel_size(2, 2)
7528 .stride(2)
7529 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007530 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007531 .qmin(128)
7532 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007533 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007534}
7535
Marat Dukhan08b7a972020-07-14 18:17:29 -07007536TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_with_qmax) {
Marat Dukhan29954272020-02-13 17:56:11 -08007537 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7538 DeconvolutionOperatorTester()
7539 .batch_size(2)
7540 .input_size(kStridedInputHeight, kStridedInputWidth)
7541 .kernel_size(2, 2)
7542 .stride(2)
7543 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007544 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007545 .qmax(128)
7546 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007547 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007548}
7549
Marat Dukhan08b7a972020-07-14 18:17:29 -07007550TEST(DECONVOLUTION_NHWC_QU8, batched_2x2s2_without_bias) {
Marat Dukhan29954272020-02-13 17:56:11 -08007551 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7552 DeconvolutionOperatorTester()
7553 .has_bias(false)
7554 .batch_size(2)
7555 .input_size(kStridedInputHeight, kStridedInputWidth)
7556 .kernel_size(2, 2)
7557 .stride(2)
7558 .group_input_channels(23)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007559 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007560 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007561 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007562}
7563
7564/**************************** SUBCONV2D/GEMM path, grouped, batched ****************************/
7565
Marat Dukhan08b7a972020-07-14 18:17:29 -07007566TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007567 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7568 DeconvolutionOperatorTester()
7569 .batch_size(2)
7570 .input_size(kStridedInputHeight, kStridedInputWidth)
7571 .kernel_size(2, 2)
7572 .stride(2)
7573 .groups(2)
7574 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007575 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007576 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007577 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007578}
7579
Marat Dukhan08b7a972020-07-14 18:17:29 -07007580TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_Kx2sKx2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007581 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7582 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
7583 DeconvolutionOperatorTester()
7584 .batch_size(2)
7585 .input_size(kStridedInputHeight, kStridedInputWidth)
7586 .kernel_size(kernel_height, 2)
7587 .stride(kernel_height, 2)
7588 .groups(2)
7589 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007590 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007591 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007592 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007593 }
7594}
7595
Marat Dukhan08b7a972020-07-14 18:17:29 -07007596TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2xKs2xK) {
Marat Dukhan29954272020-02-13 17:56:11 -08007597 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7598 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
7599 DeconvolutionOperatorTester()
7600 .batch_size(2)
7601 .input_size(kStridedInputHeight, kStridedInputWidth)
7602 .kernel_size(2, kernel_width)
7603 .stride(2, kernel_width)
7604 .groups(2)
7605 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007606 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007607 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007608 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007609 }
7610}
7611
Marat Dukhan08b7a972020-07-14 18:17:29 -07007612TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_height_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007613 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7614 DeconvolutionOperatorTester()
7615 .batch_size(2)
7616 .input_size(kStridedInputHeight, kStridedInputWidth)
7617 .adjustment_height(1)
7618 .kernel_size(2, 2)
7619 .stride(2)
7620 .groups(2)
7621 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007622 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007623 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007624 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007625}
7626
Marat Dukhan08b7a972020-07-14 18:17:29 -07007627TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_width_adjustment) {
Marat Dukhan29954272020-02-13 17:56:11 -08007628 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7629 DeconvolutionOperatorTester()
7630 .batch_size(2)
7631 .input_size(kStridedInputHeight, kStridedInputWidth)
7632 .adjustment_width(1)
7633 .kernel_size(2, 2)
7634 .stride(2)
7635 .groups(2)
7636 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007637 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007638 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007639 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007640}
7641
Marat Dukhan08b7a972020-07-14 18:17:29 -07007642TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_varying_input_height) {
Marat Dukhan29954272020-02-13 17:56:11 -08007643 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7644 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
7645 DeconvolutionOperatorTester()
7646 .batch_size(2)
7647 .input_size(input_height, kStridedInputWidth)
7648 .kernel_size(2, 2)
7649 .stride(2)
7650 .groups(2)
7651 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007652 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007653 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007654 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007655 }
7656}
7657
Marat Dukhan08b7a972020-07-14 18:17:29 -07007658TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_varying_input_width) {
Marat Dukhan29954272020-02-13 17:56:11 -08007659 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7660 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
7661 DeconvolutionOperatorTester()
7662 .batch_size(2)
7663 .input_size(kStridedInputHeight, kStridedInputWidth)
7664 .kernel_size(2, 2)
7665 .stride(2)
7666 .groups(2)
7667 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007668 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007669 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007670 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007671 }
7672}
7673
Marat Dukhan08b7a972020-07-14 18:17:29 -07007674TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_varying_input_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007675 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7676 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
7677 DeconvolutionOperatorTester()
7678 .batch_size(2)
7679 .input_size(kStridedInputHeight, kStridedInputWidth)
7680 .kernel_size(2, 2)
7681 .stride(2)
7682 .groups(2)
7683 .group_input_channels(input_channels)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007684 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007685 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007686 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007687 }
7688}
7689
Marat Dukhan08b7a972020-07-14 18:17:29 -07007690TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_varying_output_channels) {
Marat Dukhan29954272020-02-13 17:56:11 -08007691 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan08b7a972020-07-14 18:17:29 -07007692 for (size_t output_channels = 1; output_channels <= xnn_params.qu8.gemm.nr * 2; output_channels *= 2) {
Marat Dukhan29954272020-02-13 17:56:11 -08007693 DeconvolutionOperatorTester()
7694 .batch_size(2)
7695 .input_size(kStridedInputHeight, kStridedInputWidth)
7696 .kernel_size(2, 2)
7697 .stride(2)
7698 .groups(2)
7699 .group_input_channels(17)
7700 .group_output_channels(output_channels)
7701 .iterations(1)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007702 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007703 }
7704}
7705
Marat Dukhan08b7a972020-07-14 18:17:29 -07007706TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_with_input_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007707 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7708 DeconvolutionOperatorTester()
7709 .batch_size(2)
7710 .input_size(kStridedInputHeight, kStridedInputWidth)
7711 .kernel_size(2, 2)
7712 .stride(2)
7713 .groups(2)
7714 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007715 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007716 .input_pixel_stride(37)
7717 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007718 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007719}
7720
Marat Dukhan08b7a972020-07-14 18:17:29 -07007721TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_with_output_stride) {
Marat Dukhan29954272020-02-13 17:56:11 -08007722 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7723 DeconvolutionOperatorTester()
7724 .batch_size(2)
7725 .input_size(kStridedInputHeight, kStridedInputWidth)
7726 .kernel_size(2, 2)
7727 .stride(2)
7728 .groups(2)
7729 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007730 .group_output_channels(xnn_params.qu8.gemm.nr + 3)
7731 .output_pixel_stride(xnn_params.qu8.gemm.nr * 2 + 13)
Marat Dukhan29954272020-02-13 17:56:11 -08007732 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007733 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007734}
7735
Marat Dukhan08b7a972020-07-14 18:17:29 -07007736TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_with_qmin) {
Marat Dukhan29954272020-02-13 17:56:11 -08007737 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7738 DeconvolutionOperatorTester()
7739 .batch_size(2)
7740 .input_size(kStridedInputHeight, kStridedInputWidth)
7741 .kernel_size(2, 2)
7742 .stride(2)
7743 .groups(2)
7744 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007745 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007746 .qmin(128)
7747 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007748 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007749}
7750
Marat Dukhan08b7a972020-07-14 18:17:29 -07007751TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_with_qmax) {
Marat Dukhan29954272020-02-13 17:56:11 -08007752 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7753 DeconvolutionOperatorTester()
7754 .batch_size(2)
7755 .input_size(kStridedInputHeight, kStridedInputWidth)
7756 .kernel_size(2, 2)
7757 .stride(2)
7758 .groups(2)
7759 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007760 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007761 .qmax(128)
7762 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007763 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007764}
7765
Marat Dukhan08b7a972020-07-14 18:17:29 -07007766TEST(DECONVOLUTION_NHWC_QU8, batched_grouped_2x2s2_without_bias) {
Marat Dukhan29954272020-02-13 17:56:11 -08007767 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7768 DeconvolutionOperatorTester()
7769 .has_bias(false)
7770 .batch_size(2)
7771 .input_size(kStridedInputHeight, kStridedInputWidth)
7772 .kernel_size(2, 2)
7773 .stride(2)
7774 .groups(2)
7775 .group_input_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007776 .group_output_channels(xnn_params.qu8.gemm.nr * 2 + 3)
Marat Dukhan29954272020-02-13 17:56:11 -08007777 .iterations(3)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007778 .TestQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007779}
7780
7781/**************************** SUBCONV2D/GEMM path, setup ****************************/
7782
Marat Dukhan08b7a972020-07-14 18:17:29 -07007783TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_setup_changing_batch) {
Marat Dukhan29954272020-02-13 17:56:11 -08007784 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7785 DeconvolutionOperatorTester()
7786 .batch_size(2)
7787 .next_batch_size(5)
7788 .input_size(kStridedInputHeight, kStridedInputWidth)
7789 .kernel_size(2, 2)
7790 .stride(2)
7791 .groups(2)
7792 .group_input_channels(15)
7793 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007794 .TestSetupQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007795}
7796
Marat Dukhan08b7a972020-07-14 18:17:29 -07007797TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_setup_changing_height) {
Marat Dukhan29954272020-02-13 17:56:11 -08007798 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7799 DeconvolutionOperatorTester()
7800 .batch_size(2)
7801 .input_size(kStridedInputHeight, kStridedInputWidth)
7802 .next_input_height(kStridedInputHeight + 3)
7803 .kernel_size(2, 2)
7804 .stride(2)
7805 .groups(2)
7806 .group_input_channels(15)
7807 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007808 .TestSetupQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007809}
7810
Marat Dukhan08b7a972020-07-14 18:17:29 -07007811TEST(DECONVOLUTION_NHWC_QU8, 2x2s2_setup_changing_width) {
Marat Dukhan29954272020-02-13 17:56:11 -08007812 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
7813 DeconvolutionOperatorTester()
7814 .batch_size(2)
7815 .input_size(kStridedInputHeight, kStridedInputWidth)
7816 .next_input_width(kStridedInputWidth + 3)
7817 .kernel_size(2, 2)
7818 .stride(2)
7819 .groups(2)
7820 .group_input_channels(15)
7821 .group_output_channels(17)
Marat Dukhan08b7a972020-07-14 18:17:29 -07007822 .TestSetupQU8();
Marat Dukhan29954272020-02-13 17:56:11 -08007823}
7824
XNNPACK Teamb455b122019-09-27 18:10:33 -07007825/**************************** Future GEMM path ****************************/
7826
Marat Dukhanefc47b82019-11-18 09:25:38 -08007827TEST(DECONVOLUTION_NHWC_F32, 1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007828 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007829 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007830 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007831 .kernel_size(1, 1)
7832 .group_input_channels(23)
7833 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7834 .iterations(3)
7835 .TestF32();
7836}
7837
Marat Dukhanefc47b82019-11-18 09:25:38 -08007838TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007839 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08007840 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07007841 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007842 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007843 .kernel_size(1, 1)
7844 .group_input_channels(23)
7845 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7846 .iterations(1)
7847 .TestF32();
7848 }
7849}
7850
Marat Dukhanefc47b82019-11-18 09:25:38 -08007851TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007852 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08007853 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07007854 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007855 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007856 .kernel_size(1, 1)
7857 .group_input_channels(23)
7858 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7859 .iterations(1)
7860 .TestF32();
7861 }
7862}
7863
Marat Dukhanefc47b82019-11-18 09:25:38 -08007864TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007865 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007866 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
7867 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007868 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007869 .kernel_size(1, 1)
7870 .group_input_channels(input_channels)
7871 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7872 .iterations(1)
7873 .TestF32();
7874 }
7875}
7876
Marat Dukhanefc47b82019-11-18 09:25:38 -08007877TEST(DECONVOLUTION_NHWC_F32, 1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007878 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007879 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
7880 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007881 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007882 .kernel_size(1, 1)
7883 .group_input_channels(23)
7884 .group_output_channels(output_channels)
7885 .iterations(1)
7886 .TestF32();
7887 }
7888}
7889
Marat Dukhanefc47b82019-11-18 09:25:38 -08007890TEST(DECONVOLUTION_NHWC_F32, 1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007891 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007892 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007893 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007894 .kernel_size(1, 1)
7895 .group_input_channels(23)
7896 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7897 .input_pixel_stride(28)
7898 .iterations(3)
7899 .TestF32();
7900}
7901
Marat Dukhanefc47b82019-11-18 09:25:38 -08007902TEST(DECONVOLUTION_NHWC_F32, 1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007903 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007904 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007905 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007906 .kernel_size(1, 1)
7907 .group_input_channels(23)
7908 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7909 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
7910 .iterations(3)
7911 .TestF32();
7912}
7913
Marat Dukhanefc47b82019-11-18 09:25:38 -08007914TEST(DECONVOLUTION_NHWC_F32, 1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007915 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007916 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007917 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007918 .kernel_size(1, 1)
7919 .group_input_channels(23)
7920 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7921 .qmin(128)
7922 .iterations(3)
7923 .TestF32();
7924}
7925
Marat Dukhanefc47b82019-11-18 09:25:38 -08007926TEST(DECONVOLUTION_NHWC_F32, 1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007927 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007928 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007929 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007930 .kernel_size(1, 1)
7931 .group_input_channels(23)
7932 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07007933 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007934 .iterations(3)
7935 .TestF32();
7936}
7937
Marat Dukhanefc47b82019-11-18 09:25:38 -08007938TEST(DECONVOLUTION_NHWC_F32, 1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007939 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07007940 DeconvolutionOperatorTester()
7941 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08007942 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07007943 .kernel_size(1, 1)
7944 .group_input_channels(23)
7945 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7946 .iterations(3)
7947 .TestF32();
7948}
7949
XNNPACK Teamb455b122019-09-27 18:10:33 -07007950/**************************** Future GEMM path, grouped ****************************/
7951
Marat Dukhanefc47b82019-11-18 09:25:38 -08007952TEST(DECONVOLUTION_NHWC_F32, grouped_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007953 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007954 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007955 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007956 .kernel_size(1, 1)
7957 .groups(2)
7958 .group_input_channels(23)
7959 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7960 .iterations(3)
7961 .TestF32();
7962}
7963
Marat Dukhanefc47b82019-11-18 09:25:38 -08007964TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007965 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08007966 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07007967 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007968 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007969 .kernel_size(1, 1)
7970 .groups(2)
7971 .group_input_channels(23)
7972 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7973 .iterations(1)
7974 .TestF32();
7975 }
7976}
7977
Marat Dukhanefc47b82019-11-18 09:25:38 -08007978TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007979 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08007980 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07007981 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007982 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007983 .kernel_size(1, 1)
7984 .groups(2)
7985 .group_input_channels(23)
7986 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
7987 .iterations(1)
7988 .TestF32();
7989 }
7990}
7991
Marat Dukhanefc47b82019-11-18 09:25:38 -08007992TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08007993 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07007994 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
7995 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08007996 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07007997 .kernel_size(1, 1)
7998 .groups(2)
7999 .group_input_channels(input_channels)
8000 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8001 .iterations(1)
8002 .TestF32();
8003 }
8004}
8005
Marat Dukhanefc47b82019-11-18 09:25:38 -08008006TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008007 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008008 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
8009 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008010 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008011 .kernel_size(1, 1)
8012 .groups(2)
8013 .group_input_channels(23)
8014 .group_output_channels(output_channels)
8015 .iterations(1)
8016 .TestF32();
8017 }
8018}
8019
Marat Dukhanefc47b82019-11-18 09:25:38 -08008020TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008021 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008022 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008023 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008024 .kernel_size(1, 1)
8025 .groups(2)
8026 .group_input_channels(23)
8027 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8028 .input_pixel_stride(47)
8029 .iterations(3)
8030 .TestF32();
8031}
8032
Marat Dukhanefc47b82019-11-18 09:25:38 -08008033TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008034 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008035 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008036 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008037 .kernel_size(1, 1)
8038 .groups(2)
8039 .group_input_channels(23)
8040 .group_output_channels(xnn_params.f32.gemm.nr + 3)
8041 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
8042 .iterations(3)
8043 .TestF32();
8044}
8045
Marat Dukhanefc47b82019-11-18 09:25:38 -08008046TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008047 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008048 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008049 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008050 .kernel_size(1, 1)
8051 .groups(2)
8052 .group_input_channels(23)
8053 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8054 .qmin(128)
8055 .iterations(3)
8056 .TestF32();
8057}
8058
Marat Dukhanefc47b82019-11-18 09:25:38 -08008059TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008060 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008061 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008062 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008063 .kernel_size(1, 1)
8064 .groups(2)
8065 .group_input_channels(23)
8066 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07008067 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008068 .iterations(3)
8069 .TestF32();
8070}
8071
Marat Dukhanefc47b82019-11-18 09:25:38 -08008072TEST(DECONVOLUTION_NHWC_F32, grouped_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008073 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07008074 DeconvolutionOperatorTester()
8075 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08008076 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07008077 .kernel_size(1, 1)
8078 .groups(2)
8079 .group_input_channels(23)
8080 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8081 .iterations(3)
8082 .TestF32();
8083}
8084
XNNPACK Teamb455b122019-09-27 18:10:33 -07008085/**************************** Future GEMM path, batched ****************************/
8086
Marat Dukhanefc47b82019-11-18 09:25:38 -08008087TEST(DECONVOLUTION_NHWC_F32, batched_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008088 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008089 DeconvolutionOperatorTester()
8090 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008091 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008092 .kernel_size(1, 1)
8093 .group_input_channels(23)
8094 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8095 .iterations(3)
8096 .TestF32();
8097}
8098
Marat Dukhanefc47b82019-11-18 09:25:38 -08008099TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008100 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008101 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008102 DeconvolutionOperatorTester()
8103 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008104 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008105 .kernel_size(1, 1)
8106 .group_input_channels(23)
8107 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8108 .iterations(1)
8109 .TestF32();
8110 }
8111}
8112
Marat Dukhanefc47b82019-11-18 09:25:38 -08008113TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008114 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008115 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008116 DeconvolutionOperatorTester()
8117 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008118 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008119 .kernel_size(1, 1)
8120 .group_input_channels(23)
8121 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8122 .iterations(1)
8123 .TestF32();
8124 }
8125}
8126
Marat Dukhanefc47b82019-11-18 09:25:38 -08008127TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008128 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008129 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
8130 DeconvolutionOperatorTester()
8131 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008132 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008133 .kernel_size(1, 1)
8134 .group_input_channels(input_channels)
8135 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8136 .iterations(1)
8137 .TestF32();
8138 }
8139}
8140
Marat Dukhanefc47b82019-11-18 09:25:38 -08008141TEST(DECONVOLUTION_NHWC_F32, batched_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008142 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008143 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
8144 DeconvolutionOperatorTester()
8145 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008146 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008147 .kernel_size(1, 1)
8148 .group_input_channels(23)
8149 .group_output_channels(output_channels)
8150 .iterations(1)
8151 .TestF32();
8152 }
8153}
8154
Marat Dukhanefc47b82019-11-18 09:25:38 -08008155TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008156 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008157 DeconvolutionOperatorTester()
8158 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008159 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008160 .kernel_size(1, 1)
8161 .group_input_channels(23)
8162 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8163 .input_pixel_stride(28)
8164 .iterations(3)
8165 .TestF32();
8166}
8167
Marat Dukhanefc47b82019-11-18 09:25:38 -08008168TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008169 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008170 DeconvolutionOperatorTester()
8171 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008172 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008173 .kernel_size(1, 1)
8174 .group_input_channels(23)
8175 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8176 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
8177 .iterations(3)
8178 .TestF32();
8179}
8180
Marat Dukhanefc47b82019-11-18 09:25:38 -08008181TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008182 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008183 DeconvolutionOperatorTester()
8184 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008185 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008186 .kernel_size(1, 1)
8187 .group_input_channels(23)
8188 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8189 .qmin(128)
8190 .iterations(3)
8191 .TestF32();
8192}
8193
Marat Dukhanefc47b82019-11-18 09:25:38 -08008194TEST(DECONVOLUTION_NHWC_F32, batched_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008195 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008196 DeconvolutionOperatorTester()
8197 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008198 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008199 .kernel_size(1, 1)
8200 .group_input_channels(23)
8201 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07008202 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008203 .iterations(3)
8204 .TestF32();
8205}
8206
Marat Dukhanefc47b82019-11-18 09:25:38 -08008207TEST(DECONVOLUTION_NHWC_F32, batched_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008208 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07008209 DeconvolutionOperatorTester()
8210 .has_bias(false)
8211 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008212 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07008213 .kernel_size(1, 1)
8214 .group_input_channels(23)
8215 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8216 .iterations(3)
8217 .TestF32();
8218}
8219
XNNPACK Teamb455b122019-09-27 18:10:33 -07008220/**************************** Future GEMM path, batched, grouped ****************************/
8221
Marat Dukhanefc47b82019-11-18 09:25:38 -08008222TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008223 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008224 DeconvolutionOperatorTester()
8225 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008226 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008227 .kernel_size(1, 1)
8228 .groups(2)
8229 .group_input_channels(23)
8230 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8231 .iterations(3)
8232 .TestF32();
8233}
8234
Marat Dukhanefc47b82019-11-18 09:25:38 -08008235TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008236 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008237 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008238 DeconvolutionOperatorTester()
8239 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008240 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008241 .kernel_size(1, 1)
8242 .groups(2)
8243 .group_input_channels(23)
8244 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8245 .iterations(1)
8246 .TestF32();
8247 }
8248}
8249
Marat Dukhanefc47b82019-11-18 09:25:38 -08008250TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008251 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008252 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008253 DeconvolutionOperatorTester()
8254 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008255 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008256 .kernel_size(1, 1)
8257 .groups(2)
8258 .group_input_channels(23)
8259 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8260 .iterations(1)
8261 .TestF32();
8262 }
8263}
8264
Marat Dukhanefc47b82019-11-18 09:25:38 -08008265TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008266 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008267 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
8268 DeconvolutionOperatorTester()
8269 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008270 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008271 .kernel_size(1, 1)
8272 .groups(2)
8273 .group_input_channels(input_channels)
8274 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8275 .iterations(1)
8276 .TestF32();
8277 }
8278}
8279
Marat Dukhanefc47b82019-11-18 09:25:38 -08008280TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008281 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008282 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
8283 DeconvolutionOperatorTester()
8284 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008285 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008286 .kernel_size(1, 1)
8287 .groups(2)
8288 .group_input_channels(23)
8289 .group_output_channels(output_channels)
8290 .iterations(1)
8291 .TestF32();
8292 }
8293}
8294
Marat Dukhanefc47b82019-11-18 09:25:38 -08008295TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008296 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008297 DeconvolutionOperatorTester()
8298 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008299 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008300 .kernel_size(1, 1)
8301 .groups(2)
8302 .group_input_channels(23)
8303 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8304 .input_pixel_stride(47)
8305 .iterations(3)
8306 .TestF32();
8307}
8308
Marat Dukhanefc47b82019-11-18 09:25:38 -08008309TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008310 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008311 DeconvolutionOperatorTester()
8312 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008313 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008314 .kernel_size(1, 1)
8315 .groups(2)
8316 .group_input_channels(23)
8317 .group_output_channels(xnn_params.f32.gemm.nr + 3)
8318 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
8319 .iterations(3)
8320 .TestF32();
8321}
8322
Marat Dukhanefc47b82019-11-18 09:25:38 -08008323TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008324 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008325 DeconvolutionOperatorTester()
8326 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008327 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008328 .kernel_size(1, 1)
8329 .groups(2)
8330 .group_input_channels(23)
8331 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8332 .qmin(128)
8333 .iterations(3)
8334 .TestF32();
8335}
8336
Marat Dukhanefc47b82019-11-18 09:25:38 -08008337TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008338 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008339 DeconvolutionOperatorTester()
8340 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008341 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008342 .kernel_size(1, 1)
8343 .groups(2)
8344 .group_input_channels(23)
8345 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07008346 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008347 .iterations(3)
8348 .TestF32();
8349}
8350
Marat Dukhanefc47b82019-11-18 09:25:38 -08008351TEST(DECONVOLUTION_NHWC_F32, batched_grouped_1x1_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008352 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07008353 DeconvolutionOperatorTester()
8354 .has_bias(false)
8355 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008356 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07008357 .kernel_size(1, 1)
8358 .groups(2)
8359 .group_input_channels(23)
8360 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8361 .iterations(3)
8362 .TestF32();
8363}
8364
XNNPACK Teamb455b122019-09-27 18:10:33 -07008365/**************************** CONV path ****************************/
8366
Marat Dukhanefc47b82019-11-18 09:25:38 -08008367TEST(DECONVOLUTION_NHWC_F32, 3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008368 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008369 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008370 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008371 .padding(1)
8372 .kernel_size(3, 3)
8373 .group_input_channels(15)
8374 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8375 .iterations(3)
8376 .TestF32();
8377}
8378
Marat Dukhanefc47b82019-11-18 09:25:38 -08008379TEST(DECONVOLUTION_NHWC_F32, Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008380 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008381 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
8382 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008383 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008384 .padding_width(1)
8385 .kernel_size(kernel_height, 3)
8386 .group_input_channels(17)
8387 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8388 .iterations(3)
8389 .TestF32();
8390 }
8391}
8392
Marat Dukhanefc47b82019-11-18 09:25:38 -08008393TEST(DECONVOLUTION_NHWC_F32, 3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008394 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008395 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
8396 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008397 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008398 .padding_height(1)
8399 .kernel_size(3, kernel_width)
8400 .group_input_channels(17)
8401 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8402 .iterations(3)
8403 .TestF32();
8404 }
8405}
8406
Marat Dukhanefc47b82019-11-18 09:25:38 -08008407TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008408 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008409 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
8410 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
8411 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008412 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008413 .padding_width(1)
8414 .padding_top(padding_top)
8415 .padding_bottom(padding_bottom)
8416 .kernel_size(3, 3)
8417 .group_input_channels(15)
8418 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8419 .iterations(1)
8420 .TestF32();
8421 }
8422 }
8423}
8424
Marat Dukhanefc47b82019-11-18 09:25:38 -08008425TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008426 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008427 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
8428 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
8429 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008430 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008431 .padding_height(1)
8432 .padding_left(padding_left)
8433 .padding_right(padding_right)
8434 .kernel_size(3, 3)
8435 .group_input_channels(15)
8436 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8437 .iterations(1)
8438 .TestF32();
8439 }
8440 }
8441}
8442
Marat Dukhanefc47b82019-11-18 09:25:38 -08008443TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008444 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008445 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
8446 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008447 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008448 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08008449 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008450 .adjustment_height(adjustment_height)
8451 .kernel_size(3, 3)
8452 .group_input_channels(15)
8453 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8454 .iterations(1)
8455 .TestF32();
8456 }
8457}
8458
Marat Dukhanefc47b82019-11-18 09:25:38 -08008459TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008460 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008461 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
8462 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008463 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008464 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08008465 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008466 .adjustment_width(adjustment_width)
8467 .kernel_size(3, 3)
8468 .group_input_channels(15)
8469 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8470 .iterations(1)
8471 .TestF32();
8472 }
8473}
8474
Marat Dukhanefc47b82019-11-18 09:25:38 -08008475TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008476 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008477 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008478 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008479 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008480 .padding(1)
8481 .kernel_size(3, 3)
8482 .group_input_channels(15)
8483 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8484 .iterations(1)
8485 .TestF32();
8486 }
8487}
8488
Marat Dukhanefc47b82019-11-18 09:25:38 -08008489TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008490 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008491 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008492 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008493 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008494 .padding(1)
8495 .kernel_size(3, 3)
8496 .group_input_channels(15)
8497 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8498 .iterations(1)
8499 .TestF32();
8500 }
8501}
8502
Marat Dukhanefc47b82019-11-18 09:25:38 -08008503TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008504 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008505 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
8506 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008507 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008508 .padding(1)
8509 .kernel_size(3, 3)
8510 .group_input_channels(input_channels)
8511 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8512 .iterations(1)
8513 .TestF32();
8514 }
8515}
8516
Marat Dukhanefc47b82019-11-18 09:25:38 -08008517TEST(DECONVOLUTION_NHWC_F32, 3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008518 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008519 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
8520 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008521 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008522 .padding(1)
8523 .kernel_size(3, 3)
8524 .group_input_channels(23)
8525 .group_output_channels(output_channels)
8526 .iterations(1)
8527 .TestF32();
8528 }
8529}
8530
Marat Dukhanefc47b82019-11-18 09:25:38 -08008531TEST(DECONVOLUTION_NHWC_F32, 3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008532 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008533 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
8534 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008535 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008536 .padding(1)
8537 .kernel_size(3, 3)
8538 .dilation_height(dilation_height)
8539 .group_input_channels(23)
8540 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8541 .iterations(3)
8542 .TestF32();
8543 }
8544}
8545
Marat Dukhanefc47b82019-11-18 09:25:38 -08008546TEST(DECONVOLUTION_NHWC_F32, 3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008547 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008548 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
8549 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008550 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008551 .padding(1)
8552 .kernel_size(3, 3)
8553 .dilation_width(dilation_width)
8554 .group_input_channels(23)
8555 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8556 .iterations(3)
8557 .TestF32();
8558 }
8559}
8560
Marat Dukhanefc47b82019-11-18 09:25:38 -08008561TEST(DECONVOLUTION_NHWC_F32, 3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008562 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008563 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008564 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008565 .padding(1)
8566 .kernel_size(3, 3)
8567 .dilation_height(3)
8568 .stride_height(2)
8569 .group_input_channels(23)
8570 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8571 .iterations(3)
8572 .TestF32();
8573}
8574
Marat Dukhanefc47b82019-11-18 09:25:38 -08008575TEST(DECONVOLUTION_NHWC_F32, 3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008576 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008577 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008578 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008579 .padding(1)
8580 .kernel_size(3, 3)
8581 .dilation_width(3)
8582 .stride_width(2)
8583 .group_input_channels(23)
8584 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8585 .iterations(3)
8586 .TestF32();
8587}
8588
Marat Dukhanefc47b82019-11-18 09:25:38 -08008589TEST(DECONVOLUTION_NHWC_F32, 3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008590 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008591 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008592 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008593 .padding(1)
8594 .kernel_size(3, 3)
8595 .group_input_channels(23)
8596 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8597 .input_pixel_stride(28)
8598 .iterations(3)
8599 .TestF32();
8600}
8601
Marat Dukhanefc47b82019-11-18 09:25:38 -08008602TEST(DECONVOLUTION_NHWC_F32, 3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008603 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008604 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008605 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008606 .padding(1)
8607 .kernel_size(3, 3)
8608 .group_input_channels(23)
8609 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8610 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
8611 .iterations(3)
8612 .TestF32();
8613}
8614
Marat Dukhanefc47b82019-11-18 09:25:38 -08008615TEST(DECONVOLUTION_NHWC_F32, 3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008616 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008617 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008618 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008619 .padding(1)
8620 .kernel_size(3, 3)
8621 .group_input_channels(23)
8622 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8623 .qmin(128)
8624 .iterations(3)
8625 .TestF32();
8626}
8627
Marat Dukhanefc47b82019-11-18 09:25:38 -08008628TEST(DECONVOLUTION_NHWC_F32, 3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008629 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008630 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008631 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008632 .padding(1)
8633 .kernel_size(3, 3)
8634 .group_input_channels(23)
8635 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07008636 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008637 .iterations(3)
8638 .TestF32();
8639}
8640
Marat Dukhanefc47b82019-11-18 09:25:38 -08008641TEST(DECONVOLUTION_NHWC_F32, 3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008642 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07008643 DeconvolutionOperatorTester()
8644 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08008645 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07008646 .padding(1)
8647 .kernel_size(3, 3)
8648 .group_input_channels(23)
8649 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8650 .iterations(3)
8651 .TestF32();
8652}
8653
XNNPACK Teamb455b122019-09-27 18:10:33 -07008654/**************************** CONV path, grouped ****************************/
8655
Marat Dukhanefc47b82019-11-18 09:25:38 -08008656TEST(DECONVOLUTION_NHWC_F32, grouped_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008657 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008658 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008659 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008660 .padding(1)
8661 .kernel_size(3, 3)
8662 .groups(2)
8663 .group_input_channels(15)
8664 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8665 .iterations(3)
8666 .TestF32();
8667}
8668
Marat Dukhanefc47b82019-11-18 09:25:38 -08008669TEST(DECONVOLUTION_NHWC_F32, grouped_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008670 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008671 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
8672 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008673 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008674 .padding_width(1)
8675 .kernel_size(kernel_height, 3)
8676 .groups(2)
8677 .group_input_channels(17)
8678 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8679 .iterations(3)
8680 .TestF32();
8681 }
8682}
8683
Marat Dukhanefc47b82019-11-18 09:25:38 -08008684TEST(DECONVOLUTION_NHWC_F32, grouped_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008685 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008686 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
8687 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008688 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008689 .padding_height(1)
8690 .kernel_size(3, kernel_width)
8691 .groups(2)
8692 .group_input_channels(17)
8693 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8694 .iterations(3)
8695 .TestF32();
8696 }
8697}
8698
Marat Dukhanefc47b82019-11-18 09:25:38 -08008699TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008700 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008701 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
8702 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
8703 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008704 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008705 .padding_width(1)
8706 .padding_top(padding_top)
8707 .padding_bottom(padding_bottom)
8708 .kernel_size(3, 3)
8709 .groups(2)
8710 .group_input_channels(15)
8711 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8712 .iterations(1)
8713 .TestF32();
8714 }
8715 }
8716}
8717
Marat Dukhanefc47b82019-11-18 09:25:38 -08008718TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008719 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008720 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
8721 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
8722 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008723 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008724 .padding_height(1)
8725 .padding_left(padding_left)
8726 .padding_right(padding_right)
8727 .kernel_size(3, 3)
8728 .groups(2)
8729 .group_input_channels(15)
8730 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8731 .iterations(1)
8732 .TestF32();
8733 }
8734 }
8735}
8736
Marat Dukhanefc47b82019-11-18 09:25:38 -08008737TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008738 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008739 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
8740 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008741 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008742 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08008743 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008744 .adjustment_height(adjustment_height)
8745 .kernel_size(3, 3)
8746 .groups(2)
8747 .group_input_channels(15)
8748 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8749 .iterations(1)
8750 .TestF32();
8751 }
8752}
8753
Marat Dukhanefc47b82019-11-18 09:25:38 -08008754TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008755 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008756 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
8757 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008758 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008759 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08008760 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008761 .adjustment_width(adjustment_width)
8762 .kernel_size(3, 3)
8763 .groups(2)
8764 .group_input_channels(15)
8765 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8766 .iterations(1)
8767 .TestF32();
8768 }
8769}
8770
Marat Dukhanefc47b82019-11-18 09:25:38 -08008771TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008772 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008773 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008774 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008775 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008776 .padding(1)
8777 .kernel_size(3, 3)
8778 .groups(2)
8779 .group_input_channels(15)
8780 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8781 .iterations(1)
8782 .TestF32();
8783 }
8784}
8785
Marat Dukhanefc47b82019-11-18 09:25:38 -08008786TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008787 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08008788 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07008789 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008790 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008791 .padding(1)
8792 .kernel_size(3, 3)
8793 .groups(2)
8794 .group_input_channels(15)
8795 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8796 .iterations(1)
8797 .TestF32();
8798 }
8799}
8800
Marat Dukhanefc47b82019-11-18 09:25:38 -08008801TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008802 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008803 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
8804 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008805 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008806 .padding(1)
8807 .kernel_size(3, 3)
8808 .groups(2)
8809 .group_input_channels(input_channels)
8810 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8811 .iterations(1)
8812 .TestF32();
8813 }
8814}
8815
Marat Dukhanefc47b82019-11-18 09:25:38 -08008816TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008817 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008818 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
8819 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008820 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008821 .padding(1)
8822 .kernel_size(3, 3)
8823 .groups(2)
8824 .group_input_channels(23)
8825 .group_output_channels(output_channels)
8826 .iterations(1)
8827 .TestF32();
8828 }
8829}
8830
Marat Dukhanefc47b82019-11-18 09:25:38 -08008831TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008832 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008833 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
8834 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008835 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008836 .padding(1)
8837 .kernel_size(3, 3)
8838 .dilation_height(dilation_height)
8839 .groups(2)
8840 .group_input_channels(23)
8841 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8842 .iterations(3)
8843 .TestF32();
8844 }
8845}
8846
Marat Dukhanefc47b82019-11-18 09:25:38 -08008847TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008848 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008849 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
8850 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008851 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008852 .padding(1)
8853 .kernel_size(3, 3)
8854 .dilation_width(dilation_width)
8855 .groups(2)
8856 .group_input_channels(23)
8857 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8858 .iterations(3)
8859 .TestF32();
8860 }
8861}
8862
Marat Dukhanefc47b82019-11-18 09:25:38 -08008863TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008864 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008865 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008866 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008867 .padding(1)
8868 .kernel_size(3, 3)
8869 .dilation_height(3)
8870 .stride_height(2)
8871 .groups(2)
8872 .group_input_channels(23)
8873 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8874 .iterations(3)
8875 .TestF32();
8876}
8877
Marat Dukhanefc47b82019-11-18 09:25:38 -08008878TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008879 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008880 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008881 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008882 .padding(1)
8883 .kernel_size(3, 3)
8884 .dilation_width(3)
8885 .stride_width(2)
8886 .groups(2)
8887 .group_input_channels(23)
8888 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8889 .iterations(3)
8890 .TestF32();
8891}
8892
Marat Dukhanefc47b82019-11-18 09:25:38 -08008893TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008894 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008895 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008896 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008897 .padding(1)
8898 .kernel_size(3, 3)
8899 .groups(2)
8900 .group_input_channels(23)
8901 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8902 .input_pixel_stride(47)
8903 .iterations(3)
8904 .TestF32();
8905}
8906
Marat Dukhanefc47b82019-11-18 09:25:38 -08008907TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008908 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008909 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008910 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008911 .padding(1)
8912 .kernel_size(3, 3)
8913 .groups(2)
8914 .group_input_channels(23)
8915 .group_output_channels(xnn_params.f32.gemm.nr + 3)
8916 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
8917 .iterations(3)
8918 .TestF32();
8919}
8920
Marat Dukhanefc47b82019-11-18 09:25:38 -08008921TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008922 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008923 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008924 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008925 .padding(1)
8926 .kernel_size(3, 3)
8927 .groups(2)
8928 .group_input_channels(23)
8929 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8930 .qmin(128)
8931 .iterations(3)
8932 .TestF32();
8933}
8934
Marat Dukhanefc47b82019-11-18 09:25:38 -08008935TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008936 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008937 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08008938 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008939 .padding(1)
8940 .kernel_size(3, 3)
8941 .groups(2)
8942 .group_input_channels(23)
8943 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07008944 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008945 .iterations(3)
8946 .TestF32();
8947}
8948
Marat Dukhanefc47b82019-11-18 09:25:38 -08008949TEST(DECONVOLUTION_NHWC_F32, grouped_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008950 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07008951 DeconvolutionOperatorTester()
8952 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08008953 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07008954 .padding(1)
8955 .kernel_size(3, 3)
8956 .groups(2)
8957 .group_input_channels(23)
8958 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8959 .iterations(3)
8960 .TestF32();
8961}
8962
XNNPACK Teamb455b122019-09-27 18:10:33 -07008963/**************************** CONV path, batched ****************************/
8964
Marat Dukhanefc47b82019-11-18 09:25:38 -08008965TEST(DECONVOLUTION_NHWC_F32, batched_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008966 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008967 DeconvolutionOperatorTester()
8968 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008969 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008970 .padding(1)
8971 .kernel_size(3, 3)
8972 .group_input_channels(15)
8973 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8974 .iterations(3)
8975 .TestF32();
8976}
8977
Marat Dukhanefc47b82019-11-18 09:25:38 -08008978TEST(DECONVOLUTION_NHWC_F32, batched_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008979 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008980 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
8981 DeconvolutionOperatorTester()
8982 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008983 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008984 .padding_width(1)
8985 .kernel_size(kernel_height, 3)
8986 .group_input_channels(17)
8987 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
8988 .iterations(3)
8989 .TestF32();
8990 }
8991}
8992
Marat Dukhanefc47b82019-11-18 09:25:38 -08008993TEST(DECONVOLUTION_NHWC_F32, batched_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08008994 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07008995 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
8996 DeconvolutionOperatorTester()
8997 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08008998 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07008999 .padding_height(1)
9000 .kernel_size(3, kernel_width)
9001 .group_input_channels(17)
9002 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9003 .iterations(3)
9004 .TestF32();
9005 }
9006}
9007
Marat Dukhanefc47b82019-11-18 09:25:38 -08009008TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009009 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009010 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
9011 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
9012 DeconvolutionOperatorTester()
9013 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009014 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009015 .padding_width(1)
9016 .padding_top(padding_top)
9017 .padding_bottom(padding_bottom)
9018 .kernel_size(3, 3)
9019 .group_input_channels(15)
9020 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9021 .iterations(1)
9022 .TestF32();
9023 }
9024 }
9025}
9026
Marat Dukhanefc47b82019-11-18 09:25:38 -08009027TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009028 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009029 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
9030 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
9031 DeconvolutionOperatorTester()
9032 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009033 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009034 .padding_height(1)
9035 .padding_left(padding_left)
9036 .padding_right(padding_right)
9037 .kernel_size(3, 3)
9038 .group_input_channels(15)
9039 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9040 .iterations(1)
9041 .TestF32();
9042 }
9043 }
9044}
9045
Marat Dukhanefc47b82019-11-18 09:25:38 -08009046TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009047 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009048 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
9049 DeconvolutionOperatorTester()
9050 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009051 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009052 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08009053 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009054 .adjustment_height(adjustment_height)
9055 .kernel_size(3, 3)
9056 .group_input_channels(15)
9057 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9058 .iterations(1)
9059 .TestF32();
9060 }
9061}
9062
Marat Dukhanefc47b82019-11-18 09:25:38 -08009063TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009064 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009065 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
9066 DeconvolutionOperatorTester()
9067 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009068 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009069 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08009070 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009071 .adjustment_width(adjustment_width)
9072 .kernel_size(3, 3)
9073 .group_input_channels(15)
9074 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9075 .iterations(1)
9076 .TestF32();
9077 }
9078}
9079
Marat Dukhanefc47b82019-11-18 09:25:38 -08009080TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009081 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009082 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009083 DeconvolutionOperatorTester()
9084 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009085 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009086 .padding(1)
9087 .kernel_size(3, 3)
9088 .group_input_channels(15)
9089 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9090 .iterations(1)
9091 .TestF32();
9092 }
9093}
9094
Marat Dukhanefc47b82019-11-18 09:25:38 -08009095TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009096 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009097 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009098 DeconvolutionOperatorTester()
9099 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009100 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009101 .padding(1)
9102 .kernel_size(3, 3)
9103 .group_input_channels(15)
9104 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9105 .iterations(1)
9106 .TestF32();
9107 }
9108}
9109
Marat Dukhanefc47b82019-11-18 09:25:38 -08009110TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009111 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009112 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
9113 DeconvolutionOperatorTester()
9114 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009115 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009116 .padding(1)
9117 .kernel_size(3, 3)
9118 .group_input_channels(input_channels)
9119 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9120 .iterations(1)
9121 .TestF32();
9122 }
9123}
9124
Marat Dukhanefc47b82019-11-18 09:25:38 -08009125TEST(DECONVOLUTION_NHWC_F32, batched_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009126 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009127 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
9128 DeconvolutionOperatorTester()
9129 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009130 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009131 .padding(1)
9132 .kernel_size(3, 3)
9133 .group_input_channels(23)
9134 .group_output_channels(output_channels)
9135 .iterations(1)
9136 .TestF32();
9137 }
9138}
9139
Marat Dukhanefc47b82019-11-18 09:25:38 -08009140TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009141 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009142 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
9143 DeconvolutionOperatorTester()
9144 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009145 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009146 .padding(1)
9147 .kernel_size(3, 3)
9148 .dilation_height(dilation_height)
9149 .group_input_channels(23)
9150 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9151 .iterations(3)
9152 .TestF32();
9153 }
9154}
9155
Marat Dukhanefc47b82019-11-18 09:25:38 -08009156TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009157 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009158 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
9159 DeconvolutionOperatorTester()
9160 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009161 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009162 .padding(1)
9163 .kernel_size(3, 3)
9164 .dilation_width(dilation_width)
9165 .group_input_channels(23)
9166 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9167 .iterations(3)
9168 .TestF32();
9169 }
9170}
9171
Marat Dukhanefc47b82019-11-18 09:25:38 -08009172TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009173 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009174 DeconvolutionOperatorTester()
9175 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009176 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009177 .padding(1)
9178 .kernel_size(3, 3)
9179 .dilation_height(3)
9180 .stride_height(2)
9181 .group_input_channels(23)
9182 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9183 .iterations(3)
9184 .TestF32();
9185}
9186
Marat Dukhanefc47b82019-11-18 09:25:38 -08009187TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009188 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009189 DeconvolutionOperatorTester()
9190 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009191 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009192 .padding(1)
9193 .kernel_size(3, 3)
9194 .dilation_width(3)
9195 .stride_width(2)
9196 .group_input_channels(23)
9197 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9198 .iterations(3)
9199 .TestF32();
9200}
9201
Marat Dukhanefc47b82019-11-18 09:25:38 -08009202TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009203 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009204 DeconvolutionOperatorTester()
9205 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009206 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009207 .padding(1)
9208 .kernel_size(3, 3)
9209 .group_input_channels(23)
9210 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9211 .input_pixel_stride(28)
9212 .iterations(3)
9213 .TestF32();
9214}
9215
Marat Dukhanefc47b82019-11-18 09:25:38 -08009216TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009217 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009218 DeconvolutionOperatorTester()
9219 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009220 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009221 .padding(1)
9222 .kernel_size(3, 3)
9223 .group_input_channels(23)
9224 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9225 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
9226 .iterations(3)
9227 .TestF32();
9228}
9229
Marat Dukhanefc47b82019-11-18 09:25:38 -08009230TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009231 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009232 DeconvolutionOperatorTester()
9233 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009234 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009235 .padding(1)
9236 .kernel_size(3, 3)
9237 .group_input_channels(23)
9238 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9239 .qmin(128)
9240 .iterations(3)
9241 .TestF32();
9242}
9243
Marat Dukhanefc47b82019-11-18 09:25:38 -08009244TEST(DECONVOLUTION_NHWC_F32, batched_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009245 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009246 DeconvolutionOperatorTester()
9247 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009248 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009249 .padding(1)
9250 .kernel_size(3, 3)
9251 .group_input_channels(23)
9252 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07009253 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009254 .iterations(3)
9255 .TestF32();
9256}
9257
Marat Dukhanefc47b82019-11-18 09:25:38 -08009258TEST(DECONVOLUTION_NHWC_F32, batched_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009259 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07009260 DeconvolutionOperatorTester()
9261 .has_bias(false)
9262 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009263 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07009264 .padding(1)
9265 .kernel_size(3, 3)
9266 .group_input_channels(23)
9267 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9268 .iterations(3)
9269 .TestF32();
9270}
9271
XNNPACK Teamb455b122019-09-27 18:10:33 -07009272/**************************** CONV path, grouped, batched ****************************/
9273
Marat Dukhanefc47b82019-11-18 09:25:38 -08009274TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009275 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009276 DeconvolutionOperatorTester()
9277 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009278 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009279 .padding(1)
9280 .kernel_size(3, 3)
9281 .groups(2)
9282 .group_input_channels(15)
9283 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9284 .iterations(3)
9285 .TestF32();
9286}
9287
Marat Dukhanefc47b82019-11-18 09:25:38 -08009288TEST(DECONVOLUTION_NHWC_F32, batched_grouped_Kx3) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009289 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009290 for (size_t kernel_height = 1; kernel_height <= 4; kernel_height *= 2) {
9291 DeconvolutionOperatorTester()
9292 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009293 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009294 .padding_width(1)
9295 .kernel_size(kernel_height, 3)
9296 .groups(2)
9297 .group_input_channels(17)
9298 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9299 .iterations(3)
9300 .TestF32();
9301 }
9302}
9303
Marat Dukhanefc47b82019-11-18 09:25:38 -08009304TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3xK) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009305 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009306 for (size_t kernel_width = 1; kernel_width <= 4; kernel_width *= 2) {
9307 DeconvolutionOperatorTester()
9308 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009309 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009310 .padding_height(1)
9311 .kernel_size(3, kernel_width)
9312 .groups(2)
9313 .group_input_channels(17)
9314 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9315 .iterations(3)
9316 .TestF32();
9317 }
9318}
9319
Marat Dukhanefc47b82019-11-18 09:25:38 -08009320TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009321 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009322 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
9323 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
9324 DeconvolutionOperatorTester()
9325 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009326 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009327 .padding_width(1)
9328 .padding_top(padding_top)
9329 .padding_bottom(padding_bottom)
9330 .kernel_size(3, 3)
9331 .groups(2)
9332 .group_input_channels(15)
9333 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9334 .iterations(1)
9335 .TestF32();
9336 }
9337 }
9338}
9339
Marat Dukhanefc47b82019-11-18 09:25:38 -08009340TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009341 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009342 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
9343 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
9344 DeconvolutionOperatorTester()
9345 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009346 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009347 .padding_height(1)
9348 .padding_left(padding_left)
9349 .padding_right(padding_right)
9350 .kernel_size(3, 3)
9351 .groups(2)
9352 .group_input_channels(15)
9353 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9354 .iterations(1)
9355 .TestF32();
9356 }
9357 }
9358}
9359
Marat Dukhanefc47b82019-11-18 09:25:38 -08009360TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009361 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009362 for (size_t adjustment_height = 1; adjustment_height <= 2; adjustment_height++) {
9363 DeconvolutionOperatorTester()
9364 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009365 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009366 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08009367 .stride_height(adjustment_height + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009368 .adjustment_height(adjustment_height)
9369 .kernel_size(3, 3)
9370 .groups(2)
9371 .group_input_channels(15)
9372 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9373 .iterations(1)
9374 .TestF32();
9375 }
9376}
9377
Marat Dukhanefc47b82019-11-18 09:25:38 -08009378TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009379 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009380 for (size_t adjustment_width = 1; adjustment_width <= 2; adjustment_width++) {
9381 DeconvolutionOperatorTester()
9382 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009383 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009384 .padding(1)
Marat Dukhan1898b912019-11-05 12:25:18 -08009385 .stride_width(adjustment_width + 1)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009386 .adjustment_width(adjustment_width)
9387 .kernel_size(3, 3)
9388 .groups(2)
9389 .group_input_channels(15)
9390 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9391 .iterations(1)
9392 .TestF32();
9393 }
9394}
9395
Marat Dukhanefc47b82019-11-18 09:25:38 -08009396TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009397 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009398 for (size_t input_height = kUnstridedInputHeight - 2; input_height <= kUnstridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009399 DeconvolutionOperatorTester()
9400 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009401 .input_size(input_height, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009402 .padding(1)
9403 .kernel_size(3, 3)
9404 .groups(2)
9405 .group_input_channels(15)
9406 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9407 .iterations(1)
9408 .TestF32();
9409 }
9410}
9411
Marat Dukhanefc47b82019-11-18 09:25:38 -08009412TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009413 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009414 for (size_t input_width = kUnstridedInputWidth - 2; input_width <= kUnstridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009415 DeconvolutionOperatorTester()
9416 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009417 .input_size(kUnstridedInputHeight, input_width)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009418 .padding(1)
9419 .kernel_size(3, 3)
9420 .groups(2)
9421 .group_input_channels(15)
9422 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9423 .iterations(1)
9424 .TestF32();
9425 }
9426}
9427
Marat Dukhanefc47b82019-11-18 09:25:38 -08009428TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009429 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009430 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
9431 DeconvolutionOperatorTester()
9432 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009433 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009434 .padding(1)
9435 .kernel_size(3, 3)
9436 .groups(2)
9437 .group_input_channels(input_channels)
9438 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9439 .iterations(1)
9440 .TestF32();
9441 }
9442}
9443
Marat Dukhanefc47b82019-11-18 09:25:38 -08009444TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009445 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009446 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
9447 DeconvolutionOperatorTester()
9448 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009449 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009450 .padding(1)
9451 .kernel_size(3, 3)
9452 .groups(2)
9453 .group_input_channels(23)
9454 .group_output_channels(output_channels)
9455 .iterations(1)
9456 .TestF32();
9457 }
9458}
9459
Marat Dukhanefc47b82019-11-18 09:25:38 -08009460TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_height_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009461 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009462 for (size_t dilation_height = 2; dilation_height <= 3; dilation_height++) {
9463 DeconvolutionOperatorTester()
9464 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009465 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009466 .padding(1)
9467 .kernel_size(3, 3)
9468 .dilation_height(dilation_height)
9469 .groups(2)
9470 .group_input_channels(23)
9471 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9472 .iterations(3)
9473 .TestF32();
9474 }
9475}
9476
Marat Dukhanefc47b82019-11-18 09:25:38 -08009477TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_width_dilation) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009478 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009479 for (size_t dilation_width = 2; dilation_width <= 3; dilation_width++) {
9480 DeconvolutionOperatorTester()
9481 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009482 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009483 .padding(1)
9484 .kernel_size(3, 3)
9485 .dilation_width(dilation_width)
9486 .groups(2)
9487 .group_input_channels(23)
9488 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9489 .iterations(3)
9490 .TestF32();
9491 }
9492}
9493
Marat Dukhanefc47b82019-11-18 09:25:38 -08009494TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_height_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009495 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009496 DeconvolutionOperatorTester()
9497 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009498 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009499 .padding(1)
9500 .kernel_size(3, 3)
9501 .dilation_height(3)
9502 .stride_width(2)
9503 .groups(2)
9504 .group_input_channels(23)
9505 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9506 .iterations(3)
9507 .TestF32();
9508}
9509
Marat Dukhanefc47b82019-11-18 09:25:38 -08009510TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_width_dilation_and_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009511 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009512 DeconvolutionOperatorTester()
9513 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009514 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009515 .padding(1)
9516 .kernel_size(3, 3)
9517 .dilation_width(3)
9518 .stride_width(2)
9519 .groups(2)
9520 .group_input_channels(23)
9521 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9522 .iterations(3)
9523 .TestF32();
9524}
9525
Marat Dukhanefc47b82019-11-18 09:25:38 -08009526TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009527 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009528 DeconvolutionOperatorTester()
9529 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009530 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009531 .padding(1)
9532 .kernel_size(3, 3)
9533 .groups(2)
9534 .group_input_channels(23)
9535 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9536 .input_pixel_stride(47)
9537 .iterations(3)
9538 .TestF32();
9539}
9540
Marat Dukhanefc47b82019-11-18 09:25:38 -08009541TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009542 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009543 DeconvolutionOperatorTester()
9544 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009545 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009546 .padding(1)
9547 .kernel_size(3, 3)
9548 .groups(2)
9549 .group_input_channels(23)
9550 .group_output_channels(xnn_params.f32.gemm.nr + 3)
9551 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
9552 .iterations(3)
9553 .TestF32();
9554}
9555
Marat Dukhanefc47b82019-11-18 09:25:38 -08009556TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009557 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009558 DeconvolutionOperatorTester()
9559 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009560 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009561 .padding(1)
9562 .kernel_size(3, 3)
9563 .groups(2)
9564 .group_input_channels(23)
9565 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9566 .qmin(128)
9567 .iterations(3)
9568 .TestF32();
9569}
9570
Marat Dukhanefc47b82019-11-18 09:25:38 -08009571TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009572 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009573 DeconvolutionOperatorTester()
9574 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009575 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009576 .padding(1)
9577 .kernel_size(3, 3)
9578 .groups(2)
9579 .group_input_channels(23)
9580 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07009581 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009582 .iterations(3)
9583 .TestF32();
9584}
9585
Marat Dukhanefc47b82019-11-18 09:25:38 -08009586TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009587 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07009588 DeconvolutionOperatorTester()
9589 .has_bias(false)
9590 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009591 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07009592 .padding(1)
9593 .kernel_size(3, 3)
9594 .groups(2)
9595 .group_input_channels(23)
9596 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9597 .iterations(3)
9598 .TestF32();
9599}
9600
XNNPACK Teamb455b122019-09-27 18:10:33 -07009601/**************************** CONV path, setup ****************************/
9602
Marat Dukhanefc47b82019-11-18 09:25:38 -08009603TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_batch) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009604 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009605 DeconvolutionOperatorTester()
9606 .batch_size(2)
9607 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -08009608 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009609 .kernel_height(3)
9610 .kernel_width(5)
9611 .groups(2)
9612 .group_input_channels(15)
9613 .group_output_channels(17)
9614 .TestSetupF32();
9615}
9616
Marat Dukhanefc47b82019-11-18 09:25:38 -08009617TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009618 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009619 DeconvolutionOperatorTester()
9620 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009621 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
9622 .next_input_height(kUnstridedInputHeight + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009623 .kernel_height(3)
9624 .kernel_width(5)
9625 .groups(2)
9626 .group_input_channels(15)
9627 .group_output_channels(17)
9628 .TestSetupF32();
9629}
9630
Marat Dukhanefc47b82019-11-18 09:25:38 -08009631TEST(DECONVOLUTION_NHWC_F32, 3x3_setup_changing_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009632 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009633 DeconvolutionOperatorTester()
9634 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -08009635 .input_size(kUnstridedInputHeight, kUnstridedInputWidth)
9636 .next_input_width(kUnstridedInputWidth + 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009637 .kernel_height(3)
9638 .kernel_width(5)
9639 .groups(2)
9640 .group_input_channels(15)
9641 .group_output_channels(17)
9642 .TestSetupF32();
9643}
9644
Marat Dukhan29954272020-02-13 17:56:11 -08009645/**************************** SUBCONV2D/IGEMM path ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07009646
Marat Dukhanefc47b82019-11-18 09:25:38 -08009647TEST(DECONVOLUTION_NHWC_F32, 3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009648 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009649 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009650 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009651 .padding(1)
9652 .kernel_size(3, 3)
9653 .stride(2)
9654 .group_input_channels(15)
9655 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9656 .iterations(3)
9657 .TestF32();
9658}
9659
Marat Dukhanefc47b82019-11-18 09:25:38 -08009660TEST(DECONVOLUTION_NHWC_F32, Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009661 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009662 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
9663 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009664 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009665 .padding_width(1)
9666 .kernel_size(kernel_height, 3)
9667 .stride(2)
9668 .group_input_channels(17)
9669 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9670 .iterations(3)
9671 .TestF32();
9672 }
9673}
9674
Marat Dukhanefc47b82019-11-18 09:25:38 -08009675TEST(DECONVOLUTION_NHWC_F32, 3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009676 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009677 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
9678 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009679 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009680 .padding_height(1)
9681 .kernel_size(3, kernel_width)
9682 .stride(2)
9683 .group_input_channels(17)
9684 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9685 .iterations(3)
9686 .TestF32();
9687 }
9688}
9689
Marat Dukhanefc47b82019-11-18 09:25:38 -08009690TEST(DECONVOLUTION_NHWC_F32, 3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009691 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009692 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
9693 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009694 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009695 .padding(1)
9696 .padding_width(1)
9697 .kernel_size(3, 3)
9698 .stride_height(stride_height)
9699 .group_input_channels(17)
9700 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9701 .iterations(3)
9702 .TestF32();
9703 }
9704}
9705
Marat Dukhanefc47b82019-11-18 09:25:38 -08009706TEST(DECONVOLUTION_NHWC_F32, 3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009707 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009708 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
9709 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009710 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009711 .padding(1)
9712 .padding_width(1)
9713 .kernel_size(3, 3)
9714 .stride_width(stride_width)
9715 .group_input_channels(17)
9716 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9717 .iterations(3)
9718 .TestF32();
9719 }
9720}
9721
Marat Dukhanefc47b82019-11-18 09:25:38 -08009722TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009723 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009724 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
9725 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
9726 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009727 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009728 .padding_width(1)
9729 .padding_top(padding_top)
9730 .padding_bottom(padding_bottom)
9731 .kernel_size(3, 3)
9732 .stride(2)
9733 .group_input_channels(15)
9734 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9735 .iterations(1)
9736 .TestF32();
9737 }
9738 }
9739}
9740
Marat Dukhanefc47b82019-11-18 09:25:38 -08009741TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009742 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009743 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
9744 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
9745 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009746 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009747 .padding_height(1)
9748 .padding_left(padding_left)
9749 .padding_right(padding_right)
9750 .kernel_size(3, 3)
9751 .stride(2)
9752 .group_input_channels(15)
9753 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9754 .iterations(1)
9755 .TestF32();
9756 }
9757 }
9758}
9759
Marat Dukhanefc47b82019-11-18 09:25:38 -08009760TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009761 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08009762 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009763 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009764 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009765 .padding(1)
9766 .adjustment_height(adjustment_height)
9767 .kernel_size(3, 3)
9768 .stride(2)
9769 .group_input_channels(15)
9770 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9771 .iterations(1)
9772 .TestF32();
9773 }
9774}
9775
Marat Dukhanefc47b82019-11-18 09:25:38 -08009776TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009777 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -08009778 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009779 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009780 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009781 .padding(1)
9782 .adjustment_width(adjustment_width)
9783 .kernel_size(3, 3)
9784 .stride(2)
9785 .group_input_channels(15)
9786 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9787 .iterations(1)
9788 .TestF32();
9789 }
9790}
9791
Marat Dukhanefc47b82019-11-18 09:25:38 -08009792TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009793 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009794 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009795 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009796 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009797 .padding(1)
9798 .kernel_size(3, 3)
9799 .stride(2)
9800 .group_input_channels(15)
9801 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9802 .iterations(1)
9803 .TestF32();
9804 }
9805}
9806
Marat Dukhanefc47b82019-11-18 09:25:38 -08009807TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009808 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -08009809 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -07009810 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009811 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009812 .padding(1)
9813 .kernel_size(3, 3)
9814 .stride(2)
9815 .group_input_channels(15)
9816 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9817 .iterations(1)
9818 .TestF32();
9819 }
9820}
9821
Marat Dukhanefc47b82019-11-18 09:25:38 -08009822TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009823 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009824 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
9825 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009826 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009827 .padding(1)
9828 .kernel_size(3, 3)
9829 .stride(2)
9830 .group_input_channels(input_channels)
9831 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9832 .iterations(1)
9833 .TestF32();
9834 }
9835}
9836
Marat Dukhanefc47b82019-11-18 09:25:38 -08009837TEST(DECONVOLUTION_NHWC_F32, 3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009838 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009839 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
9840 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009841 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009842 .padding(1)
9843 .kernel_size(3, 3)
9844 .stride(2)
9845 .group_input_channels(23)
9846 .group_output_channels(output_channels)
9847 .iterations(1)
9848 .TestF32();
9849 }
9850}
9851
Marat Dukhanefc47b82019-11-18 09:25:38 -08009852TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009853 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009854 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009855 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009856 .padding(1)
9857 .kernel_size(3, 3)
9858 .stride(2)
9859 .group_input_channels(23)
9860 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9861 .input_pixel_stride(28)
9862 .iterations(3)
9863 .TestF32();
9864}
9865
Marat Dukhanefc47b82019-11-18 09:25:38 -08009866TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009867 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009868 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009869 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009870 .padding(1)
9871 .kernel_size(3, 3)
9872 .stride(2)
9873 .group_input_channels(23)
9874 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9875 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
9876 .iterations(3)
9877 .TestF32();
9878}
9879
Marat Dukhanefc47b82019-11-18 09:25:38 -08009880TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009881 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009882 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009883 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009884 .padding(1)
9885 .kernel_size(3, 3)
9886 .stride(2)
9887 .group_input_channels(23)
9888 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9889 .qmin(128)
9890 .iterations(3)
9891 .TestF32();
9892}
9893
Marat Dukhanefc47b82019-11-18 09:25:38 -08009894TEST(DECONVOLUTION_NHWC_F32, 3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009895 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009896 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009897 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009898 .padding(1)
9899 .kernel_size(3, 3)
9900 .stride(2)
9901 .group_input_channels(23)
9902 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -07009903 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009904 .iterations(3)
9905 .TestF32();
9906}
9907
Marat Dukhanefc47b82019-11-18 09:25:38 -08009908TEST(DECONVOLUTION_NHWC_F32, 3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009909 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -07009910 DeconvolutionOperatorTester()
9911 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -08009912 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -07009913 .padding(1)
9914 .kernel_size(3, 3)
9915 .stride(2)
9916 .group_input_channels(23)
9917 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9918 .iterations(3)
9919 .TestF32();
9920}
9921
Marat Dukhan29954272020-02-13 17:56:11 -08009922/**************************** SUBCONV2D/IGEMM path, grouped ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -07009923
Marat Dukhanefc47b82019-11-18 09:25:38 -08009924TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009925 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009926 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009927 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009928 .padding(1)
9929 .kernel_size(3, 3)
9930 .stride(2)
9931 .groups(2)
9932 .group_input_channels(17)
9933 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9934 .iterations(3)
9935 .TestF32();
9936}
9937
Marat Dukhanefc47b82019-11-18 09:25:38 -08009938TEST(DECONVOLUTION_NHWC_F32, grouped_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009939 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009940 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
9941 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009942 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009943 .padding_width(1)
9944 .kernel_size(kernel_height, 3)
9945 .stride(2)
9946 .groups(2)
9947 .group_input_channels(17)
9948 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9949 .iterations(3)
9950 .TestF32();
9951 }
9952}
9953
Marat Dukhanefc47b82019-11-18 09:25:38 -08009954TEST(DECONVOLUTION_NHWC_F32, grouped_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009955 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009956 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
9957 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009958 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009959 .padding_height(1)
9960 .kernel_size(3, kernel_width)
9961 .stride(2)
9962 .groups(2)
9963 .group_input_channels(17)
9964 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9965 .iterations(3)
9966 .TestF32();
9967 }
9968}
9969
Marat Dukhanefc47b82019-11-18 09:25:38 -08009970TEST(DECONVOLUTION_NHWC_F32, grouped_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009971 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009972 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
9973 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009974 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009975 .padding(1)
9976 .padding_width(1)
9977 .kernel_size(3, 3)
9978 .stride_height(stride_height)
9979 .groups(2)
9980 .group_input_channels(17)
9981 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9982 .iterations(3)
9983 .TestF32();
9984 }
9985}
9986
Marat Dukhanefc47b82019-11-18 09:25:38 -08009987TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -08009988 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -07009989 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
9990 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -08009991 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -07009992 .padding(1)
9993 .padding_width(1)
9994 .kernel_size(3, 3)
9995 .stride_width(stride_width)
9996 .groups(2)
9997 .group_input_channels(17)
9998 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
9999 .iterations(3)
10000 .TestF32();
10001 }
10002}
10003
Marat Dukhanefc47b82019-11-18 09:25:38 -080010004TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010005 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010006 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
10007 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
10008 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010009 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010010 .padding_width(1)
10011 .padding_top(padding_top)
10012 .padding_bottom(padding_bottom)
10013 .kernel_size(3, 3)
10014 .stride(2)
10015 .groups(2)
10016 .group_input_channels(17)
10017 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10018 .iterations(1)
10019 .TestF32();
10020 }
10021 }
10022}
10023
Marat Dukhanefc47b82019-11-18 09:25:38 -080010024TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010025 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010026 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
10027 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
10028 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010029 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010030 .padding_height(1)
10031 .padding_left(padding_left)
10032 .padding_right(padding_right)
10033 .kernel_size(3, 3)
10034 .stride(2)
10035 .groups(2)
10036 .group_input_channels(17)
10037 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10038 .iterations(1)
10039 .TestF32();
10040 }
10041 }
10042}
10043
Marat Dukhanefc47b82019-11-18 09:25:38 -080010044TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010045 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010046 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010047 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010048 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010049 .padding(1)
10050 .adjustment_height(adjustment_height)
10051 .kernel_size(3, 3)
10052 .stride(2)
10053 .groups(2)
10054 .group_input_channels(17)
10055 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10056 .iterations(1)
10057 .TestF32();
10058 }
10059}
10060
Marat Dukhanefc47b82019-11-18 09:25:38 -080010061TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010062 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010063 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010064 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010065 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010066 .padding(1)
10067 .adjustment_width(adjustment_width)
10068 .kernel_size(3, 3)
10069 .stride(2)
10070 .groups(2)
10071 .group_input_channels(17)
10072 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10073 .iterations(1)
10074 .TestF32();
10075 }
10076}
10077
Marat Dukhanefc47b82019-11-18 09:25:38 -080010078TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010079 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010080 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010081 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010082 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010083 .padding(1)
10084 .kernel_size(3, 3)
10085 .stride(2)
10086 .groups(2)
10087 .group_input_channels(17)
10088 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10089 .iterations(1)
10090 .TestF32();
10091 }
10092}
10093
Marat Dukhanefc47b82019-11-18 09:25:38 -080010094TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010095 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010096 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010097 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010098 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010099 .padding(1)
10100 .kernel_size(3, 3)
10101 .stride(2)
10102 .groups(2)
10103 .group_input_channels(17)
10104 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10105 .iterations(1)
10106 .TestF32();
10107 }
10108}
10109
Marat Dukhanefc47b82019-11-18 09:25:38 -080010110TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010111 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010112 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
10113 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010114 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010115 .padding(1)
10116 .kernel_size(3, 3)
10117 .stride(2)
10118 .groups(2)
10119 .group_input_channels(input_channels)
10120 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10121 .iterations(1)
10122 .TestF32();
10123 }
10124}
10125
Marat Dukhanefc47b82019-11-18 09:25:38 -080010126TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010127 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010128 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
10129 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010130 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010131 .padding(1)
10132 .kernel_size(3, 3)
10133 .stride(2)
10134 .groups(2)
10135 .group_input_channels(17)
10136 .group_output_channels(output_channels)
10137 .iterations(1)
10138 .TestF32();
10139 }
10140}
10141
Marat Dukhanefc47b82019-11-18 09:25:38 -080010142TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010143 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010144 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010145 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010146 .padding(1)
10147 .kernel_size(3, 3)
10148 .stride(2)
10149 .groups(2)
10150 .group_input_channels(17)
10151 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10152 .input_pixel_stride(37)
10153 .iterations(3)
10154 .TestF32();
10155}
10156
Marat Dukhanefc47b82019-11-18 09:25:38 -080010157TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010158 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010159 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010160 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010161 .padding(1)
10162 .kernel_size(3, 3)
10163 .stride(2)
10164 .groups(2)
10165 .group_input_channels(17)
10166 .group_output_channels(xnn_params.f32.gemm.nr + 3)
10167 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
10168 .iterations(3)
10169 .TestF32();
10170}
10171
Marat Dukhanefc47b82019-11-18 09:25:38 -080010172TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010173 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010174 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010175 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010176 .padding(1)
10177 .kernel_size(3, 3)
10178 .stride(2)
10179 .groups(2)
10180 .group_input_channels(17)
10181 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10182 .qmin(128)
10183 .iterations(3)
10184 .TestF32();
10185}
10186
Marat Dukhanefc47b82019-11-18 09:25:38 -080010187TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010188 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010189 DeconvolutionOperatorTester()
Marat Dukhana41533d2019-11-04 10:40:51 -080010190 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010191 .padding(1)
10192 .kernel_size(3, 3)
10193 .stride(2)
10194 .groups(2)
10195 .group_input_channels(17)
10196 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -070010197 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010198 .iterations(3)
10199 .TestF32();
10200}
10201
Marat Dukhanefc47b82019-11-18 09:25:38 -080010202TEST(DECONVOLUTION_NHWC_F32, grouped_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010203 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -070010204 DeconvolutionOperatorTester()
10205 .has_bias(false)
Marat Dukhana41533d2019-11-04 10:40:51 -080010206 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -070010207 .padding(1)
10208 .kernel_size(3, 3)
10209 .stride(2)
10210 .groups(2)
10211 .group_input_channels(17)
10212 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10213 .iterations(3)
10214 .TestF32();
10215}
10216
Marat Dukhan29954272020-02-13 17:56:11 -080010217/**************************** SUBCONV2D/IGEMM path, batched ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -070010218
Marat Dukhanefc47b82019-11-18 09:25:38 -080010219TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010220 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010221 DeconvolutionOperatorTester()
10222 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010223 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010224 .padding(1)
10225 .kernel_size(3, 3)
10226 .stride(2)
10227 .group_input_channels(15)
10228 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10229 .iterations(3)
10230 .TestF32();
10231}
10232
Marat Dukhanefc47b82019-11-18 09:25:38 -080010233TEST(DECONVOLUTION_NHWC_F32, batched_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010234 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010235 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
10236 DeconvolutionOperatorTester()
10237 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010238 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010239 .padding_width(1)
10240 .kernel_size(kernel_height, 3)
10241 .stride(2)
10242 .group_input_channels(17)
10243 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10244 .iterations(3)
10245 .TestF32();
10246 }
10247}
10248
Marat Dukhanefc47b82019-11-18 09:25:38 -080010249TEST(DECONVOLUTION_NHWC_F32, batched_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010250 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010251 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
10252 DeconvolutionOperatorTester()
10253 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010254 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010255 .padding_height(1)
10256 .kernel_size(3, kernel_width)
10257 .stride(2)
10258 .group_input_channels(17)
10259 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10260 .iterations(3)
10261 .TestF32();
10262 }
10263}
10264
Marat Dukhanefc47b82019-11-18 09:25:38 -080010265TEST(DECONVOLUTION_NHWC_F32, batched_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010266 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010267 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
10268 DeconvolutionOperatorTester()
10269 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010270 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010271 .padding(1)
10272 .padding_width(1)
10273 .kernel_size(3, 3)
10274 .stride_height(stride_height)
10275 .group_input_channels(17)
10276 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10277 .iterations(3)
10278 .TestF32();
10279 }
10280}
10281
Marat Dukhanefc47b82019-11-18 09:25:38 -080010282TEST(DECONVOLUTION_NHWC_F32, batched_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010283 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010284 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
10285 DeconvolutionOperatorTester()
10286 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010287 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010288 .padding(1)
10289 .padding_width(1)
10290 .kernel_size(3, 3)
10291 .stride_width(stride_width)
10292 .group_input_channels(17)
10293 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10294 .iterations(3)
10295 .TestF32();
10296 }
10297}
10298
Marat Dukhanefc47b82019-11-18 09:25:38 -080010299TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010300 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010301 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
10302 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
10303 DeconvolutionOperatorTester()
10304 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010305 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010306 .padding_width(1)
10307 .padding_top(padding_top)
10308 .padding_bottom(padding_bottom)
10309 .kernel_size(3, 3)
10310 .stride(2)
10311 .group_input_channels(15)
10312 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10313 .iterations(1)
10314 .TestF32();
10315 }
10316 }
10317}
10318
Marat Dukhanefc47b82019-11-18 09:25:38 -080010319TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010320 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010321 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
10322 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
10323 DeconvolutionOperatorTester()
10324 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010325 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010326 .padding_height(1)
10327 .padding_left(padding_left)
10328 .padding_right(padding_right)
10329 .kernel_size(3, 3)
10330 .stride(2)
10331 .group_input_channels(15)
10332 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10333 .iterations(1)
10334 .TestF32();
10335 }
10336 }
10337}
10338
Marat Dukhanefc47b82019-11-18 09:25:38 -080010339TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010340 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010341 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010342 DeconvolutionOperatorTester()
10343 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010344 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010345 .padding(1)
10346 .adjustment_height(adjustment_height)
10347 .kernel_size(3, 3)
10348 .stride(2)
10349 .group_input_channels(15)
10350 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10351 .iterations(1)
10352 .TestF32();
10353 }
10354}
10355
Marat Dukhanefc47b82019-11-18 09:25:38 -080010356TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010357 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010358 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010359 DeconvolutionOperatorTester()
10360 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010361 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010362 .padding(1)
10363 .adjustment_width(adjustment_width)
10364 .kernel_size(3, 3)
10365 .stride(2)
10366 .group_input_channels(15)
10367 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10368 .iterations(1)
10369 .TestF32();
10370 }
10371}
10372
Marat Dukhanefc47b82019-11-18 09:25:38 -080010373TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010374 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010375 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010376 DeconvolutionOperatorTester()
10377 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010378 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010379 .padding(1)
10380 .kernel_size(3, 3)
10381 .stride(2)
10382 .group_input_channels(15)
10383 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10384 .iterations(1)
10385 .TestF32();
10386 }
10387}
10388
Marat Dukhanefc47b82019-11-18 09:25:38 -080010389TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010390 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010391 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010392 DeconvolutionOperatorTester()
10393 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010394 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010395 .padding(1)
10396 .kernel_size(3, 3)
10397 .stride(2)
10398 .group_input_channels(15)
10399 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10400 .iterations(1)
10401 .TestF32();
10402 }
10403}
10404
Marat Dukhanefc47b82019-11-18 09:25:38 -080010405TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010406 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010407 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
10408 DeconvolutionOperatorTester()
10409 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010410 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010411 .padding(1)
10412 .kernel_size(3, 3)
10413 .stride(2)
10414 .group_input_channels(input_channels)
10415 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10416 .iterations(1)
10417 .TestF32();
10418 }
10419}
10420
Marat Dukhanefc47b82019-11-18 09:25:38 -080010421TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010422 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010423 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
10424 DeconvolutionOperatorTester()
10425 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010426 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010427 .padding(1)
10428 .kernel_size(3, 3)
10429 .stride(2)
10430 .group_input_channels(23)
10431 .group_output_channels(output_channels)
10432 .iterations(1)
10433 .TestF32();
10434 }
10435}
10436
Marat Dukhanefc47b82019-11-18 09:25:38 -080010437TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010438 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010439 DeconvolutionOperatorTester()
10440 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010441 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010442 .padding(1)
10443 .kernel_size(3, 3)
10444 .stride(2)
10445 .group_input_channels(23)
10446 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10447 .input_pixel_stride(28)
10448 .iterations(3)
10449 .TestF32();
10450}
10451
Marat Dukhanefc47b82019-11-18 09:25:38 -080010452TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010453 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010454 DeconvolutionOperatorTester()
10455 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010456 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010457 .padding(1)
10458 .kernel_size(3, 3)
10459 .stride(2)
10460 .group_input_channels(23)
10461 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10462 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
10463 .iterations(3)
10464 .TestF32();
10465}
10466
Marat Dukhanefc47b82019-11-18 09:25:38 -080010467TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010468 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010469 DeconvolutionOperatorTester()
10470 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010471 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010472 .padding(1)
10473 .kernel_size(3, 3)
10474 .stride(2)
10475 .group_input_channels(23)
10476 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10477 .qmin(128)
10478 .iterations(3)
10479 .TestF32();
10480}
10481
Marat Dukhanefc47b82019-11-18 09:25:38 -080010482TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010483 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010484 DeconvolutionOperatorTester()
10485 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010486 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010487 .padding(1)
10488 .kernel_size(3, 3)
10489 .stride(2)
10490 .group_input_channels(23)
10491 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -070010492 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010493 .iterations(3)
10494 .TestF32();
10495}
10496
Marat Dukhanefc47b82019-11-18 09:25:38 -080010497TEST(DECONVOLUTION_NHWC_F32, batched_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010498 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -070010499 DeconvolutionOperatorTester()
10500 .has_bias(false)
10501 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010502 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -070010503 .padding(1)
10504 .kernel_size(3, 3)
10505 .stride(2)
10506 .group_input_channels(23)
10507 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10508 .iterations(3)
10509 .TestF32();
10510}
10511
Marat Dukhan29954272020-02-13 17:56:11 -080010512/**************************** SUBCONV2D/IGEMM path, grouped, batched ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -070010513
Marat Dukhanefc47b82019-11-18 09:25:38 -080010514TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010515 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010516 DeconvolutionOperatorTester()
10517 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010518 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010519 .padding(1)
10520 .kernel_size(3, 3)
10521 .stride(2)
10522 .groups(2)
10523 .group_input_channels(17)
10524 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10525 .iterations(3)
10526 .TestF32();
10527}
10528
Marat Dukhanefc47b82019-11-18 09:25:38 -080010529TEST(DECONVOLUTION_NHWC_F32, batched_grouped_Kx3s2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010530 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010531 for (size_t kernel_height = 2; kernel_height <= 5; kernel_height++) {
10532 DeconvolutionOperatorTester()
10533 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010534 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010535 .padding_width(1)
10536 .kernel_size(kernel_height, 3)
10537 .stride(2)
10538 .groups(2)
10539 .group_input_channels(17)
10540 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10541 .iterations(3)
10542 .TestF32();
10543 }
10544}
10545
Marat Dukhanefc47b82019-11-18 09:25:38 -080010546TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3xKs2) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010547 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010548 for (size_t kernel_width = 2; kernel_width <= 5; kernel_width++) {
10549 DeconvolutionOperatorTester()
10550 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010551 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010552 .padding_height(1)
10553 .kernel_size(3, kernel_width)
10554 .stride(2)
10555 .groups(2)
10556 .group_input_channels(17)
10557 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10558 .iterations(3)
10559 .TestF32();
10560 }
10561}
10562
Marat Dukhanefc47b82019-11-18 09:25:38 -080010563TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3sSx1) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010564 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010565 for (size_t stride_height = 2; stride_height <= 3; stride_height++) {
10566 DeconvolutionOperatorTester()
10567 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010568 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010569 .padding(1)
10570 .padding_width(1)
10571 .kernel_size(3, 3)
10572 .stride_height(stride_height)
10573 .groups(2)
10574 .group_input_channels(17)
10575 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10576 .iterations(3)
10577 .TestF32();
10578 }
10579}
10580
Marat Dukhanefc47b82019-11-18 09:25:38 -080010581TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s1xS) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010582 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010583 for (size_t stride_width = 2; stride_width <= 3; stride_width++) {
10584 DeconvolutionOperatorTester()
10585 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010586 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010587 .padding(1)
10588 .padding_width(1)
10589 .kernel_size(3, 3)
10590 .stride_width(stride_width)
10591 .groups(2)
10592 .group_input_channels(17)
10593 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10594 .iterations(3)
10595 .TestF32();
10596 }
10597}
10598
Marat Dukhanefc47b82019-11-18 09:25:38 -080010599TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_height_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010600 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010601 for (size_t padding_top = 0; padding_top <= 2; padding_top++) {
10602 for (size_t padding_bottom = 0; padding_bottom <= 2; padding_bottom++) {
10603 DeconvolutionOperatorTester()
10604 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010605 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010606 .padding_width(1)
10607 .padding_top(padding_top)
10608 .padding_bottom(padding_bottom)
10609 .kernel_size(3, 3)
10610 .stride(2)
10611 .groups(2)
10612 .group_input_channels(17)
10613 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10614 .iterations(1)
10615 .TestF32();
10616 }
10617 }
10618}
10619
Marat Dukhanefc47b82019-11-18 09:25:38 -080010620TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_width_padding) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010621 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010622 for (size_t padding_left = 0; padding_left <= 2; padding_left++) {
10623 for (size_t padding_right = 0; padding_right <= 2; padding_right++) {
10624 DeconvolutionOperatorTester()
10625 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010626 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010627 .padding_height(1)
10628 .padding_left(padding_left)
10629 .padding_right(padding_right)
10630 .kernel_size(3, 3)
10631 .stride(2)
10632 .groups(2)
10633 .group_input_channels(17)
10634 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10635 .iterations(1)
10636 .TestF32();
10637 }
10638 }
10639}
10640
Marat Dukhanefc47b82019-11-18 09:25:38 -080010641TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_height_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010642 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010643 for (size_t adjustment_height = 0; adjustment_height <= 1; adjustment_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010644 DeconvolutionOperatorTester()
10645 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010646 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010647 .padding(1)
10648 .adjustment_height(adjustment_height)
10649 .kernel_size(3, 3)
10650 .stride(2)
10651 .groups(2)
10652 .group_input_channels(17)
10653 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10654 .iterations(1)
10655 .TestF32();
10656 }
10657}
10658
Marat Dukhanefc47b82019-11-18 09:25:38 -080010659TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_width_adjustment) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010660 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhan1898b912019-11-05 12:25:18 -080010661 for (size_t adjustment_width = 0; adjustment_width <= 1; adjustment_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010662 DeconvolutionOperatorTester()
10663 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010664 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010665 .padding(1)
10666 .adjustment_width(adjustment_width)
10667 .kernel_size(3, 3)
10668 .stride(2)
10669 .groups(2)
10670 .group_input_channels(17)
10671 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10672 .iterations(1)
10673 .TestF32();
10674 }
10675}
10676
Marat Dukhanefc47b82019-11-18 09:25:38 -080010677TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010678 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010679 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010680 DeconvolutionOperatorTester()
10681 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010682 .input_size(input_height, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010683 .padding(1)
10684 .kernel_size(3, 3)
10685 .stride(2)
10686 .groups(2)
10687 .group_input_channels(17)
10688 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10689 .iterations(1)
10690 .TestF32();
10691 }
10692}
10693
Marat Dukhanefc47b82019-11-18 09:25:38 -080010694TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010695 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhana41533d2019-11-04 10:40:51 -080010696 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070010697 DeconvolutionOperatorTester()
10698 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010699 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010700 .padding(1)
10701 .kernel_size(3, 3)
10702 .stride(2)
10703 .groups(2)
10704 .group_input_channels(17)
10705 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10706 .iterations(1)
10707 .TestF32();
10708 }
10709}
10710
Marat Dukhanefc47b82019-11-18 09:25:38 -080010711TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_input_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010712 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010713 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
10714 DeconvolutionOperatorTester()
10715 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010716 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010717 .padding(1)
10718 .kernel_size(3, 3)
10719 .stride(2)
10720 .groups(2)
10721 .group_input_channels(input_channels)
10722 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10723 .iterations(1)
10724 .TestF32();
10725 }
10726}
10727
Marat Dukhanefc47b82019-11-18 09:25:38 -080010728TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_varying_output_channels) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010729 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010730 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
10731 DeconvolutionOperatorTester()
10732 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010733 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010734 .padding(1)
10735 .kernel_size(3, 3)
10736 .stride(2)
10737 .groups(2)
10738 .group_input_channels(17)
10739 .group_output_channels(output_channels)
10740 .iterations(1)
10741 .TestF32();
10742 }
10743}
10744
Marat Dukhanefc47b82019-11-18 09:25:38 -080010745TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_input_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010746 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010747 DeconvolutionOperatorTester()
10748 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010749 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010750 .padding(1)
10751 .kernel_size(3, 3)
10752 .stride(2)
10753 .groups(2)
10754 .group_input_channels(17)
10755 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10756 .input_pixel_stride(37)
10757 .iterations(3)
10758 .TestF32();
10759}
10760
Marat Dukhanefc47b82019-11-18 09:25:38 -080010761TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_output_stride) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010762 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010763 DeconvolutionOperatorTester()
10764 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010765 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010766 .padding(1)
10767 .kernel_size(3, 3)
10768 .stride(2)
10769 .groups(2)
10770 .group_input_channels(17)
10771 .group_output_channels(xnn_params.f32.gemm.nr + 3)
10772 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
10773 .iterations(3)
10774 .TestF32();
10775}
10776
Marat Dukhanefc47b82019-11-18 09:25:38 -080010777TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_qmin) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010778 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010779 DeconvolutionOperatorTester()
10780 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010781 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010782 .padding(1)
10783 .kernel_size(3, 3)
10784 .stride(2)
10785 .groups(2)
10786 .group_input_channels(17)
10787 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10788 .qmin(128)
10789 .iterations(3)
10790 .TestF32();
10791}
10792
Marat Dukhanefc47b82019-11-18 09:25:38 -080010793TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_with_qmax) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010794 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010795 DeconvolutionOperatorTester()
10796 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010797 .input_size(kStridedInputHeight, kStridedInputWidth)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010798 .padding(1)
10799 .kernel_size(3, 3)
10800 .stride(2)
10801 .groups(2)
10802 .group_input_channels(17)
10803 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
Marat Dukhanab7424a2019-10-30 10:09:50 -070010804 .qmax(128)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010805 .iterations(3)
10806 .TestF32();
10807}
10808
Marat Dukhanefc47b82019-11-18 09:25:38 -080010809TEST(DECONVOLUTION_NHWC_F32, batched_grouped_3x3s2_without_bias) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010810 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
Marat Dukhanf568f082019-10-30 09:47:07 -070010811 DeconvolutionOperatorTester()
10812 .has_bias(false)
10813 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010814 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhanf568f082019-10-30 09:47:07 -070010815 .padding(1)
10816 .kernel_size(3, 3)
10817 .stride(2)
10818 .groups(2)
10819 .group_input_channels(17)
10820 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10821 .iterations(3)
10822 .TestF32();
10823}
10824
Marat Dukhan29954272020-02-13 17:56:11 -080010825/**************************** SUBCONV2D/IGEMM path, setup ****************************/
XNNPACK Teamb455b122019-09-27 18:10:33 -070010826
Marat Dukhanefc47b82019-11-18 09:25:38 -080010827TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_batch) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010828 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010829 DeconvolutionOperatorTester()
10830 .batch_size(2)
10831 .next_batch_size(5)
Marat Dukhana41533d2019-11-04 10:40:51 -080010832 .input_size(kStridedInputHeight, kStridedInputWidth)
Marat Dukhan29954272020-02-13 17:56:11 -080010833 .kernel_size(3, 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010834 .stride(2)
10835 .groups(2)
10836 .group_input_channels(15)
10837 .group_output_channels(17)
10838 .TestSetupF32();
10839}
10840
Marat Dukhanefc47b82019-11-18 09:25:38 -080010841TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_height) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010842 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010843 DeconvolutionOperatorTester()
10844 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010845 .input_size(kStridedInputHeight, kStridedInputWidth)
10846 .next_input_height(kStridedInputHeight + 3)
Marat Dukhan29954272020-02-13 17:56:11 -080010847 .kernel_size(3, 3)
XNNPACK Teamb455b122019-09-27 18:10:33 -070010848 .stride(2)
10849 .groups(2)
10850 .group_input_channels(15)
10851 .group_output_channels(17)
10852 .TestSetupF32();
10853}
10854
Marat Dukhanefc47b82019-11-18 09:25:38 -080010855TEST(DECONVOLUTION_NHWC_F32, 3x3s2_setup_changing_width) {
Marat Dukhan04f03be2019-11-19 12:36:47 -080010856 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
XNNPACK Teamb455b122019-09-27 18:10:33 -070010857 DeconvolutionOperatorTester()
10858 .batch_size(2)
Marat Dukhana41533d2019-11-04 10:40:51 -080010859 .input_size(kStridedInputHeight, kStridedInputWidth)
10860 .next_input_width(kStridedInputWidth + 3)
Marat Dukhan29954272020-02-13 17:56:11 -080010861 .kernel_size(3, 3)
10862 .stride(2)
10863 .groups(2)
10864 .group_input_channels(15)
10865 .group_output_channels(17)
10866 .TestSetupF32();
10867}
10868
10869/**************************** SUBCONV2D/GEMM path ****************************/
10870
10871TEST(DECONVOLUTION_NHWC_F32, 2x2s2) {
10872 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10873 DeconvolutionOperatorTester()
10874 .input_size(kStridedInputHeight, kStridedInputWidth)
10875 .kernel_size(2, 2)
10876 .stride(2)
10877 .group_input_channels(15)
10878 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10879 .iterations(3)
10880 .TestF32();
10881}
10882
10883TEST(DECONVOLUTION_NHWC_F32, Kx2sKx2) {
10884 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10885 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
10886 DeconvolutionOperatorTester()
10887 .input_size(kStridedInputHeight, kStridedInputWidth)
10888 .kernel_size(kernel_height, 2)
10889 .stride(kernel_height, 2)
10890 .group_input_channels(17)
10891 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10892 .iterations(3)
10893 .TestF32();
10894 }
10895}
10896
10897TEST(DECONVOLUTION_NHWC_F32, 2xKs2xK) {
10898 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10899 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
10900 DeconvolutionOperatorTester()
10901 .input_size(kStridedInputHeight, kStridedInputWidth)
10902 .kernel_size(2, kernel_width)
10903 .stride(2, kernel_width)
10904 .group_input_channels(17)
10905 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10906 .iterations(3)
10907 .TestF32();
10908 }
10909}
10910
10911TEST(DECONVOLUTION_NHWC_F32, 2x2s2_height_adjustment) {
10912 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10913 DeconvolutionOperatorTester()
10914 .input_size(kStridedInputHeight, kStridedInputWidth)
10915 .adjustment_height(1)
10916 .kernel_size(2, 2)
10917 .stride(2)
10918 .group_input_channels(15)
10919 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10920 .iterations(1)
10921 .TestF32();
10922}
10923
10924TEST(DECONVOLUTION_NHWC_F32, 2x2s2_width_adjustment) {
10925 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10926 DeconvolutionOperatorTester()
10927 .input_size(kStridedInputHeight, kStridedInputWidth)
10928 .adjustment_width(1)
10929 .kernel_size(2, 2)
10930 .stride(2)
10931 .group_input_channels(15)
10932 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10933 .iterations(1)
10934 .TestF32();
10935}
10936
10937TEST(DECONVOLUTION_NHWC_F32, 2x2s2_varying_input_height) {
10938 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10939 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
10940 DeconvolutionOperatorTester()
10941 .input_size(input_height, kStridedInputWidth)
10942 .kernel_size(2, 2)
10943 .stride(2)
10944 .group_input_channels(15)
10945 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10946 .iterations(1)
10947 .TestF32();
10948 }
10949}
10950
10951TEST(DECONVOLUTION_NHWC_F32, 2x2s2_varying_input_width) {
10952 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10953 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
10954 DeconvolutionOperatorTester()
10955 .input_size(kStridedInputHeight, kStridedInputWidth)
10956 .kernel_size(2, 2)
10957 .stride(2)
10958 .group_input_channels(15)
10959 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10960 .iterations(1)
10961 .TestF32();
10962 }
10963}
10964
10965TEST(DECONVOLUTION_NHWC_F32, 2x2s2_varying_input_channels) {
10966 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10967 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
10968 DeconvolutionOperatorTester()
10969 .input_size(kStridedInputHeight, kStridedInputWidth)
10970 .kernel_size(2, 2)
10971 .stride(2)
10972 .group_input_channels(input_channels)
10973 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
10974 .iterations(1)
10975 .TestF32();
10976 }
10977}
10978
10979TEST(DECONVOLUTION_NHWC_F32, 2x2s2_varying_output_channels) {
10980 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10981 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
10982 DeconvolutionOperatorTester()
10983 .input_size(kStridedInputHeight, kStridedInputWidth)
10984 .kernel_size(2, 2)
10985 .stride(2)
10986 .group_input_channels(23)
10987 .group_output_channels(output_channels)
10988 .iterations(1)
10989 .TestF32();
10990 }
10991}
10992
10993TEST(DECONVOLUTION_NHWC_F32, 2x2s2_with_input_stride) {
10994 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
10995 DeconvolutionOperatorTester()
10996 .input_size(kStridedInputHeight, kStridedInputWidth)
10997 .kernel_size(2, 2)
10998 .stride(2)
10999 .group_input_channels(23)
11000 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11001 .input_pixel_stride(28)
11002 .iterations(3)
11003 .TestF32();
11004}
11005
11006TEST(DECONVOLUTION_NHWC_F32, 2x2s2_with_output_stride) {
11007 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11008 DeconvolutionOperatorTester()
11009 .input_size(kStridedInputHeight, kStridedInputWidth)
11010 .kernel_size(2, 2)
11011 .stride(2)
11012 .group_input_channels(23)
11013 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11014 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
11015 .iterations(3)
11016 .TestF32();
11017}
11018
11019TEST(DECONVOLUTION_NHWC_F32, 2x2s2_with_qmin) {
11020 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11021 DeconvolutionOperatorTester()
11022 .input_size(kStridedInputHeight, kStridedInputWidth)
11023 .kernel_size(2, 2)
11024 .stride(2)
11025 .group_input_channels(23)
11026 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11027 .qmin(128)
11028 .iterations(3)
11029 .TestF32();
11030}
11031
11032TEST(DECONVOLUTION_NHWC_F32, 2x2s2_with_qmax) {
11033 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11034 DeconvolutionOperatorTester()
11035 .input_size(kStridedInputHeight, kStridedInputWidth)
11036 .kernel_size(2, 2)
11037 .stride(2)
11038 .group_input_channels(23)
11039 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11040 .qmax(128)
11041 .iterations(3)
11042 .TestF32();
11043}
11044
11045TEST(DECONVOLUTION_NHWC_F32, 2x2s2_without_bias) {
11046 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11047 DeconvolutionOperatorTester()
11048 .has_bias(false)
11049 .input_size(kStridedInputHeight, kStridedInputWidth)
11050 .kernel_size(2, 2)
11051 .stride(2)
11052 .group_input_channels(23)
11053 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11054 .iterations(3)
11055 .TestF32();
11056}
11057
11058/**************************** SUBCONV2D/GEMM path, grouped ****************************/
11059
11060TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2) {
11061 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11062 DeconvolutionOperatorTester()
11063 .input_size(kStridedInputHeight, kStridedInputWidth)
11064 .kernel_size(2, 2)
11065 .stride(2)
11066 .groups(2)
11067 .group_input_channels(17)
11068 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11069 .iterations(3)
11070 .TestF32();
11071}
11072
11073TEST(DECONVOLUTION_NHWC_F32, grouped_Kx2sKx2) {
11074 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11075 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
11076 DeconvolutionOperatorTester()
11077 .input_size(kStridedInputHeight, kStridedInputWidth)
11078 .kernel_size(kernel_height, 2)
11079 .stride(kernel_height, 2)
11080 .groups(2)
11081 .group_input_channels(17)
11082 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11083 .iterations(3)
11084 .TestF32();
11085 }
11086}
11087
11088TEST(DECONVOLUTION_NHWC_F32, grouped_2xKs2xK) {
11089 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11090 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
11091 DeconvolutionOperatorTester()
11092 .input_size(kStridedInputHeight, kStridedInputWidth)
11093 .kernel_size(2, kernel_width)
11094 .stride(2, kernel_width)
11095 .groups(2)
11096 .group_input_channels(17)
11097 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11098 .iterations(3)
11099 .TestF32();
11100 }
11101}
11102
11103TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_height_adjustment) {
11104 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11105 DeconvolutionOperatorTester()
11106 .input_size(kStridedInputHeight, kStridedInputWidth)
11107 .adjustment_height(1)
11108 .kernel_size(2, 2)
11109 .stride(2)
11110 .groups(2)
11111 .group_input_channels(17)
11112 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11113 .iterations(1)
11114 .TestF32();
11115}
11116
11117TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_width_adjustment) {
11118 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11119 DeconvolutionOperatorTester()
11120 .input_size(kStridedInputHeight, kStridedInputWidth)
11121 .adjustment_width(1)
11122 .kernel_size(2, 2)
11123 .stride(2)
11124 .groups(2)
11125 .group_input_channels(17)
11126 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11127 .iterations(1)
11128 .TestF32();
11129}
11130
11131TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_varying_input_height) {
11132 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11133 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
11134 DeconvolutionOperatorTester()
11135 .input_size(input_height, kStridedInputWidth)
11136 .kernel_size(2, 2)
11137 .stride(2)
11138 .groups(2)
11139 .group_input_channels(17)
11140 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11141 .iterations(1)
11142 .TestF32();
11143 }
11144}
11145
11146TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_varying_input_width) {
11147 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11148 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
11149 DeconvolutionOperatorTester()
11150 .input_size(kStridedInputHeight, kStridedInputWidth)
11151 .kernel_size(2, 2)
11152 .stride(2)
11153 .groups(2)
11154 .group_input_channels(17)
11155 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11156 .iterations(1)
11157 .TestF32();
11158 }
11159}
11160
11161TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_varying_input_channels) {
11162 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11163 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
11164 DeconvolutionOperatorTester()
11165 .input_size(kStridedInputHeight, kStridedInputWidth)
11166 .kernel_size(2, 2)
11167 .stride(2)
11168 .groups(2)
11169 .group_input_channels(input_channels)
11170 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11171 .iterations(1)
11172 .TestF32();
11173 }
11174}
11175
11176TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_varying_output_channels) {
11177 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11178 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
11179 DeconvolutionOperatorTester()
11180 .input_size(kStridedInputHeight, kStridedInputWidth)
11181 .kernel_size(2, 2)
11182 .stride(2)
11183 .groups(2)
11184 .group_input_channels(17)
11185 .group_output_channels(output_channels)
11186 .iterations(1)
11187 .TestF32();
11188 }
11189}
11190
11191TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_with_input_stride) {
11192 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11193 DeconvolutionOperatorTester()
11194 .input_size(kStridedInputHeight, kStridedInputWidth)
11195 .kernel_size(2, 2)
11196 .stride(2)
11197 .groups(2)
11198 .group_input_channels(17)
11199 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11200 .input_pixel_stride(37)
11201 .iterations(3)
11202 .TestF32();
11203}
11204
11205TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_with_output_stride) {
11206 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11207 DeconvolutionOperatorTester()
11208 .input_size(kStridedInputHeight, kStridedInputWidth)
11209 .kernel_size(2, 2)
11210 .stride(2)
11211 .groups(2)
11212 .group_input_channels(17)
11213 .group_output_channels(xnn_params.f32.gemm.nr + 3)
11214 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
11215 .iterations(3)
11216 .TestF32();
11217}
11218
11219TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_with_qmin) {
11220 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11221 DeconvolutionOperatorTester()
11222 .input_size(kStridedInputHeight, kStridedInputWidth)
11223 .kernel_size(2, 2)
11224 .stride(2)
11225 .groups(2)
11226 .group_input_channels(17)
11227 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11228 .qmin(128)
11229 .iterations(3)
11230 .TestF32();
11231}
11232
11233TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_with_qmax) {
11234 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11235 DeconvolutionOperatorTester()
11236 .input_size(kStridedInputHeight, kStridedInputWidth)
11237 .kernel_size(2, 2)
11238 .stride(2)
11239 .groups(2)
11240 .group_input_channels(17)
11241 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11242 .qmax(128)
11243 .iterations(3)
11244 .TestF32();
11245}
11246
11247TEST(DECONVOLUTION_NHWC_F32, grouped_2x2s2_without_bias) {
11248 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11249 DeconvolutionOperatorTester()
11250 .has_bias(false)
11251 .input_size(kStridedInputHeight, kStridedInputWidth)
11252 .kernel_size(2, 2)
11253 .stride(2)
11254 .groups(2)
11255 .group_input_channels(17)
11256 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11257 .iterations(3)
11258 .TestF32();
11259}
11260
11261/**************************** SUBCONV2D/GEMM path, batched ****************************/
11262
11263TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2) {
11264 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11265 DeconvolutionOperatorTester()
11266 .batch_size(2)
11267 .input_size(kStridedInputHeight, kStridedInputWidth)
11268 .kernel_size(2, 2)
11269 .stride(2)
11270 .group_input_channels(15)
11271 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11272 .iterations(3)
11273 .TestF32();
11274}
11275
11276TEST(DECONVOLUTION_NHWC_F32, batched_Kx2sKx2) {
11277 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11278 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
11279 DeconvolutionOperatorTester()
11280 .batch_size(2)
11281 .input_size(kStridedInputHeight, kStridedInputWidth)
11282 .kernel_size(kernel_height, 2)
11283 .stride(kernel_height, 2)
11284 .group_input_channels(17)
11285 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11286 .iterations(3)
11287 .TestF32();
11288 }
11289}
11290
11291TEST(DECONVOLUTION_NHWC_F32, batched_2xKs2xK) {
11292 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11293 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
11294 DeconvolutionOperatorTester()
11295 .batch_size(2)
11296 .input_size(kStridedInputHeight, kStridedInputWidth)
11297 .kernel_size(2, kernel_width)
11298 .stride(2, kernel_width)
11299 .group_input_channels(17)
11300 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11301 .iterations(3)
11302 .TestF32();
11303 }
11304}
11305
11306TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_height_adjustment) {
11307 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11308 DeconvolutionOperatorTester()
11309 .batch_size(2)
11310 .input_size(kStridedInputHeight, kStridedInputWidth)
11311 .adjustment_height(1)
11312 .kernel_size(2, 2)
11313 .stride(2)
11314 .group_input_channels(15)
11315 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11316 .iterations(1)
11317 .TestF32();
11318}
11319
11320TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_width_adjustment) {
11321 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11322 DeconvolutionOperatorTester()
11323 .batch_size(2)
11324 .input_size(kStridedInputHeight, kStridedInputWidth)
11325 .adjustment_width(1)
11326 .kernel_size(2, 2)
11327 .stride(2)
11328 .group_input_channels(15)
11329 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11330 .iterations(1)
11331 .TestF32();
11332}
11333
11334TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_varying_input_height) {
11335 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11336 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
11337 DeconvolutionOperatorTester()
11338 .batch_size(2)
11339 .input_size(input_height, kStridedInputWidth)
11340 .kernel_size(2, 2)
11341 .stride(2)
11342 .group_input_channels(15)
11343 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11344 .iterations(1)
11345 .TestF32();
11346 }
11347}
11348
11349TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_varying_input_width) {
11350 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11351 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
11352 DeconvolutionOperatorTester()
11353 .batch_size(2)
11354 .input_size(kStridedInputHeight, kStridedInputWidth)
11355 .kernel_size(2, 2)
11356 .stride(2)
11357 .group_input_channels(15)
11358 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11359 .iterations(1)
11360 .TestF32();
11361 }
11362}
11363
11364TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_varying_input_channels) {
11365 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11366 for (size_t input_channels = 1; input_channels <= 16; input_channels *= 4) {
11367 DeconvolutionOperatorTester()
11368 .batch_size(2)
11369 .input_size(kStridedInputHeight, kStridedInputWidth)
11370 .kernel_size(2, 2)
11371 .stride(2)
11372 .group_input_channels(input_channels)
11373 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11374 .iterations(1)
11375 .TestF32();
11376 }
11377}
11378
11379TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_varying_output_channels) {
11380 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11381 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
11382 DeconvolutionOperatorTester()
11383 .batch_size(2)
11384 .input_size(kStridedInputHeight, kStridedInputWidth)
11385 .kernel_size(2, 2)
11386 .stride(2)
11387 .group_input_channels(23)
11388 .group_output_channels(output_channels)
11389 .iterations(1)
11390 .TestF32();
11391 }
11392}
11393
11394TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_with_input_stride) {
11395 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11396 DeconvolutionOperatorTester()
11397 .batch_size(2)
11398 .input_size(kStridedInputHeight, kStridedInputWidth)
11399 .kernel_size(2, 2)
11400 .stride(2)
11401 .group_input_channels(23)
11402 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11403 .input_pixel_stride(28)
11404 .iterations(3)
11405 .TestF32();
11406}
11407
11408TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_with_output_stride) {
11409 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11410 DeconvolutionOperatorTester()
11411 .batch_size(2)
11412 .input_size(kStridedInputHeight, kStridedInputWidth)
11413 .kernel_size(2, 2)
11414 .stride(2)
11415 .group_input_channels(23)
11416 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11417 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
11418 .iterations(3)
11419 .TestF32();
11420}
11421
11422TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_with_qmin) {
11423 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11424 DeconvolutionOperatorTester()
11425 .batch_size(2)
11426 .input_size(kStridedInputHeight, kStridedInputWidth)
11427 .kernel_size(2, 2)
11428 .stride(2)
11429 .group_input_channels(23)
11430 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11431 .qmin(128)
11432 .iterations(3)
11433 .TestF32();
11434}
11435
11436TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_with_qmax) {
11437 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11438 DeconvolutionOperatorTester()
11439 .batch_size(2)
11440 .input_size(kStridedInputHeight, kStridedInputWidth)
11441 .kernel_size(2, 2)
11442 .stride(2)
11443 .group_input_channels(23)
11444 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11445 .qmax(128)
11446 .iterations(3)
11447 .TestF32();
11448}
11449
11450TEST(DECONVOLUTION_NHWC_F32, batched_2x2s2_without_bias) {
11451 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11452 DeconvolutionOperatorTester()
11453 .has_bias(false)
11454 .batch_size(2)
11455 .input_size(kStridedInputHeight, kStridedInputWidth)
11456 .kernel_size(2, 2)
11457 .stride(2)
11458 .group_input_channels(23)
11459 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11460 .iterations(3)
11461 .TestF32();
11462}
11463
11464/**************************** SUBCONV2D/GEMM path, grouped, batched ****************************/
11465
11466TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2) {
11467 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11468 DeconvolutionOperatorTester()
11469 .batch_size(2)
11470 .input_size(kStridedInputHeight, kStridedInputWidth)
11471 .kernel_size(2, 2)
11472 .stride(2)
11473 .groups(2)
11474 .group_input_channels(17)
11475 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11476 .iterations(3)
11477 .TestF32();
11478}
11479
11480TEST(DECONVOLUTION_NHWC_F32, batched_grouped_Kx2sKx2) {
11481 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11482 for (size_t kernel_height = 3; kernel_height <= 5; kernel_height++) {
11483 DeconvolutionOperatorTester()
11484 .batch_size(2)
11485 .input_size(kStridedInputHeight, kStridedInputWidth)
11486 .kernel_size(kernel_height, 2)
11487 .stride(kernel_height, 2)
11488 .groups(2)
11489 .group_input_channels(17)
11490 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11491 .iterations(3)
11492 .TestF32();
11493 }
11494}
11495
11496TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2xKs2xK) {
11497 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11498 for (size_t kernel_width = 3; kernel_width <= 5; kernel_width++) {
11499 DeconvolutionOperatorTester()
11500 .batch_size(2)
11501 .input_size(kStridedInputHeight, kStridedInputWidth)
11502 .kernel_size(2, kernel_width)
11503 .stride(2, kernel_width)
11504 .groups(2)
11505 .group_input_channels(17)
11506 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11507 .iterations(3)
11508 .TestF32();
11509 }
11510}
11511
11512TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_height_adjustment) {
11513 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11514 DeconvolutionOperatorTester()
11515 .batch_size(2)
11516 .input_size(kStridedInputHeight, kStridedInputWidth)
11517 .adjustment_height(1)
11518 .kernel_size(2, 2)
11519 .stride(2)
11520 .groups(2)
11521 .group_input_channels(17)
11522 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11523 .iterations(1)
11524 .TestF32();
11525}
11526
11527TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_width_adjustment) {
11528 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11529 DeconvolutionOperatorTester()
11530 .batch_size(2)
11531 .input_size(kStridedInputHeight, kStridedInputWidth)
11532 .adjustment_width(1)
11533 .kernel_size(2, 2)
11534 .stride(2)
11535 .groups(2)
11536 .group_input_channels(17)
11537 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11538 .iterations(1)
11539 .TestF32();
11540}
11541
11542TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_varying_input_height) {
11543 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11544 for (size_t input_height = kStridedInputHeight - 2; input_height <= kStridedInputHeight + 2; input_height++) {
11545 DeconvolutionOperatorTester()
11546 .batch_size(2)
11547 .input_size(input_height, kStridedInputWidth)
11548 .kernel_size(2, 2)
11549 .stride(2)
11550 .groups(2)
11551 .group_input_channels(17)
11552 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11553 .iterations(1)
11554 .TestF32();
11555 }
11556}
11557
11558TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_varying_input_width) {
11559 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11560 for (size_t input_width = kStridedInputWidth - 2; input_width <= kStridedInputWidth + 2; input_width++) {
11561 DeconvolutionOperatorTester()
11562 .batch_size(2)
11563 .input_size(kStridedInputHeight, kStridedInputWidth)
11564 .kernel_size(2, 2)
11565 .stride(2)
11566 .groups(2)
11567 .group_input_channels(17)
11568 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11569 .iterations(1)
11570 .TestF32();
11571 }
11572}
11573
11574TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_varying_input_channels) {
11575 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11576 for (size_t input_channels = 14; input_channels <= 20; input_channels++) {
11577 DeconvolutionOperatorTester()
11578 .batch_size(2)
11579 .input_size(kStridedInputHeight, kStridedInputWidth)
11580 .kernel_size(2, 2)
11581 .stride(2)
11582 .groups(2)
11583 .group_input_channels(input_channels)
11584 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11585 .iterations(1)
11586 .TestF32();
11587 }
11588}
11589
11590TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_varying_output_channels) {
11591 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11592 for (size_t output_channels = 1; output_channels <= xnn_params.f32.gemm.nr * 2; output_channels *= 2) {
11593 DeconvolutionOperatorTester()
11594 .batch_size(2)
11595 .input_size(kStridedInputHeight, kStridedInputWidth)
11596 .kernel_size(2, 2)
11597 .stride(2)
11598 .groups(2)
11599 .group_input_channels(17)
11600 .group_output_channels(output_channels)
11601 .iterations(1)
11602 .TestF32();
11603 }
11604}
11605
11606TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_with_input_stride) {
11607 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11608 DeconvolutionOperatorTester()
11609 .batch_size(2)
11610 .input_size(kStridedInputHeight, kStridedInputWidth)
11611 .kernel_size(2, 2)
11612 .stride(2)
11613 .groups(2)
11614 .group_input_channels(17)
11615 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11616 .input_pixel_stride(37)
11617 .iterations(3)
11618 .TestF32();
11619}
11620
11621TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_with_output_stride) {
11622 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11623 DeconvolutionOperatorTester()
11624 .batch_size(2)
11625 .input_size(kStridedInputHeight, kStridedInputWidth)
11626 .kernel_size(2, 2)
11627 .stride(2)
11628 .groups(2)
11629 .group_input_channels(17)
11630 .group_output_channels(xnn_params.f32.gemm.nr + 3)
11631 .output_pixel_stride(xnn_params.f32.gemm.nr * 2 + 13)
11632 .iterations(3)
11633 .TestF32();
11634}
11635
11636TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_with_qmin) {
11637 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11638 DeconvolutionOperatorTester()
11639 .batch_size(2)
11640 .input_size(kStridedInputHeight, kStridedInputWidth)
11641 .kernel_size(2, 2)
11642 .stride(2)
11643 .groups(2)
11644 .group_input_channels(17)
11645 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11646 .qmin(128)
11647 .iterations(3)
11648 .TestF32();
11649}
11650
11651TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_with_qmax) {
11652 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11653 DeconvolutionOperatorTester()
11654 .batch_size(2)
11655 .input_size(kStridedInputHeight, kStridedInputWidth)
11656 .kernel_size(2, 2)
11657 .stride(2)
11658 .groups(2)
11659 .group_input_channels(17)
11660 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11661 .qmax(128)
11662 .iterations(3)
11663 .TestF32();
11664}
11665
11666TEST(DECONVOLUTION_NHWC_F32, batched_grouped_2x2s2_without_bias) {
11667 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11668 DeconvolutionOperatorTester()
11669 .has_bias(false)
11670 .batch_size(2)
11671 .input_size(kStridedInputHeight, kStridedInputWidth)
11672 .kernel_size(2, 2)
11673 .stride(2)
11674 .groups(2)
11675 .group_input_channels(17)
11676 .group_output_channels(xnn_params.f32.gemm.nr * 2 + 3)
11677 .iterations(3)
11678 .TestF32();
11679}
11680
11681/**************************** SUBCONV2D/GEMM path, setup ****************************/
11682
11683TEST(DECONVOLUTION_NHWC_F32, 2x2s2_setup_changing_batch) {
11684 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11685 DeconvolutionOperatorTester()
11686 .batch_size(2)
11687 .next_batch_size(5)
11688 .input_size(kStridedInputHeight, kStridedInputWidth)
11689 .kernel_size(2, 2)
11690 .stride(2)
11691 .groups(2)
11692 .group_input_channels(15)
11693 .group_output_channels(17)
11694 .TestSetupF32();
11695}
11696
11697TEST(DECONVOLUTION_NHWC_F32, 2x2s2_setup_changing_height) {
11698 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11699 DeconvolutionOperatorTester()
11700 .batch_size(2)
11701 .input_size(kStridedInputHeight, kStridedInputWidth)
11702 .next_input_height(kStridedInputHeight + 3)
11703 .kernel_size(2, 2)
11704 .stride(2)
11705 .groups(2)
11706 .group_input_channels(15)
11707 .group_output_channels(17)
11708 .TestSetupF32();
11709}
11710
11711TEST(DECONVOLUTION_NHWC_F32, 2x2s2_setup_changing_width) {
11712 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
11713 DeconvolutionOperatorTester()
11714 .batch_size(2)
11715 .input_size(kStridedInputHeight, kStridedInputWidth)
11716 .next_input_width(kStridedInputWidth + 3)
11717 .kernel_size(2, 2)
XNNPACK Teamb455b122019-09-27 18:10:33 -070011718 .stride(2)
11719 .groups(2)
11720 .group_input_channels(15)
11721 .group_output_channels(17)
11722 .TestSetupF32();
11723}