1 // Copyright (c) Facebook, Inc. and its affiliates.
2 // All rights reserved.
3 //
4 // Copyright 2019 Google LLC
5 //
6 // This source code is licensed under the BSD-style license found in the
7 // LICENSE file in the root directory of this source tree.
8
9 #include <gtest/gtest.h>
10
11 #include "max-pooling-operator-tester.h"
12
13 #include <xnnpack/params.h>
14
15
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_1xM_pool)16 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_1xM_pool) {
17 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
18 for (size_t channels = 1; channels <= 100; channels += 15) {
19 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
20 MaxPoolingOperatorTester()
21 .batch_size(1)
22 .input_height(2)
23 .input_width(pool_size + 2)
24 .pooling_height(1)
25 .pooling_width(pool_size)
26 .channels(channels)
27 .TestS8();
28 }
29 }
30 }
31
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_1xM_pool_with_padding)32 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_1xM_pool_with_padding) {
33 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
34 for (size_t channels = 1; channels <= 100; channels += 15) {
35 for (size_t pool_size = 3; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
36 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
37 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
38 MaxPoolingOperatorTester()
39 .batch_size(1)
40 .input_height(2)
41 .input_width(pool_size + 2)
42 .padding_left(padding_left)
43 .padding_right(padding_right)
44 .pooling_height(1)
45 .pooling_width(pool_size)
46 .channels(channels)
47 .TestS8();
48 }
49 }
50 }
51 }
52 }
53
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_1xM_pool_with_tf_same_padding)54 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_1xM_pool_with_tf_same_padding) {
55 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
56 for (size_t channels = 1; channels <= 100; channels += 15) {
57 for (size_t pool_size = 3; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
58 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
59 MaxPoolingOperatorTester()
60 .batch_size(1)
61 .input_height(2)
62 .input_width(input_width)
63 .padding_tf_same(true)
64 .pooling_height(1)
65 .pooling_width(pool_size)
66 .channels(channels)
67 .TestS8();
68 }
69 }
70 }
71 }
72
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_1xM_pool_with_stride)73 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_1xM_pool_with_stride) {
74 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
75 for (size_t channels = 1; channels <= 100; channels += 15) {
76 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
77 MaxPoolingOperatorTester()
78 .batch_size(1)
79 .input_height(2)
80 .input_width(pool_size + 4)
81 .pooling_height(1)
82 .pooling_width(pool_size)
83 .stride_width(2)
84 .channels(channels)
85 .TestS8();
86 }
87 }
88 }
89
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_1xM_pool_with_dilation)90 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_1xM_pool_with_dilation) {
91 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
92 for (size_t channels = 1; channels <= 100; channels += 15) {
93 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
94 MaxPoolingOperatorTester()
95 .batch_size(1)
96 .input_height(2)
97 .input_width(2 * pool_size + 1)
98 .padding_left(1)
99 .padding_right(1)
100 .pooling_height(1)
101 .pooling_width(pool_size)
102 .dilation_width(2)
103 .channels(channels)
104 .TestS8();
105 }
106 }
107 }
108
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_Mx1_pool)109 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_Mx1_pool) {
110 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
111 for (size_t channels = 1; channels <= 100; channels += 15) {
112 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
113 MaxPoolingOperatorTester()
114 .batch_size(1)
115 .input_height(pool_size + 1)
116 .input_width(3)
117 .pooling_height(pool_size)
118 .pooling_width(1)
119 .channels(channels)
120 .TestS8();
121 }
122 }
123 }
124
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_Mx1_pool_with_padding)125 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_Mx1_pool_with_padding) {
126 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
127 for (size_t channels = 1; channels <= 100; channels += 15) {
128 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
129 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
130 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
131 MaxPoolingOperatorTester()
132 .batch_size(1)
133 .input_height(pool_size + 1)
134 .input_width(3)
135 .padding_top(padding_top)
136 .padding_bottom(padding_bottom)
137 .pooling_height(pool_size)
138 .pooling_width(1)
139 .channels(channels)
140 .TestS8();
141 }
142 }
143 }
144 }
145 }
146
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_Mx1_pool_with_tf_same_padding)147 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_Mx1_pool_with_tf_same_padding) {
148 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
149 for (size_t channels = 1; channels <= 100; channels += 15) {
150 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
151 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
152 MaxPoolingOperatorTester()
153 .batch_size(1)
154 .input_height(input_height)
155 .input_width(3)
156 .padding_tf_same(true)
157 .pooling_height(pool_size)
158 .pooling_width(1)
159 .channels(channels)
160 .TestS8();
161 }
162 }
163 }
164 }
165
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_Mx1_pool_with_stride)166 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_Mx1_pool_with_stride) {
167 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
168 for (size_t channels = 1; channels <= 100; channels += 15) {
169 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
170 MaxPoolingOperatorTester()
171 .batch_size(1)
172 .input_height(pool_size + 3)
173 .input_width(3)
174 .pooling_height(pool_size)
175 .pooling_width(1)
176 .stride_height(2)
177 .channels(channels)
178 .TestS8();
179 }
180 }
181 }
182
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_Mx1_pool_with_dilation)183 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_Mx1_pool_with_dilation) {
184 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
185 for (size_t channels = 1; channels <= 100; channels += 15) {
186 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
187 MaxPoolingOperatorTester()
188 .batch_size(1)
189 .input_height(2 * pool_size)
190 .input_width(3)
191 .padding_top(1)
192 .padding_bottom(1)
193 .pooling_height(pool_size)
194 .pooling_width(1)
195 .dilation_height(2)
196 .channels(channels)
197 .TestS8();
198 }
199 }
200 }
201
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_pool_with_input_stride)202 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_pool_with_input_stride) {
203 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
204 for (size_t channels = 1; channels <= 100; channels += 15) {
205 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
206 MaxPoolingOperatorTester()
207 .batch_size(1)
208 .input_height(pool_size + 1)
209 .input_width(3)
210 .pooling_height(pool_size)
211 .pooling_width(1)
212 .channels(channels)
213 .input_pixel_stride(5 * channels)
214 .TestS8();
215 MaxPoolingOperatorTester()
216 .batch_size(1)
217 .input_height(2)
218 .input_width(pool_size + 2)
219 .pooling_height(1)
220 .pooling_width(pool_size)
221 .channels(channels)
222 .input_pixel_stride(5 * channels)
223 .TestS8();
224 }
225 }
226 }
227
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_pool_with_output_stride)228 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_pool_with_output_stride) {
229 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
230 for (size_t channels = 1; channels <= 100; channels += 15) {
231 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
232 MaxPoolingOperatorTester()
233 .batch_size(1)
234 .input_height(pool_size + 1)
235 .input_width(3)
236 .pooling_height(pool_size)
237 .pooling_width(1)
238 .channels(channels)
239 .output_pixel_stride(5 * channels)
240 .TestS8();
241 MaxPoolingOperatorTester()
242 .batch_size(1)
243 .input_height(2)
244 .input_width(pool_size + 2)
245 .pooling_height(1)
246 .pooling_width(pool_size)
247 .channels(channels)
248 .output_pixel_stride(5 * channels)
249 .TestS8();
250 }
251 }
252 }
253
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_pool_with_qmin)254 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_pool_with_qmin) {
255 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
256 for (size_t channels = 1; channels <= 100; channels += 15) {
257 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
258 MaxPoolingOperatorTester()
259 .batch_size(1)
260 .input_height(pool_size + 1)
261 .input_width(3)
262 .pooling_height(pool_size)
263 .pooling_width(1)
264 .channels(channels)
265 .qmin(192)
266 .TestS8();
267 MaxPoolingOperatorTester()
268 .batch_size(1)
269 .input_height(2)
270 .input_width(pool_size + 2)
271 .pooling_height(1)
272 .pooling_width(pool_size)
273 .channels(channels)
274 .qmin(192)
275 .TestS8();
276 }
277 }
278 }
279
TEST(MAX_POOLING_NHWC_S8,unit_batch_small_pool_with_qmax)280 TEST(MAX_POOLING_NHWC_S8, unit_batch_small_pool_with_qmax) {
281 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
282 for (size_t channels = 1; channels <= 100; channels += 15) {
283 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
284 MaxPoolingOperatorTester()
285 .batch_size(1)
286 .input_height(pool_size + 1)
287 .input_width(3)
288 .pooling_height(pool_size)
289 .pooling_width(1)
290 .channels(channels)
291 .qmax(192)
292 .TestS8();
293 MaxPoolingOperatorTester()
294 .batch_size(1)
295 .input_height(2)
296 .input_width(pool_size + 2)
297 .pooling_height(1)
298 .pooling_width(pool_size)
299 .channels(channels)
300 .qmax(192)
301 .TestS8();
302 }
303 }
304 }
305
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_1xM_pool)306 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_1xM_pool) {
307 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
308 for (size_t channels = 1; channels <= 100; channels += 15) {
309 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
310 MaxPoolingOperatorTester()
311 .batch_size(1)
312 .input_height(2)
313 .input_width(pool_size + 2)
314 .pooling_height(1)
315 .pooling_width(pool_size)
316 .channels(channels)
317 .TestS8();
318 }
319 }
320 }
321
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_1xM_pool_with_padding)322 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_1xM_pool_with_padding) {
323 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
324 for (size_t channels = 1; channels <= 100; channels += 15) {
325 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
326 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
327 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
328 MaxPoolingOperatorTester()
329 .batch_size(1)
330 .input_height(2)
331 .input_width(pool_size + 2)
332 .padding_left(padding_left)
333 .padding_right(padding_right)
334 .pooling_height(1)
335 .pooling_width(pool_size)
336 .channels(channels)
337 .TestS8();
338 }
339 }
340 }
341 }
342 }
343
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_1xM_pool_with_tf_same_padding)344 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_1xM_pool_with_tf_same_padding) {
345 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
346 for (size_t channels = 1; channels <= 100; channels += 15) {
347 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
348 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
349 MaxPoolingOperatorTester()
350 .batch_size(1)
351 .input_height(2)
352 .input_width(input_width)
353 .padding_tf_same(true)
354 .pooling_height(1)
355 .pooling_width(pool_size)
356 .channels(channels)
357 .TestS8();
358 }
359 }
360 }
361 }
362
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_1xM_pool_with_stride)363 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_1xM_pool_with_stride) {
364 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
365 for (size_t channels = 1; channels <= 100; channels += 15) {
366 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
367 MaxPoolingOperatorTester()
368 .batch_size(1)
369 .input_height(2)
370 .input_width(pool_size + 4)
371 .pooling_height(1)
372 .pooling_width(pool_size)
373 .stride_width(2)
374 .channels(channels)
375 .TestS8();
376 }
377 }
378 }
379
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_1xM_pool_with_dilation)380 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_1xM_pool_with_dilation) {
381 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
382 for (size_t channels = 1; channels <= 100; channels += 15) {
383 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
384 MaxPoolingOperatorTester()
385 .batch_size(1)
386 .input_height(2)
387 .input_width(2 * pool_size + 1)
388 .padding_left(1)
389 .padding_right(1)
390 .pooling_height(1)
391 .pooling_width(pool_size)
392 .dilation_width(2)
393 .channels(channels)
394 .TestS8();
395 }
396 }
397 }
398
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_Mx1_pool)399 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_Mx1_pool) {
400 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
401 for (size_t channels = 1; channels <= 100; channels += 15) {
402 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
403 MaxPoolingOperatorTester()
404 .batch_size(1)
405 .input_height(pool_size + 1)
406 .input_width(3)
407 .pooling_height(pool_size)
408 .pooling_width(1)
409 .channels(channels)
410 .TestS8();
411 }
412 }
413 }
414
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_Mx1_pool_with_padding)415 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_Mx1_pool_with_padding) {
416 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
417 for (size_t channels = 1; channels <= 100; channels += 15) {
418 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
419 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
420 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
421 MaxPoolingOperatorTester()
422 .batch_size(1)
423 .input_height(pool_size + 1)
424 .input_width(3)
425 .padding_top(padding_top)
426 .padding_bottom(padding_bottom)
427 .pooling_height(pool_size)
428 .pooling_width(1)
429 .channels(channels)
430 .TestS8();
431 }
432 }
433 }
434 }
435 }
436
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_Mx1_pool_with_tf_same_padding)437 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_Mx1_pool_with_tf_same_padding) {
438 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
439 for (size_t channels = 1; channels <= 100; channels += 15) {
440 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
441 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
442 MaxPoolingOperatorTester()
443 .batch_size(1)
444 .input_height(input_height)
445 .input_width(3)
446 .padding_tf_same(true)
447 .pooling_height(pool_size)
448 .pooling_width(1)
449 .channels(channels)
450 .TestS8();
451 }
452 }
453 }
454 }
455
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_Mx1_pool_with_stride)456 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_Mx1_pool_with_stride) {
457 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
458 for (size_t channels = 1; channels <= 100; channels += 15) {
459 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
460 MaxPoolingOperatorTester()
461 .batch_size(1)
462 .input_height(pool_size + 3)
463 .input_width(3)
464 .pooling_height(pool_size)
465 .pooling_width(1)
466 .stride_height(2)
467 .channels(channels)
468 .TestS8();
469 }
470 }
471 }
472
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_Mx1_pool_with_dilation)473 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_Mx1_pool_with_dilation) {
474 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
475 for (size_t channels = 1; channels <= 100; channels += 15) {
476 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
477 MaxPoolingOperatorTester()
478 .batch_size(1)
479 .input_height(2 * pool_size)
480 .input_width(3)
481 .padding_top(1)
482 .padding_bottom(1)
483 .pooling_height(pool_size)
484 .pooling_width(1)
485 .dilation_height(2)
486 .channels(channels)
487 .TestS8();
488 }
489 }
490 }
491
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_pool_with_input_stride)492 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_pool_with_input_stride) {
493 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
494 for (size_t channels = 1; channels <= 100; channels += 15) {
495 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
496 MaxPoolingOperatorTester()
497 .batch_size(1)
498 .input_height(pool_size + 1)
499 .input_width(3)
500 .pooling_height(pool_size)
501 .pooling_width(1)
502 .channels(channels)
503 .input_pixel_stride(5 * channels)
504 .TestS8();
505 MaxPoolingOperatorTester()
506 .batch_size(1)
507 .input_height(2)
508 .input_width(pool_size + 2)
509 .pooling_height(1)
510 .pooling_width(pool_size)
511 .channels(channels)
512 .input_pixel_stride(5 * channels)
513 .TestS8();
514 }
515 }
516 }
517
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_pool_with_output_stride)518 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_pool_with_output_stride) {
519 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
520 for (size_t channels = 1; channels <= 100; channels += 15) {
521 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
522 MaxPoolingOperatorTester()
523 .batch_size(1)
524 .input_height(pool_size + 1)
525 .input_width(3)
526 .pooling_height(pool_size)
527 .pooling_width(1)
528 .channels(channels)
529 .output_pixel_stride(5 * channels)
530 .TestS8();
531 MaxPoolingOperatorTester()
532 .batch_size(1)
533 .input_height(2)
534 .input_width(pool_size + 2)
535 .pooling_height(1)
536 .pooling_width(pool_size)
537 .channels(channels)
538 .output_pixel_stride(5 * channels)
539 .TestS8();
540 }
541 }
542 }
543
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_pool_with_qmin)544 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_pool_with_qmin) {
545 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
546 for (size_t channels = 1; channels <= 100; channels += 15) {
547 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
548 MaxPoolingOperatorTester()
549 .batch_size(1)
550 .input_height(pool_size + 1)
551 .input_width(3)
552 .pooling_height(pool_size)
553 .pooling_width(1)
554 .channels(channels)
555 .qmin(192)
556 .TestS8();
557 MaxPoolingOperatorTester()
558 .batch_size(1)
559 .input_height(2)
560 .input_width(pool_size + 2)
561 .pooling_height(1)
562 .pooling_width(pool_size)
563 .channels(channels)
564 .qmin(192)
565 .TestS8();
566 }
567 }
568 }
569
TEST(MAX_POOLING_NHWC_S8,unit_batch_large_pool_with_qmax)570 TEST(MAX_POOLING_NHWC_S8, unit_batch_large_pool_with_qmax) {
571 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
572 for (size_t channels = 1; channels <= 100; channels += 15) {
573 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
574 MaxPoolingOperatorTester()
575 .batch_size(1)
576 .input_height(pool_size + 1)
577 .input_width(3)
578 .pooling_height(pool_size)
579 .pooling_width(1)
580 .channels(channels)
581 .qmax(192)
582 .TestS8();
583 MaxPoolingOperatorTester()
584 .batch_size(1)
585 .input_height(2)
586 .input_width(pool_size + 2)
587 .pooling_height(1)
588 .pooling_width(pool_size)
589 .channels(channels)
590 .qmax(192)
591 .TestS8();
592 }
593 }
594 }
595
TEST(MAX_POOLING_NHWC_S8,small_batch_small_pool)596 TEST(MAX_POOLING_NHWC_S8, small_batch_small_pool) {
597 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
598 for (size_t channels = 1; channels <= 100; channels += 15) {
599 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
600 MaxPoolingOperatorTester()
601 .batch_size(3)
602 .input_height(pool_size + 1)
603 .input_width(3)
604 .pooling_height(pool_size)
605 .pooling_width(1)
606 .channels(channels)
607 .TestS8();
608 MaxPoolingOperatorTester()
609 .batch_size(3)
610 .input_height(2)
611 .input_width(pool_size + 2)
612 .pooling_height(1)
613 .pooling_width(pool_size)
614 .channels(channels)
615 .TestS8();
616 }
617 }
618 }
619
TEST(MAX_POOLING_NHWC_S8,small_batch_small_pool_with_input_stride)620 TEST(MAX_POOLING_NHWC_S8, small_batch_small_pool_with_input_stride) {
621 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
622 for (size_t channels = 1; channels <= 100; channels += 15) {
623 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
624 MaxPoolingOperatorTester()
625 .batch_size(3)
626 .input_height(pool_size + 1)
627 .input_width(3)
628 .pooling_height(pool_size)
629 .pooling_width(1)
630 .channels(channels)
631 .input_pixel_stride(5 * channels)
632 .TestS8();
633 MaxPoolingOperatorTester()
634 .batch_size(3)
635 .input_height(2)
636 .input_width(pool_size + 2)
637 .pooling_height(1)
638 .pooling_width(pool_size)
639 .channels(channels)
640 .input_pixel_stride(5 * channels)
641 .TestS8();
642 }
643 }
644 }
645
TEST(MAX_POOLING_NHWC_S8,small_batch_small_pool_with_output_stride)646 TEST(MAX_POOLING_NHWC_S8, small_batch_small_pool_with_output_stride) {
647 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
648 for (size_t channels = 1; channels <= 100; channels += 15) {
649 for (size_t pool_size = 2; pool_size <= xnn_params.s8.maxpool.mr; pool_size++) {
650 MaxPoolingOperatorTester()
651 .batch_size(3)
652 .input_height(pool_size + 1)
653 .input_width(3)
654 .pooling_height(pool_size)
655 .pooling_width(1)
656 .channels(channels)
657 .output_pixel_stride(5 * channels)
658 .TestS8();
659 MaxPoolingOperatorTester()
660 .batch_size(3)
661 .input_height(2)
662 .input_width(pool_size + 2)
663 .pooling_height(1)
664 .pooling_width(pool_size)
665 .channels(channels)
666 .output_pixel_stride(5 * channels)
667 .TestS8();
668 }
669 }
670 }
671
TEST(MAX_POOLING_NHWC_S8,small_batch_large_pool)672 TEST(MAX_POOLING_NHWC_S8, small_batch_large_pool) {
673 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
674 for (size_t channels = 1; channels <= 100; channels += 15) {
675 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
676 MaxPoolingOperatorTester()
677 .batch_size(3)
678 .input_height(pool_size + 1)
679 .input_width(3)
680 .pooling_height(pool_size)
681 .pooling_width(1)
682 .channels(channels)
683 .TestS8();
684 MaxPoolingOperatorTester()
685 .batch_size(3)
686 .input_height(2)
687 .input_width(pool_size + 2)
688 .pooling_height(1)
689 .pooling_width(pool_size)
690 .channels(channels)
691 .TestS8();
692 }
693 }
694 }
695
TEST(MAX_POOLING_NHWC_S8,small_batch_large_pool_with_input_stride)696 TEST(MAX_POOLING_NHWC_S8, small_batch_large_pool_with_input_stride) {
697 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
698 for (size_t channels = 1; channels <= 100; channels += 15) {
699 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
700 MaxPoolingOperatorTester()
701 .batch_size(3)
702 .input_height(pool_size + 1)
703 .input_width(3)
704 .pooling_height(pool_size)
705 .pooling_width(1)
706 .channels(channels)
707 .input_pixel_stride(5 * channels)
708 .TestS8();
709 MaxPoolingOperatorTester()
710 .batch_size(3)
711 .input_height(2)
712 .input_width(pool_size + 2)
713 .pooling_height(1)
714 .pooling_width(pool_size)
715 .channels(channels)
716 .input_pixel_stride(5 * channels)
717 .TestS8();
718 }
719 }
720 }
721
TEST(MAX_POOLING_NHWC_S8,small_batch_large_pool_with_output_stride)722 TEST(MAX_POOLING_NHWC_S8, small_batch_large_pool_with_output_stride) {
723 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
724 for (size_t channels = 1; channels <= 100; channels += 15) {
725 for (size_t pool_size = xnn_params.s8.maxpool.mr + 1; pool_size <= xnn_params.s8.maxpool.mr + xnn_params.s8.maxpool.qr; pool_size++) {
726 MaxPoolingOperatorTester()
727 .batch_size(3)
728 .input_height(pool_size + 1)
729 .input_width(3)
730 .pooling_height(pool_size)
731 .pooling_width(1)
732 .channels(channels)
733 .output_pixel_stride(5 * channels)
734 .TestS8();
735 MaxPoolingOperatorTester()
736 .batch_size(3)
737 .input_height(2)
738 .input_width(pool_size + 2)
739 .pooling_height(1)
740 .pooling_width(pool_size)
741 .channels(channels)
742 .output_pixel_stride(5 * channels)
743 .TestS8();
744 }
745 }
746 }
747
TEST(MAX_POOLING_NHWC_S8,setup_increasing_batch)748 TEST(MAX_POOLING_NHWC_S8, setup_increasing_batch) {
749 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
750 MaxPoolingOperatorTester()
751 .batch_size(3)
752 .next_batch_size(5)
753 .input_height(8)
754 .input_width(8)
755 .pooling_height(5)
756 .pooling_width(3)
757 .channels(24)
758 .TestSetupS8();
759 }
760
TEST(MAX_POOLING_NHWC_S8,setup_decreasing_batch)761 TEST(MAX_POOLING_NHWC_S8, setup_decreasing_batch) {
762 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
763 MaxPoolingOperatorTester()
764 .batch_size(5)
765 .next_batch_size(3)
766 .input_height(8)
767 .input_width(8)
768 .pooling_height(5)
769 .pooling_width(3)
770 .channels(24)
771 .TestSetupS8();
772 }
773
TEST(MAX_POOLING_NHWC_S8,setup_changing_height)774 TEST(MAX_POOLING_NHWC_S8, setup_changing_height) {
775 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
776 MaxPoolingOperatorTester()
777 .batch_size(3)
778 .input_height(8)
779 .input_width(8)
780 .next_input_height(9)
781 .pooling_height(5)
782 .pooling_width(3)
783 .channels(24)
784 .TestSetupS8();
785 MaxPoolingOperatorTester()
786 .batch_size(3)
787 .input_height(8)
788 .input_width(8)
789 .next_input_height(7)
790 .pooling_height(5)
791 .pooling_width(3)
792 .channels(24)
793 .TestSetupS8();
794 }
795
TEST(MAX_POOLING_NHWC_S8,setup_changing_width)796 TEST(MAX_POOLING_NHWC_S8, setup_changing_width) {
797 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
798 MaxPoolingOperatorTester()
799 .batch_size(3)
800 .input_height(8)
801 .input_width(8)
802 .next_input_width(9)
803 .pooling_height(5)
804 .pooling_width(3)
805 .channels(24)
806 .TestSetupS8();
807 MaxPoolingOperatorTester()
808 .batch_size(3)
809 .input_height(8)
810 .input_width(8)
811 .next_input_width(7)
812 .pooling_height(5)
813 .pooling_width(3)
814 .channels(24)
815 .TestSetupS8();
816 }
817
TEST(MAX_POOLING_NHWC_S8,setup_swap_height_and_width)818 TEST(MAX_POOLING_NHWC_S8, setup_swap_height_and_width) {
819 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
820 MaxPoolingOperatorTester()
821 .batch_size(3)
822 .input_height(9)
823 .input_width(8)
824 .next_input_height(8)
825 .next_input_width(9)
826 .pooling_height(5)
827 .pooling_width(3)
828 .channels(24)
829 .TestSetupS8();
830 }
831
832
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_1xM_pool)833 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_1xM_pool) {
834 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
835 for (size_t channels = 1; channels <= 100; channels += 15) {
836 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
837 MaxPoolingOperatorTester()
838 .batch_size(1)
839 .input_height(2)
840 .input_width(pool_size + 2)
841 .pooling_height(1)
842 .pooling_width(pool_size)
843 .channels(channels)
844 .TestU8();
845 }
846 }
847 }
848
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_1xM_pool_with_padding)849 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_1xM_pool_with_padding) {
850 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
851 for (size_t channels = 1; channels <= 100; channels += 15) {
852 for (size_t pool_size = 3; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
853 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
854 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
855 MaxPoolingOperatorTester()
856 .batch_size(1)
857 .input_height(2)
858 .input_width(pool_size + 2)
859 .padding_left(padding_left)
860 .padding_right(padding_right)
861 .pooling_height(1)
862 .pooling_width(pool_size)
863 .channels(channels)
864 .TestU8();
865 }
866 }
867 }
868 }
869 }
870
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_1xM_pool_with_tf_same_padding)871 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_1xM_pool_with_tf_same_padding) {
872 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
873 for (size_t channels = 1; channels <= 100; channels += 15) {
874 for (size_t pool_size = 3; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
875 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
876 MaxPoolingOperatorTester()
877 .batch_size(1)
878 .input_height(2)
879 .input_width(input_width)
880 .padding_tf_same(true)
881 .pooling_height(1)
882 .pooling_width(pool_size)
883 .channels(channels)
884 .TestU8();
885 }
886 }
887 }
888 }
889
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_1xM_pool_with_stride)890 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_1xM_pool_with_stride) {
891 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
892 for (size_t channels = 1; channels <= 100; channels += 15) {
893 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
894 MaxPoolingOperatorTester()
895 .batch_size(1)
896 .input_height(2)
897 .input_width(pool_size + 4)
898 .pooling_height(1)
899 .pooling_width(pool_size)
900 .stride_width(2)
901 .channels(channels)
902 .TestU8();
903 }
904 }
905 }
906
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_1xM_pool_with_dilation)907 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_1xM_pool_with_dilation) {
908 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
909 for (size_t channels = 1; channels <= 100; channels += 15) {
910 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
911 MaxPoolingOperatorTester()
912 .batch_size(1)
913 .input_height(2)
914 .input_width(2 * pool_size + 1)
915 .padding_left(1)
916 .padding_right(1)
917 .pooling_height(1)
918 .pooling_width(pool_size)
919 .dilation_width(2)
920 .channels(channels)
921 .TestU8();
922 }
923 }
924 }
925
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_Mx1_pool)926 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_Mx1_pool) {
927 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
928 for (size_t channels = 1; channels <= 100; channels += 15) {
929 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
930 MaxPoolingOperatorTester()
931 .batch_size(1)
932 .input_height(pool_size + 1)
933 .input_width(3)
934 .pooling_height(pool_size)
935 .pooling_width(1)
936 .channels(channels)
937 .TestU8();
938 }
939 }
940 }
941
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_Mx1_pool_with_padding)942 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_Mx1_pool_with_padding) {
943 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
944 for (size_t channels = 1; channels <= 100; channels += 15) {
945 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
946 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
947 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
948 MaxPoolingOperatorTester()
949 .batch_size(1)
950 .input_height(pool_size + 1)
951 .input_width(3)
952 .padding_top(padding_top)
953 .padding_bottom(padding_bottom)
954 .pooling_height(pool_size)
955 .pooling_width(1)
956 .channels(channels)
957 .TestU8();
958 }
959 }
960 }
961 }
962 }
963
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_Mx1_pool_with_tf_same_padding)964 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_Mx1_pool_with_tf_same_padding) {
965 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
966 for (size_t channels = 1; channels <= 100; channels += 15) {
967 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
968 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
969 MaxPoolingOperatorTester()
970 .batch_size(1)
971 .input_height(input_height)
972 .input_width(3)
973 .padding_tf_same(true)
974 .pooling_height(pool_size)
975 .pooling_width(1)
976 .channels(channels)
977 .TestU8();
978 }
979 }
980 }
981 }
982
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_Mx1_pool_with_stride)983 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_Mx1_pool_with_stride) {
984 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
985 for (size_t channels = 1; channels <= 100; channels += 15) {
986 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
987 MaxPoolingOperatorTester()
988 .batch_size(1)
989 .input_height(pool_size + 3)
990 .input_width(3)
991 .pooling_height(pool_size)
992 .pooling_width(1)
993 .stride_height(2)
994 .channels(channels)
995 .TestU8();
996 }
997 }
998 }
999
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_Mx1_pool_with_dilation)1000 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_Mx1_pool_with_dilation) {
1001 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1002 for (size_t channels = 1; channels <= 100; channels += 15) {
1003 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1004 MaxPoolingOperatorTester()
1005 .batch_size(1)
1006 .input_height(2 * pool_size)
1007 .input_width(3)
1008 .padding_top(1)
1009 .padding_bottom(1)
1010 .pooling_height(pool_size)
1011 .pooling_width(1)
1012 .dilation_height(2)
1013 .channels(channels)
1014 .TestU8();
1015 }
1016 }
1017 }
1018
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_pool_with_input_stride)1019 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_pool_with_input_stride) {
1020 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1021 for (size_t channels = 1; channels <= 100; channels += 15) {
1022 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1023 MaxPoolingOperatorTester()
1024 .batch_size(1)
1025 .input_height(pool_size + 1)
1026 .input_width(3)
1027 .pooling_height(pool_size)
1028 .pooling_width(1)
1029 .channels(channels)
1030 .input_pixel_stride(5 * channels)
1031 .TestU8();
1032 MaxPoolingOperatorTester()
1033 .batch_size(1)
1034 .input_height(2)
1035 .input_width(pool_size + 2)
1036 .pooling_height(1)
1037 .pooling_width(pool_size)
1038 .channels(channels)
1039 .input_pixel_stride(5 * channels)
1040 .TestU8();
1041 }
1042 }
1043 }
1044
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_pool_with_output_stride)1045 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_pool_with_output_stride) {
1046 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1047 for (size_t channels = 1; channels <= 100; channels += 15) {
1048 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1049 MaxPoolingOperatorTester()
1050 .batch_size(1)
1051 .input_height(pool_size + 1)
1052 .input_width(3)
1053 .pooling_height(pool_size)
1054 .pooling_width(1)
1055 .channels(channels)
1056 .output_pixel_stride(5 * channels)
1057 .TestU8();
1058 MaxPoolingOperatorTester()
1059 .batch_size(1)
1060 .input_height(2)
1061 .input_width(pool_size + 2)
1062 .pooling_height(1)
1063 .pooling_width(pool_size)
1064 .channels(channels)
1065 .output_pixel_stride(5 * channels)
1066 .TestU8();
1067 }
1068 }
1069 }
1070
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_pool_with_qmin)1071 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_pool_with_qmin) {
1072 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1073 for (size_t channels = 1; channels <= 100; channels += 15) {
1074 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1075 MaxPoolingOperatorTester()
1076 .batch_size(1)
1077 .input_height(pool_size + 1)
1078 .input_width(3)
1079 .pooling_height(pool_size)
1080 .pooling_width(1)
1081 .channels(channels)
1082 .qmin(192)
1083 .TestU8();
1084 MaxPoolingOperatorTester()
1085 .batch_size(1)
1086 .input_height(2)
1087 .input_width(pool_size + 2)
1088 .pooling_height(1)
1089 .pooling_width(pool_size)
1090 .channels(channels)
1091 .qmin(192)
1092 .TestU8();
1093 }
1094 }
1095 }
1096
TEST(MAX_POOLING_NHWC_U8,unit_batch_small_pool_with_qmax)1097 TEST(MAX_POOLING_NHWC_U8, unit_batch_small_pool_with_qmax) {
1098 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1099 for (size_t channels = 1; channels <= 100; channels += 15) {
1100 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1101 MaxPoolingOperatorTester()
1102 .batch_size(1)
1103 .input_height(pool_size + 1)
1104 .input_width(3)
1105 .pooling_height(pool_size)
1106 .pooling_width(1)
1107 .channels(channels)
1108 .qmax(192)
1109 .TestU8();
1110 MaxPoolingOperatorTester()
1111 .batch_size(1)
1112 .input_height(2)
1113 .input_width(pool_size + 2)
1114 .pooling_height(1)
1115 .pooling_width(pool_size)
1116 .channels(channels)
1117 .qmax(192)
1118 .TestU8();
1119 }
1120 }
1121 }
1122
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_1xM_pool)1123 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_1xM_pool) {
1124 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1125 for (size_t channels = 1; channels <= 100; channels += 15) {
1126 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1127 MaxPoolingOperatorTester()
1128 .batch_size(1)
1129 .input_height(2)
1130 .input_width(pool_size + 2)
1131 .pooling_height(1)
1132 .pooling_width(pool_size)
1133 .channels(channels)
1134 .TestU8();
1135 }
1136 }
1137 }
1138
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_1xM_pool_with_padding)1139 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_1xM_pool_with_padding) {
1140 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1141 for (size_t channels = 1; channels <= 100; channels += 15) {
1142 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1143 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
1144 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
1145 MaxPoolingOperatorTester()
1146 .batch_size(1)
1147 .input_height(2)
1148 .input_width(pool_size + 2)
1149 .padding_left(padding_left)
1150 .padding_right(padding_right)
1151 .pooling_height(1)
1152 .pooling_width(pool_size)
1153 .channels(channels)
1154 .TestU8();
1155 }
1156 }
1157 }
1158 }
1159 }
1160
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_1xM_pool_with_tf_same_padding)1161 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_1xM_pool_with_tf_same_padding) {
1162 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1163 for (size_t channels = 1; channels <= 100; channels += 15) {
1164 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1165 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
1166 MaxPoolingOperatorTester()
1167 .batch_size(1)
1168 .input_height(2)
1169 .input_width(input_width)
1170 .padding_tf_same(true)
1171 .pooling_height(1)
1172 .pooling_width(pool_size)
1173 .channels(channels)
1174 .TestU8();
1175 }
1176 }
1177 }
1178 }
1179
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_1xM_pool_with_stride)1180 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_1xM_pool_with_stride) {
1181 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1182 for (size_t channels = 1; channels <= 100; channels += 15) {
1183 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1184 MaxPoolingOperatorTester()
1185 .batch_size(1)
1186 .input_height(2)
1187 .input_width(pool_size + 4)
1188 .pooling_height(1)
1189 .pooling_width(pool_size)
1190 .stride_width(2)
1191 .channels(channels)
1192 .TestU8();
1193 }
1194 }
1195 }
1196
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_1xM_pool_with_dilation)1197 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_1xM_pool_with_dilation) {
1198 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1199 for (size_t channels = 1; channels <= 100; channels += 15) {
1200 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1201 MaxPoolingOperatorTester()
1202 .batch_size(1)
1203 .input_height(2)
1204 .input_width(2 * pool_size + 1)
1205 .padding_left(1)
1206 .padding_right(1)
1207 .pooling_height(1)
1208 .pooling_width(pool_size)
1209 .dilation_width(2)
1210 .channels(channels)
1211 .TestU8();
1212 }
1213 }
1214 }
1215
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_Mx1_pool)1216 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_Mx1_pool) {
1217 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1218 for (size_t channels = 1; channels <= 100; channels += 15) {
1219 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1220 MaxPoolingOperatorTester()
1221 .batch_size(1)
1222 .input_height(pool_size + 1)
1223 .input_width(3)
1224 .pooling_height(pool_size)
1225 .pooling_width(1)
1226 .channels(channels)
1227 .TestU8();
1228 }
1229 }
1230 }
1231
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_Mx1_pool_with_padding)1232 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_Mx1_pool_with_padding) {
1233 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1234 for (size_t channels = 1; channels <= 100; channels += 15) {
1235 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1236 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1237 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1238 MaxPoolingOperatorTester()
1239 .batch_size(1)
1240 .input_height(pool_size + 1)
1241 .input_width(3)
1242 .padding_top(padding_top)
1243 .padding_bottom(padding_bottom)
1244 .pooling_height(pool_size)
1245 .pooling_width(1)
1246 .channels(channels)
1247 .TestU8();
1248 }
1249 }
1250 }
1251 }
1252 }
1253
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_Mx1_pool_with_tf_same_padding)1254 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_Mx1_pool_with_tf_same_padding) {
1255 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1256 for (size_t channels = 1; channels <= 100; channels += 15) {
1257 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1258 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
1259 MaxPoolingOperatorTester()
1260 .batch_size(1)
1261 .input_height(input_height)
1262 .input_width(3)
1263 .padding_tf_same(true)
1264 .pooling_height(pool_size)
1265 .pooling_width(1)
1266 .channels(channels)
1267 .TestU8();
1268 }
1269 }
1270 }
1271 }
1272
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_Mx1_pool_with_stride)1273 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_Mx1_pool_with_stride) {
1274 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1275 for (size_t channels = 1; channels <= 100; channels += 15) {
1276 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1277 MaxPoolingOperatorTester()
1278 .batch_size(1)
1279 .input_height(pool_size + 3)
1280 .input_width(3)
1281 .pooling_height(pool_size)
1282 .pooling_width(1)
1283 .stride_height(2)
1284 .channels(channels)
1285 .TestU8();
1286 }
1287 }
1288 }
1289
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_Mx1_pool_with_dilation)1290 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_Mx1_pool_with_dilation) {
1291 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1292 for (size_t channels = 1; channels <= 100; channels += 15) {
1293 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1294 MaxPoolingOperatorTester()
1295 .batch_size(1)
1296 .input_height(2 * pool_size)
1297 .input_width(3)
1298 .padding_top(1)
1299 .padding_bottom(1)
1300 .pooling_height(pool_size)
1301 .pooling_width(1)
1302 .dilation_height(2)
1303 .channels(channels)
1304 .TestU8();
1305 }
1306 }
1307 }
1308
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_pool_with_input_stride)1309 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_pool_with_input_stride) {
1310 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1311 for (size_t channels = 1; channels <= 100; channels += 15) {
1312 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1313 MaxPoolingOperatorTester()
1314 .batch_size(1)
1315 .input_height(pool_size + 1)
1316 .input_width(3)
1317 .pooling_height(pool_size)
1318 .pooling_width(1)
1319 .channels(channels)
1320 .input_pixel_stride(5 * channels)
1321 .TestU8();
1322 MaxPoolingOperatorTester()
1323 .batch_size(1)
1324 .input_height(2)
1325 .input_width(pool_size + 2)
1326 .pooling_height(1)
1327 .pooling_width(pool_size)
1328 .channels(channels)
1329 .input_pixel_stride(5 * channels)
1330 .TestU8();
1331 }
1332 }
1333 }
1334
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_pool_with_output_stride)1335 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_pool_with_output_stride) {
1336 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1337 for (size_t channels = 1; channels <= 100; channels += 15) {
1338 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1339 MaxPoolingOperatorTester()
1340 .batch_size(1)
1341 .input_height(pool_size + 1)
1342 .input_width(3)
1343 .pooling_height(pool_size)
1344 .pooling_width(1)
1345 .channels(channels)
1346 .output_pixel_stride(5 * channels)
1347 .TestU8();
1348 MaxPoolingOperatorTester()
1349 .batch_size(1)
1350 .input_height(2)
1351 .input_width(pool_size + 2)
1352 .pooling_height(1)
1353 .pooling_width(pool_size)
1354 .channels(channels)
1355 .output_pixel_stride(5 * channels)
1356 .TestU8();
1357 }
1358 }
1359 }
1360
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_pool_with_qmin)1361 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_pool_with_qmin) {
1362 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1363 for (size_t channels = 1; channels <= 100; channels += 15) {
1364 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1365 MaxPoolingOperatorTester()
1366 .batch_size(1)
1367 .input_height(pool_size + 1)
1368 .input_width(3)
1369 .pooling_height(pool_size)
1370 .pooling_width(1)
1371 .channels(channels)
1372 .qmin(192)
1373 .TestU8();
1374 MaxPoolingOperatorTester()
1375 .batch_size(1)
1376 .input_height(2)
1377 .input_width(pool_size + 2)
1378 .pooling_height(1)
1379 .pooling_width(pool_size)
1380 .channels(channels)
1381 .qmin(192)
1382 .TestU8();
1383 }
1384 }
1385 }
1386
TEST(MAX_POOLING_NHWC_U8,unit_batch_large_pool_with_qmax)1387 TEST(MAX_POOLING_NHWC_U8, unit_batch_large_pool_with_qmax) {
1388 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1389 for (size_t channels = 1; channels <= 100; channels += 15) {
1390 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1391 MaxPoolingOperatorTester()
1392 .batch_size(1)
1393 .input_height(pool_size + 1)
1394 .input_width(3)
1395 .pooling_height(pool_size)
1396 .pooling_width(1)
1397 .channels(channels)
1398 .qmax(192)
1399 .TestU8();
1400 MaxPoolingOperatorTester()
1401 .batch_size(1)
1402 .input_height(2)
1403 .input_width(pool_size + 2)
1404 .pooling_height(1)
1405 .pooling_width(pool_size)
1406 .channels(channels)
1407 .qmax(192)
1408 .TestU8();
1409 }
1410 }
1411 }
1412
TEST(MAX_POOLING_NHWC_U8,small_batch_small_pool)1413 TEST(MAX_POOLING_NHWC_U8, small_batch_small_pool) {
1414 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1415 for (size_t channels = 1; channels <= 100; channels += 15) {
1416 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1417 MaxPoolingOperatorTester()
1418 .batch_size(3)
1419 .input_height(pool_size + 1)
1420 .input_width(3)
1421 .pooling_height(pool_size)
1422 .pooling_width(1)
1423 .channels(channels)
1424 .TestU8();
1425 MaxPoolingOperatorTester()
1426 .batch_size(3)
1427 .input_height(2)
1428 .input_width(pool_size + 2)
1429 .pooling_height(1)
1430 .pooling_width(pool_size)
1431 .channels(channels)
1432 .TestU8();
1433 }
1434 }
1435 }
1436
TEST(MAX_POOLING_NHWC_U8,small_batch_small_pool_with_input_stride)1437 TEST(MAX_POOLING_NHWC_U8, small_batch_small_pool_with_input_stride) {
1438 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1439 for (size_t channels = 1; channels <= 100; channels += 15) {
1440 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1441 MaxPoolingOperatorTester()
1442 .batch_size(3)
1443 .input_height(pool_size + 1)
1444 .input_width(3)
1445 .pooling_height(pool_size)
1446 .pooling_width(1)
1447 .channels(channels)
1448 .input_pixel_stride(5 * channels)
1449 .TestU8();
1450 MaxPoolingOperatorTester()
1451 .batch_size(3)
1452 .input_height(2)
1453 .input_width(pool_size + 2)
1454 .pooling_height(1)
1455 .pooling_width(pool_size)
1456 .channels(channels)
1457 .input_pixel_stride(5 * channels)
1458 .TestU8();
1459 }
1460 }
1461 }
1462
TEST(MAX_POOLING_NHWC_U8,small_batch_small_pool_with_output_stride)1463 TEST(MAX_POOLING_NHWC_U8, small_batch_small_pool_with_output_stride) {
1464 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1465 for (size_t channels = 1; channels <= 100; channels += 15) {
1466 for (size_t pool_size = 2; pool_size <= xnn_params.u8.maxpool.mr; pool_size++) {
1467 MaxPoolingOperatorTester()
1468 .batch_size(3)
1469 .input_height(pool_size + 1)
1470 .input_width(3)
1471 .pooling_height(pool_size)
1472 .pooling_width(1)
1473 .channels(channels)
1474 .output_pixel_stride(5 * channels)
1475 .TestU8();
1476 MaxPoolingOperatorTester()
1477 .batch_size(3)
1478 .input_height(2)
1479 .input_width(pool_size + 2)
1480 .pooling_height(1)
1481 .pooling_width(pool_size)
1482 .channels(channels)
1483 .output_pixel_stride(5 * channels)
1484 .TestU8();
1485 }
1486 }
1487 }
1488
TEST(MAX_POOLING_NHWC_U8,small_batch_large_pool)1489 TEST(MAX_POOLING_NHWC_U8, small_batch_large_pool) {
1490 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1491 for (size_t channels = 1; channels <= 100; channels += 15) {
1492 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1493 MaxPoolingOperatorTester()
1494 .batch_size(3)
1495 .input_height(pool_size + 1)
1496 .input_width(3)
1497 .pooling_height(pool_size)
1498 .pooling_width(1)
1499 .channels(channels)
1500 .TestU8();
1501 MaxPoolingOperatorTester()
1502 .batch_size(3)
1503 .input_height(2)
1504 .input_width(pool_size + 2)
1505 .pooling_height(1)
1506 .pooling_width(pool_size)
1507 .channels(channels)
1508 .TestU8();
1509 }
1510 }
1511 }
1512
TEST(MAX_POOLING_NHWC_U8,small_batch_large_pool_with_input_stride)1513 TEST(MAX_POOLING_NHWC_U8, small_batch_large_pool_with_input_stride) {
1514 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1515 for (size_t channels = 1; channels <= 100; channels += 15) {
1516 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1517 MaxPoolingOperatorTester()
1518 .batch_size(3)
1519 .input_height(pool_size + 1)
1520 .input_width(3)
1521 .pooling_height(pool_size)
1522 .pooling_width(1)
1523 .channels(channels)
1524 .input_pixel_stride(5 * channels)
1525 .TestU8();
1526 MaxPoolingOperatorTester()
1527 .batch_size(3)
1528 .input_height(2)
1529 .input_width(pool_size + 2)
1530 .pooling_height(1)
1531 .pooling_width(pool_size)
1532 .channels(channels)
1533 .input_pixel_stride(5 * channels)
1534 .TestU8();
1535 }
1536 }
1537 }
1538
TEST(MAX_POOLING_NHWC_U8,small_batch_large_pool_with_output_stride)1539 TEST(MAX_POOLING_NHWC_U8, small_batch_large_pool_with_output_stride) {
1540 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1541 for (size_t channels = 1; channels <= 100; channels += 15) {
1542 for (size_t pool_size = xnn_params.u8.maxpool.mr + 1; pool_size <= xnn_params.u8.maxpool.mr + xnn_params.u8.maxpool.qr; pool_size++) {
1543 MaxPoolingOperatorTester()
1544 .batch_size(3)
1545 .input_height(pool_size + 1)
1546 .input_width(3)
1547 .pooling_height(pool_size)
1548 .pooling_width(1)
1549 .channels(channels)
1550 .output_pixel_stride(5 * channels)
1551 .TestU8();
1552 MaxPoolingOperatorTester()
1553 .batch_size(3)
1554 .input_height(2)
1555 .input_width(pool_size + 2)
1556 .pooling_height(1)
1557 .pooling_width(pool_size)
1558 .channels(channels)
1559 .output_pixel_stride(5 * channels)
1560 .TestU8();
1561 }
1562 }
1563 }
1564
TEST(MAX_POOLING_NHWC_U8,setup_increasing_batch)1565 TEST(MAX_POOLING_NHWC_U8, setup_increasing_batch) {
1566 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1567 MaxPoolingOperatorTester()
1568 .batch_size(3)
1569 .next_batch_size(5)
1570 .input_height(8)
1571 .input_width(8)
1572 .pooling_height(5)
1573 .pooling_width(3)
1574 .channels(24)
1575 .TestSetupU8();
1576 }
1577
TEST(MAX_POOLING_NHWC_U8,setup_decreasing_batch)1578 TEST(MAX_POOLING_NHWC_U8, setup_decreasing_batch) {
1579 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1580 MaxPoolingOperatorTester()
1581 .batch_size(5)
1582 .next_batch_size(3)
1583 .input_height(8)
1584 .input_width(8)
1585 .pooling_height(5)
1586 .pooling_width(3)
1587 .channels(24)
1588 .TestSetupU8();
1589 }
1590
TEST(MAX_POOLING_NHWC_U8,setup_changing_height)1591 TEST(MAX_POOLING_NHWC_U8, setup_changing_height) {
1592 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1593 MaxPoolingOperatorTester()
1594 .batch_size(3)
1595 .input_height(8)
1596 .input_width(8)
1597 .next_input_height(9)
1598 .pooling_height(5)
1599 .pooling_width(3)
1600 .channels(24)
1601 .TestSetupU8();
1602 MaxPoolingOperatorTester()
1603 .batch_size(3)
1604 .input_height(8)
1605 .input_width(8)
1606 .next_input_height(7)
1607 .pooling_height(5)
1608 .pooling_width(3)
1609 .channels(24)
1610 .TestSetupU8();
1611 }
1612
TEST(MAX_POOLING_NHWC_U8,setup_changing_width)1613 TEST(MAX_POOLING_NHWC_U8, setup_changing_width) {
1614 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1615 MaxPoolingOperatorTester()
1616 .batch_size(3)
1617 .input_height(8)
1618 .input_width(8)
1619 .next_input_width(9)
1620 .pooling_height(5)
1621 .pooling_width(3)
1622 .channels(24)
1623 .TestSetupU8();
1624 MaxPoolingOperatorTester()
1625 .batch_size(3)
1626 .input_height(8)
1627 .input_width(8)
1628 .next_input_width(7)
1629 .pooling_height(5)
1630 .pooling_width(3)
1631 .channels(24)
1632 .TestSetupU8();
1633 }
1634
TEST(MAX_POOLING_NHWC_U8,setup_swap_height_and_width)1635 TEST(MAX_POOLING_NHWC_U8, setup_swap_height_and_width) {
1636 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1637 MaxPoolingOperatorTester()
1638 .batch_size(3)
1639 .input_height(9)
1640 .input_width(8)
1641 .next_input_height(8)
1642 .next_input_width(9)
1643 .pooling_height(5)
1644 .pooling_width(3)
1645 .channels(24)
1646 .TestSetupU8();
1647 }
1648
1649
1650 #ifndef XNN_EXCLUDE_F16_TESTS
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_1xM_pool)1651 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_1xM_pool) {
1652 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1653 for (size_t channels = 1; channels <= 100; channels += 15) {
1654 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1655 MaxPoolingOperatorTester()
1656 .batch_size(1)
1657 .input_height(2)
1658 .input_width(pool_size + 2)
1659 .pooling_height(1)
1660 .pooling_width(pool_size)
1661 .channels(channels)
1662 .TestF16();
1663 }
1664 }
1665 }
1666
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_1xM_pool_with_padding)1667 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_1xM_pool_with_padding) {
1668 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1669 for (size_t channels = 1; channels <= 100; channels += 15) {
1670 for (size_t pool_size = 3; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1671 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
1672 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
1673 MaxPoolingOperatorTester()
1674 .batch_size(1)
1675 .input_height(2)
1676 .input_width(pool_size + 2)
1677 .padding_left(padding_left)
1678 .padding_right(padding_right)
1679 .pooling_height(1)
1680 .pooling_width(pool_size)
1681 .channels(channels)
1682 .TestF16();
1683 }
1684 }
1685 }
1686 }
1687 }
1688
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_1xM_pool_with_tf_same_padding)1689 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_1xM_pool_with_tf_same_padding) {
1690 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1691 for (size_t channels = 1; channels <= 100; channels += 15) {
1692 for (size_t pool_size = 3; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1693 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
1694 MaxPoolingOperatorTester()
1695 .batch_size(1)
1696 .input_height(2)
1697 .input_width(input_width)
1698 .padding_tf_same(true)
1699 .pooling_height(1)
1700 .pooling_width(pool_size)
1701 .channels(channels)
1702 .TestF16();
1703 }
1704 }
1705 }
1706 }
1707
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_1xM_pool_with_stride)1708 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_1xM_pool_with_stride) {
1709 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1710 for (size_t channels = 1; channels <= 100; channels += 15) {
1711 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1712 MaxPoolingOperatorTester()
1713 .batch_size(1)
1714 .input_height(2)
1715 .input_width(pool_size + 4)
1716 .pooling_height(1)
1717 .pooling_width(pool_size)
1718 .stride_width(2)
1719 .channels(channels)
1720 .TestF16();
1721 }
1722 }
1723 }
1724
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_1xM_pool_with_dilation)1725 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_1xM_pool_with_dilation) {
1726 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1727 for (size_t channels = 1; channels <= 100; channels += 15) {
1728 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1729 MaxPoolingOperatorTester()
1730 .batch_size(1)
1731 .input_height(2)
1732 .input_width(2 * pool_size + 1)
1733 .padding_left(1)
1734 .padding_right(1)
1735 .pooling_height(1)
1736 .pooling_width(pool_size)
1737 .dilation_width(2)
1738 .channels(channels)
1739 .TestF16();
1740 }
1741 }
1742 }
1743
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_Mx1_pool)1744 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_Mx1_pool) {
1745 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1746 for (size_t channels = 1; channels <= 100; channels += 15) {
1747 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1748 MaxPoolingOperatorTester()
1749 .batch_size(1)
1750 .input_height(pool_size + 1)
1751 .input_width(3)
1752 .pooling_height(pool_size)
1753 .pooling_width(1)
1754 .channels(channels)
1755 .TestF16();
1756 }
1757 }
1758 }
1759
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_Mx1_pool_with_padding)1760 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_Mx1_pool_with_padding) {
1761 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1762 for (size_t channels = 1; channels <= 100; channels += 15) {
1763 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1764 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1765 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1766 MaxPoolingOperatorTester()
1767 .batch_size(1)
1768 .input_height(pool_size + 1)
1769 .input_width(3)
1770 .padding_top(padding_top)
1771 .padding_bottom(padding_bottom)
1772 .pooling_height(pool_size)
1773 .pooling_width(1)
1774 .channels(channels)
1775 .TestF16();
1776 }
1777 }
1778 }
1779 }
1780 }
1781
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_Mx1_pool_with_tf_same_padding)1782 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_Mx1_pool_with_tf_same_padding) {
1783 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1784 for (size_t channels = 1; channels <= 100; channels += 15) {
1785 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1786 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
1787 MaxPoolingOperatorTester()
1788 .batch_size(1)
1789 .input_height(input_height)
1790 .input_width(3)
1791 .padding_tf_same(true)
1792 .pooling_height(pool_size)
1793 .pooling_width(1)
1794 .channels(channels)
1795 .TestF16();
1796 }
1797 }
1798 }
1799 }
1800
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_Mx1_pool_with_stride)1801 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_Mx1_pool_with_stride) {
1802 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1803 for (size_t channels = 1; channels <= 100; channels += 15) {
1804 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1805 MaxPoolingOperatorTester()
1806 .batch_size(1)
1807 .input_height(pool_size + 3)
1808 .input_width(3)
1809 .pooling_height(pool_size)
1810 .pooling_width(1)
1811 .stride_height(2)
1812 .channels(channels)
1813 .TestF16();
1814 }
1815 }
1816 }
1817
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_Mx1_pool_with_dilation)1818 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_Mx1_pool_with_dilation) {
1819 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1820 for (size_t channels = 1; channels <= 100; channels += 15) {
1821 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1822 MaxPoolingOperatorTester()
1823 .batch_size(1)
1824 .input_height(2 * pool_size)
1825 .input_width(3)
1826 .padding_top(1)
1827 .padding_bottom(1)
1828 .pooling_height(pool_size)
1829 .pooling_width(1)
1830 .dilation_height(2)
1831 .channels(channels)
1832 .TestF16();
1833 }
1834 }
1835 }
1836
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_pool_with_input_stride)1837 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_pool_with_input_stride) {
1838 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1839 for (size_t channels = 1; channels <= 100; channels += 15) {
1840 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1841 MaxPoolingOperatorTester()
1842 .batch_size(1)
1843 .input_height(pool_size + 1)
1844 .input_width(3)
1845 .pooling_height(pool_size)
1846 .pooling_width(1)
1847 .channels(channels)
1848 .input_pixel_stride(5 * channels)
1849 .TestF16();
1850 MaxPoolingOperatorTester()
1851 .batch_size(1)
1852 .input_height(2)
1853 .input_width(pool_size + 2)
1854 .pooling_height(1)
1855 .pooling_width(pool_size)
1856 .channels(channels)
1857 .input_pixel_stride(5 * channels)
1858 .TestF16();
1859 }
1860 }
1861 }
1862
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_pool_with_output_stride)1863 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_pool_with_output_stride) {
1864 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1865 for (size_t channels = 1; channels <= 100; channels += 15) {
1866 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1867 MaxPoolingOperatorTester()
1868 .batch_size(1)
1869 .input_height(pool_size + 1)
1870 .input_width(3)
1871 .pooling_height(pool_size)
1872 .pooling_width(1)
1873 .channels(channels)
1874 .output_pixel_stride(5 * channels)
1875 .TestF16();
1876 MaxPoolingOperatorTester()
1877 .batch_size(1)
1878 .input_height(2)
1879 .input_width(pool_size + 2)
1880 .pooling_height(1)
1881 .pooling_width(pool_size)
1882 .channels(channels)
1883 .output_pixel_stride(5 * channels)
1884 .TestF16();
1885 }
1886 }
1887 }
1888
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_pool_with_qmin)1889 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_pool_with_qmin) {
1890 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1891 for (size_t channels = 1; channels <= 100; channels += 15) {
1892 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1893 MaxPoolingOperatorTester()
1894 .batch_size(1)
1895 .input_height(pool_size + 1)
1896 .input_width(3)
1897 .pooling_height(pool_size)
1898 .pooling_width(1)
1899 .channels(channels)
1900 .qmin(192)
1901 .TestF16();
1902 MaxPoolingOperatorTester()
1903 .batch_size(1)
1904 .input_height(2)
1905 .input_width(pool_size + 2)
1906 .pooling_height(1)
1907 .pooling_width(pool_size)
1908 .channels(channels)
1909 .qmin(192)
1910 .TestF16();
1911 }
1912 }
1913 }
1914
TEST(MAX_POOLING_NHWC_F16,unit_batch_small_pool_with_qmax)1915 TEST(MAX_POOLING_NHWC_F16, unit_batch_small_pool_with_qmax) {
1916 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1917 for (size_t channels = 1; channels <= 100; channels += 15) {
1918 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
1919 MaxPoolingOperatorTester()
1920 .batch_size(1)
1921 .input_height(pool_size + 1)
1922 .input_width(3)
1923 .pooling_height(pool_size)
1924 .pooling_width(1)
1925 .channels(channels)
1926 .qmax(192)
1927 .TestF16();
1928 MaxPoolingOperatorTester()
1929 .batch_size(1)
1930 .input_height(2)
1931 .input_width(pool_size + 2)
1932 .pooling_height(1)
1933 .pooling_width(pool_size)
1934 .channels(channels)
1935 .qmax(192)
1936 .TestF16();
1937 }
1938 }
1939 }
1940
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_1xM_pool)1941 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_1xM_pool) {
1942 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1943 for (size_t channels = 1; channels <= 100; channels += 15) {
1944 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
1945 MaxPoolingOperatorTester()
1946 .batch_size(1)
1947 .input_height(2)
1948 .input_width(pool_size + 2)
1949 .pooling_height(1)
1950 .pooling_width(pool_size)
1951 .channels(channels)
1952 .TestF16();
1953 }
1954 }
1955 }
1956
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_1xM_pool_with_padding)1957 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_1xM_pool_with_padding) {
1958 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1959 for (size_t channels = 1; channels <= 100; channels += 15) {
1960 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
1961 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
1962 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
1963 MaxPoolingOperatorTester()
1964 .batch_size(1)
1965 .input_height(2)
1966 .input_width(pool_size + 2)
1967 .padding_left(padding_left)
1968 .padding_right(padding_right)
1969 .pooling_height(1)
1970 .pooling_width(pool_size)
1971 .channels(channels)
1972 .TestF16();
1973 }
1974 }
1975 }
1976 }
1977 }
1978
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_1xM_pool_with_tf_same_padding)1979 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_1xM_pool_with_tf_same_padding) {
1980 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1981 for (size_t channels = 1; channels <= 100; channels += 15) {
1982 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
1983 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
1984 MaxPoolingOperatorTester()
1985 .batch_size(1)
1986 .input_height(2)
1987 .input_width(input_width)
1988 .padding_tf_same(true)
1989 .pooling_height(1)
1990 .pooling_width(pool_size)
1991 .channels(channels)
1992 .TestF16();
1993 }
1994 }
1995 }
1996 }
1997
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_1xM_pool_with_stride)1998 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_1xM_pool_with_stride) {
1999 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2000 for (size_t channels = 1; channels <= 100; channels += 15) {
2001 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2002 MaxPoolingOperatorTester()
2003 .batch_size(1)
2004 .input_height(2)
2005 .input_width(pool_size + 4)
2006 .pooling_height(1)
2007 .pooling_width(pool_size)
2008 .stride_width(2)
2009 .channels(channels)
2010 .TestF16();
2011 }
2012 }
2013 }
2014
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_1xM_pool_with_dilation)2015 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_1xM_pool_with_dilation) {
2016 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2017 for (size_t channels = 1; channels <= 100; channels += 15) {
2018 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2019 MaxPoolingOperatorTester()
2020 .batch_size(1)
2021 .input_height(2)
2022 .input_width(2 * pool_size + 1)
2023 .padding_left(1)
2024 .padding_right(1)
2025 .pooling_height(1)
2026 .pooling_width(pool_size)
2027 .dilation_width(2)
2028 .channels(channels)
2029 .TestF16();
2030 }
2031 }
2032 }
2033
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_Mx1_pool)2034 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_Mx1_pool) {
2035 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2036 for (size_t channels = 1; channels <= 100; channels += 15) {
2037 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2038 MaxPoolingOperatorTester()
2039 .batch_size(1)
2040 .input_height(pool_size + 1)
2041 .input_width(3)
2042 .pooling_height(pool_size)
2043 .pooling_width(1)
2044 .channels(channels)
2045 .TestF16();
2046 }
2047 }
2048 }
2049
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_Mx1_pool_with_padding)2050 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_Mx1_pool_with_padding) {
2051 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2052 for (size_t channels = 1; channels <= 100; channels += 15) {
2053 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2054 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2055 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2056 MaxPoolingOperatorTester()
2057 .batch_size(1)
2058 .input_height(pool_size + 1)
2059 .input_width(3)
2060 .padding_top(padding_top)
2061 .padding_bottom(padding_bottom)
2062 .pooling_height(pool_size)
2063 .pooling_width(1)
2064 .channels(channels)
2065 .TestF16();
2066 }
2067 }
2068 }
2069 }
2070 }
2071
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_Mx1_pool_with_tf_same_padding)2072 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_Mx1_pool_with_tf_same_padding) {
2073 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2074 for (size_t channels = 1; channels <= 100; channels += 15) {
2075 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2076 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
2077 MaxPoolingOperatorTester()
2078 .batch_size(1)
2079 .input_height(input_height)
2080 .input_width(3)
2081 .padding_tf_same(true)
2082 .pooling_height(pool_size)
2083 .pooling_width(1)
2084 .channels(channels)
2085 .TestF16();
2086 }
2087 }
2088 }
2089 }
2090
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_Mx1_pool_with_stride)2091 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_Mx1_pool_with_stride) {
2092 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2093 for (size_t channels = 1; channels <= 100; channels += 15) {
2094 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2095 MaxPoolingOperatorTester()
2096 .batch_size(1)
2097 .input_height(pool_size + 3)
2098 .input_width(3)
2099 .pooling_height(pool_size)
2100 .pooling_width(1)
2101 .stride_height(2)
2102 .channels(channels)
2103 .TestF16();
2104 }
2105 }
2106 }
2107
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_Mx1_pool_with_dilation)2108 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_Mx1_pool_with_dilation) {
2109 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2110 for (size_t channels = 1; channels <= 100; channels += 15) {
2111 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2112 MaxPoolingOperatorTester()
2113 .batch_size(1)
2114 .input_height(2 * pool_size)
2115 .input_width(3)
2116 .padding_top(1)
2117 .padding_bottom(1)
2118 .pooling_height(pool_size)
2119 .pooling_width(1)
2120 .dilation_height(2)
2121 .channels(channels)
2122 .TestF16();
2123 }
2124 }
2125 }
2126
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_pool_with_input_stride)2127 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_pool_with_input_stride) {
2128 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2129 for (size_t channels = 1; channels <= 100; channels += 15) {
2130 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2131 MaxPoolingOperatorTester()
2132 .batch_size(1)
2133 .input_height(pool_size + 1)
2134 .input_width(3)
2135 .pooling_height(pool_size)
2136 .pooling_width(1)
2137 .channels(channels)
2138 .input_pixel_stride(5 * channels)
2139 .TestF16();
2140 MaxPoolingOperatorTester()
2141 .batch_size(1)
2142 .input_height(2)
2143 .input_width(pool_size + 2)
2144 .pooling_height(1)
2145 .pooling_width(pool_size)
2146 .channels(channels)
2147 .input_pixel_stride(5 * channels)
2148 .TestF16();
2149 }
2150 }
2151 }
2152
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_pool_with_output_stride)2153 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_pool_with_output_stride) {
2154 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2155 for (size_t channels = 1; channels <= 100; channels += 15) {
2156 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2157 MaxPoolingOperatorTester()
2158 .batch_size(1)
2159 .input_height(pool_size + 1)
2160 .input_width(3)
2161 .pooling_height(pool_size)
2162 .pooling_width(1)
2163 .channels(channels)
2164 .output_pixel_stride(5 * channels)
2165 .TestF16();
2166 MaxPoolingOperatorTester()
2167 .batch_size(1)
2168 .input_height(2)
2169 .input_width(pool_size + 2)
2170 .pooling_height(1)
2171 .pooling_width(pool_size)
2172 .channels(channels)
2173 .output_pixel_stride(5 * channels)
2174 .TestF16();
2175 }
2176 }
2177 }
2178
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_pool_with_qmin)2179 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_pool_with_qmin) {
2180 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2181 for (size_t channels = 1; channels <= 100; channels += 15) {
2182 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2183 MaxPoolingOperatorTester()
2184 .batch_size(1)
2185 .input_height(pool_size + 1)
2186 .input_width(3)
2187 .pooling_height(pool_size)
2188 .pooling_width(1)
2189 .channels(channels)
2190 .qmin(192)
2191 .TestF16();
2192 MaxPoolingOperatorTester()
2193 .batch_size(1)
2194 .input_height(2)
2195 .input_width(pool_size + 2)
2196 .pooling_height(1)
2197 .pooling_width(pool_size)
2198 .channels(channels)
2199 .qmin(192)
2200 .TestF16();
2201 }
2202 }
2203 }
2204
TEST(MAX_POOLING_NHWC_F16,unit_batch_large_pool_with_qmax)2205 TEST(MAX_POOLING_NHWC_F16, unit_batch_large_pool_with_qmax) {
2206 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2207 for (size_t channels = 1; channels <= 100; channels += 15) {
2208 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2209 MaxPoolingOperatorTester()
2210 .batch_size(1)
2211 .input_height(pool_size + 1)
2212 .input_width(3)
2213 .pooling_height(pool_size)
2214 .pooling_width(1)
2215 .channels(channels)
2216 .qmax(192)
2217 .TestF16();
2218 MaxPoolingOperatorTester()
2219 .batch_size(1)
2220 .input_height(2)
2221 .input_width(pool_size + 2)
2222 .pooling_height(1)
2223 .pooling_width(pool_size)
2224 .channels(channels)
2225 .qmax(192)
2226 .TestF16();
2227 }
2228 }
2229 }
2230
TEST(MAX_POOLING_NHWC_F16,small_batch_small_pool)2231 TEST(MAX_POOLING_NHWC_F16, small_batch_small_pool) {
2232 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2233 for (size_t channels = 1; channels <= 100; channels += 15) {
2234 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2235 MaxPoolingOperatorTester()
2236 .batch_size(3)
2237 .input_height(pool_size + 1)
2238 .input_width(3)
2239 .pooling_height(pool_size)
2240 .pooling_width(1)
2241 .channels(channels)
2242 .TestF16();
2243 MaxPoolingOperatorTester()
2244 .batch_size(3)
2245 .input_height(2)
2246 .input_width(pool_size + 2)
2247 .pooling_height(1)
2248 .pooling_width(pool_size)
2249 .channels(channels)
2250 .TestF16();
2251 }
2252 }
2253 }
2254
TEST(MAX_POOLING_NHWC_F16,small_batch_small_pool_with_input_stride)2255 TEST(MAX_POOLING_NHWC_F16, small_batch_small_pool_with_input_stride) {
2256 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2257 for (size_t channels = 1; channels <= 100; channels += 15) {
2258 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2259 MaxPoolingOperatorTester()
2260 .batch_size(3)
2261 .input_height(pool_size + 1)
2262 .input_width(3)
2263 .pooling_height(pool_size)
2264 .pooling_width(1)
2265 .channels(channels)
2266 .input_pixel_stride(5 * channels)
2267 .TestF16();
2268 MaxPoolingOperatorTester()
2269 .batch_size(3)
2270 .input_height(2)
2271 .input_width(pool_size + 2)
2272 .pooling_height(1)
2273 .pooling_width(pool_size)
2274 .channels(channels)
2275 .input_pixel_stride(5 * channels)
2276 .TestF16();
2277 }
2278 }
2279 }
2280
TEST(MAX_POOLING_NHWC_F16,small_batch_small_pool_with_output_stride)2281 TEST(MAX_POOLING_NHWC_F16, small_batch_small_pool_with_output_stride) {
2282 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2283 for (size_t channels = 1; channels <= 100; channels += 15) {
2284 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2285 MaxPoolingOperatorTester()
2286 .batch_size(3)
2287 .input_height(pool_size + 1)
2288 .input_width(3)
2289 .pooling_height(pool_size)
2290 .pooling_width(1)
2291 .channels(channels)
2292 .output_pixel_stride(5 * channels)
2293 .TestF16();
2294 MaxPoolingOperatorTester()
2295 .batch_size(3)
2296 .input_height(2)
2297 .input_width(pool_size + 2)
2298 .pooling_height(1)
2299 .pooling_width(pool_size)
2300 .channels(channels)
2301 .output_pixel_stride(5 * channels)
2302 .TestF16();
2303 }
2304 }
2305 }
2306
TEST(MAX_POOLING_NHWC_F16,small_batch_large_pool)2307 TEST(MAX_POOLING_NHWC_F16, small_batch_large_pool) {
2308 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2309 for (size_t channels = 1; channels <= 100; channels += 15) {
2310 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2311 MaxPoolingOperatorTester()
2312 .batch_size(3)
2313 .input_height(pool_size + 1)
2314 .input_width(3)
2315 .pooling_height(pool_size)
2316 .pooling_width(1)
2317 .channels(channels)
2318 .TestF16();
2319 MaxPoolingOperatorTester()
2320 .batch_size(3)
2321 .input_height(2)
2322 .input_width(pool_size + 2)
2323 .pooling_height(1)
2324 .pooling_width(pool_size)
2325 .channels(channels)
2326 .TestF16();
2327 }
2328 }
2329 }
2330
TEST(MAX_POOLING_NHWC_F16,small_batch_large_pool_with_input_stride)2331 TEST(MAX_POOLING_NHWC_F16, small_batch_large_pool_with_input_stride) {
2332 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2333 for (size_t channels = 1; channels <= 100; channels += 15) {
2334 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2335 MaxPoolingOperatorTester()
2336 .batch_size(3)
2337 .input_height(pool_size + 1)
2338 .input_width(3)
2339 .pooling_height(pool_size)
2340 .pooling_width(1)
2341 .channels(channels)
2342 .input_pixel_stride(5 * channels)
2343 .TestF16();
2344 MaxPoolingOperatorTester()
2345 .batch_size(3)
2346 .input_height(2)
2347 .input_width(pool_size + 2)
2348 .pooling_height(1)
2349 .pooling_width(pool_size)
2350 .channels(channels)
2351 .input_pixel_stride(5 * channels)
2352 .TestF16();
2353 }
2354 }
2355 }
2356
TEST(MAX_POOLING_NHWC_F16,small_batch_large_pool_with_output_stride)2357 TEST(MAX_POOLING_NHWC_F16, small_batch_large_pool_with_output_stride) {
2358 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2359 for (size_t channels = 1; channels <= 100; channels += 15) {
2360 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2361 MaxPoolingOperatorTester()
2362 .batch_size(3)
2363 .input_height(pool_size + 1)
2364 .input_width(3)
2365 .pooling_height(pool_size)
2366 .pooling_width(1)
2367 .channels(channels)
2368 .output_pixel_stride(5 * channels)
2369 .TestF16();
2370 MaxPoolingOperatorTester()
2371 .batch_size(3)
2372 .input_height(2)
2373 .input_width(pool_size + 2)
2374 .pooling_height(1)
2375 .pooling_width(pool_size)
2376 .channels(channels)
2377 .output_pixel_stride(5 * channels)
2378 .TestF16();
2379 }
2380 }
2381 }
2382
TEST(MAX_POOLING_NHWC_F16,setup_increasing_batch)2383 TEST(MAX_POOLING_NHWC_F16, setup_increasing_batch) {
2384 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2385 MaxPoolingOperatorTester()
2386 .batch_size(3)
2387 .next_batch_size(5)
2388 .input_height(8)
2389 .input_width(8)
2390 .pooling_height(5)
2391 .pooling_width(3)
2392 .channels(24)
2393 .TestSetupF16();
2394 }
2395
TEST(MAX_POOLING_NHWC_F16,setup_decreasing_batch)2396 TEST(MAX_POOLING_NHWC_F16, setup_decreasing_batch) {
2397 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2398 MaxPoolingOperatorTester()
2399 .batch_size(5)
2400 .next_batch_size(3)
2401 .input_height(8)
2402 .input_width(8)
2403 .pooling_height(5)
2404 .pooling_width(3)
2405 .channels(24)
2406 .TestSetupF16();
2407 }
2408
TEST(MAX_POOLING_NHWC_F16,setup_changing_height)2409 TEST(MAX_POOLING_NHWC_F16, setup_changing_height) {
2410 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2411 MaxPoolingOperatorTester()
2412 .batch_size(3)
2413 .input_height(8)
2414 .input_width(8)
2415 .next_input_height(9)
2416 .pooling_height(5)
2417 .pooling_width(3)
2418 .channels(24)
2419 .TestSetupF16();
2420 MaxPoolingOperatorTester()
2421 .batch_size(3)
2422 .input_height(8)
2423 .input_width(8)
2424 .next_input_height(7)
2425 .pooling_height(5)
2426 .pooling_width(3)
2427 .channels(24)
2428 .TestSetupF16();
2429 }
2430
TEST(MAX_POOLING_NHWC_F16,setup_changing_width)2431 TEST(MAX_POOLING_NHWC_F16, setup_changing_width) {
2432 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2433 MaxPoolingOperatorTester()
2434 .batch_size(3)
2435 .input_height(8)
2436 .input_width(8)
2437 .next_input_width(9)
2438 .pooling_height(5)
2439 .pooling_width(3)
2440 .channels(24)
2441 .TestSetupF16();
2442 MaxPoolingOperatorTester()
2443 .batch_size(3)
2444 .input_height(8)
2445 .input_width(8)
2446 .next_input_width(7)
2447 .pooling_height(5)
2448 .pooling_width(3)
2449 .channels(24)
2450 .TestSetupF16();
2451 }
2452
TEST(MAX_POOLING_NHWC_F16,setup_swap_height_and_width)2453 TEST(MAX_POOLING_NHWC_F16, setup_swap_height_and_width) {
2454 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2455 MaxPoolingOperatorTester()
2456 .batch_size(3)
2457 .input_height(9)
2458 .input_width(8)
2459 .next_input_height(8)
2460 .next_input_width(9)
2461 .pooling_height(5)
2462 .pooling_width(3)
2463 .channels(24)
2464 .TestSetupF16();
2465 }
2466 #endif // XNN_EXCLUDE_F16_TESTS
2467
2468
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_1xM_pool)2469 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_1xM_pool) {
2470 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2471 for (size_t channels = 1; channels <= 100; channels += 15) {
2472 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2473 MaxPoolingOperatorTester()
2474 .batch_size(1)
2475 .input_height(2)
2476 .input_width(pool_size + 2)
2477 .pooling_height(1)
2478 .pooling_width(pool_size)
2479 .channels(channels)
2480 .TestF32();
2481 }
2482 }
2483 }
2484
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_1xM_pool_with_padding)2485 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_1xM_pool_with_padding) {
2486 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2487 for (size_t channels = 1; channels <= 100; channels += 15) {
2488 for (size_t pool_size = 3; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2489 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
2490 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
2491 MaxPoolingOperatorTester()
2492 .batch_size(1)
2493 .input_height(2)
2494 .input_width(pool_size + 2)
2495 .padding_left(padding_left)
2496 .padding_right(padding_right)
2497 .pooling_height(1)
2498 .pooling_width(pool_size)
2499 .channels(channels)
2500 .TestF32();
2501 }
2502 }
2503 }
2504 }
2505 }
2506
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_1xM_pool_with_tf_same_padding)2507 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_1xM_pool_with_tf_same_padding) {
2508 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2509 for (size_t channels = 1; channels <= 100; channels += 15) {
2510 for (size_t pool_size = 3; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2511 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
2512 MaxPoolingOperatorTester()
2513 .batch_size(1)
2514 .input_height(2)
2515 .input_width(input_width)
2516 .padding_tf_same(true)
2517 .pooling_height(1)
2518 .pooling_width(pool_size)
2519 .channels(channels)
2520 .TestF32();
2521 }
2522 }
2523 }
2524 }
2525
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_1xM_pool_with_stride)2526 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_1xM_pool_with_stride) {
2527 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2528 for (size_t channels = 1; channels <= 100; channels += 15) {
2529 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2530 MaxPoolingOperatorTester()
2531 .batch_size(1)
2532 .input_height(2)
2533 .input_width(pool_size + 4)
2534 .pooling_height(1)
2535 .pooling_width(pool_size)
2536 .stride_width(2)
2537 .channels(channels)
2538 .TestF32();
2539 }
2540 }
2541 }
2542
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_1xM_pool_with_dilation)2543 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_1xM_pool_with_dilation) {
2544 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2545 for (size_t channels = 1; channels <= 100; channels += 15) {
2546 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2547 MaxPoolingOperatorTester()
2548 .batch_size(1)
2549 .input_height(2)
2550 .input_width(2 * pool_size + 1)
2551 .padding_left(1)
2552 .padding_right(1)
2553 .pooling_height(1)
2554 .pooling_width(pool_size)
2555 .dilation_width(2)
2556 .channels(channels)
2557 .TestF32();
2558 }
2559 }
2560 }
2561
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_Mx1_pool)2562 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_Mx1_pool) {
2563 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2564 for (size_t channels = 1; channels <= 100; channels += 15) {
2565 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2566 MaxPoolingOperatorTester()
2567 .batch_size(1)
2568 .input_height(pool_size + 1)
2569 .input_width(3)
2570 .pooling_height(pool_size)
2571 .pooling_width(1)
2572 .channels(channels)
2573 .TestF32();
2574 }
2575 }
2576 }
2577
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_Mx1_pool_with_padding)2578 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_Mx1_pool_with_padding) {
2579 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2580 for (size_t channels = 1; channels <= 100; channels += 15) {
2581 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2582 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2583 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2584 MaxPoolingOperatorTester()
2585 .batch_size(1)
2586 .input_height(pool_size + 1)
2587 .input_width(3)
2588 .padding_top(padding_top)
2589 .padding_bottom(padding_bottom)
2590 .pooling_height(pool_size)
2591 .pooling_width(1)
2592 .channels(channels)
2593 .TestF32();
2594 }
2595 }
2596 }
2597 }
2598 }
2599
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_Mx1_pool_with_tf_same_padding)2600 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_Mx1_pool_with_tf_same_padding) {
2601 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2602 for (size_t channels = 1; channels <= 100; channels += 15) {
2603 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2604 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
2605 MaxPoolingOperatorTester()
2606 .batch_size(1)
2607 .input_height(input_height)
2608 .input_width(3)
2609 .padding_tf_same(true)
2610 .pooling_height(pool_size)
2611 .pooling_width(1)
2612 .channels(channels)
2613 .TestF32();
2614 }
2615 }
2616 }
2617 }
2618
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_Mx1_pool_with_stride)2619 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_Mx1_pool_with_stride) {
2620 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2621 for (size_t channels = 1; channels <= 100; channels += 15) {
2622 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2623 MaxPoolingOperatorTester()
2624 .batch_size(1)
2625 .input_height(pool_size + 3)
2626 .input_width(3)
2627 .pooling_height(pool_size)
2628 .pooling_width(1)
2629 .stride_height(2)
2630 .channels(channels)
2631 .TestF32();
2632 }
2633 }
2634 }
2635
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_Mx1_pool_with_dilation)2636 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_Mx1_pool_with_dilation) {
2637 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2638 for (size_t channels = 1; channels <= 100; channels += 15) {
2639 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2640 MaxPoolingOperatorTester()
2641 .batch_size(1)
2642 .input_height(2 * pool_size)
2643 .input_width(3)
2644 .padding_top(1)
2645 .padding_bottom(1)
2646 .pooling_height(pool_size)
2647 .pooling_width(1)
2648 .dilation_height(2)
2649 .channels(channels)
2650 .TestF32();
2651 }
2652 }
2653 }
2654
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_pool_with_input_stride)2655 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_pool_with_input_stride) {
2656 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2657 for (size_t channels = 1; channels <= 100; channels += 15) {
2658 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2659 MaxPoolingOperatorTester()
2660 .batch_size(1)
2661 .input_height(pool_size + 1)
2662 .input_width(3)
2663 .pooling_height(pool_size)
2664 .pooling_width(1)
2665 .channels(channels)
2666 .input_pixel_stride(5 * channels)
2667 .TestF32();
2668 MaxPoolingOperatorTester()
2669 .batch_size(1)
2670 .input_height(2)
2671 .input_width(pool_size + 2)
2672 .pooling_height(1)
2673 .pooling_width(pool_size)
2674 .channels(channels)
2675 .input_pixel_stride(5 * channels)
2676 .TestF32();
2677 }
2678 }
2679 }
2680
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_pool_with_output_stride)2681 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_pool_with_output_stride) {
2682 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2683 for (size_t channels = 1; channels <= 100; channels += 15) {
2684 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2685 MaxPoolingOperatorTester()
2686 .batch_size(1)
2687 .input_height(pool_size + 1)
2688 .input_width(3)
2689 .pooling_height(pool_size)
2690 .pooling_width(1)
2691 .channels(channels)
2692 .output_pixel_stride(5 * channels)
2693 .TestF32();
2694 MaxPoolingOperatorTester()
2695 .batch_size(1)
2696 .input_height(2)
2697 .input_width(pool_size + 2)
2698 .pooling_height(1)
2699 .pooling_width(pool_size)
2700 .channels(channels)
2701 .output_pixel_stride(5 * channels)
2702 .TestF32();
2703 }
2704 }
2705 }
2706
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_pool_with_qmin)2707 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_pool_with_qmin) {
2708 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2709 for (size_t channels = 1; channels <= 100; channels += 15) {
2710 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2711 MaxPoolingOperatorTester()
2712 .batch_size(1)
2713 .input_height(pool_size + 1)
2714 .input_width(3)
2715 .pooling_height(pool_size)
2716 .pooling_width(1)
2717 .channels(channels)
2718 .qmin(192)
2719 .TestF32();
2720 MaxPoolingOperatorTester()
2721 .batch_size(1)
2722 .input_height(2)
2723 .input_width(pool_size + 2)
2724 .pooling_height(1)
2725 .pooling_width(pool_size)
2726 .channels(channels)
2727 .qmin(192)
2728 .TestF32();
2729 }
2730 }
2731 }
2732
TEST(MAX_POOLING_NHWC_F32,unit_batch_small_pool_with_qmax)2733 TEST(MAX_POOLING_NHWC_F32, unit_batch_small_pool_with_qmax) {
2734 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2735 for (size_t channels = 1; channels <= 100; channels += 15) {
2736 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
2737 MaxPoolingOperatorTester()
2738 .batch_size(1)
2739 .input_height(pool_size + 1)
2740 .input_width(3)
2741 .pooling_height(pool_size)
2742 .pooling_width(1)
2743 .channels(channels)
2744 .qmax(192)
2745 .TestF32();
2746 MaxPoolingOperatorTester()
2747 .batch_size(1)
2748 .input_height(2)
2749 .input_width(pool_size + 2)
2750 .pooling_height(1)
2751 .pooling_width(pool_size)
2752 .channels(channels)
2753 .qmax(192)
2754 .TestF32();
2755 }
2756 }
2757 }
2758
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_1xM_pool)2759 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_1xM_pool) {
2760 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2761 for (size_t channels = 1; channels <= 100; channels += 15) {
2762 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2763 MaxPoolingOperatorTester()
2764 .batch_size(1)
2765 .input_height(2)
2766 .input_width(pool_size + 2)
2767 .pooling_height(1)
2768 .pooling_width(pool_size)
2769 .channels(channels)
2770 .TestF32();
2771 }
2772 }
2773 }
2774
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_1xM_pool_with_padding)2775 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_1xM_pool_with_padding) {
2776 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2777 for (size_t channels = 1; channels <= 100; channels += 15) {
2778 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2779 for (size_t padding_left = 0; padding_left <= 1; padding_left++) {
2780 for (size_t padding_right = 0; padding_right <= 1; padding_right++) {
2781 MaxPoolingOperatorTester()
2782 .batch_size(1)
2783 .input_height(2)
2784 .input_width(pool_size + 2)
2785 .padding_left(padding_left)
2786 .padding_right(padding_right)
2787 .pooling_height(1)
2788 .pooling_width(pool_size)
2789 .channels(channels)
2790 .TestF32();
2791 }
2792 }
2793 }
2794 }
2795 }
2796
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_1xM_pool_with_tf_same_padding)2797 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_1xM_pool_with_tf_same_padding) {
2798 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2799 for (size_t channels = 1; channels <= 100; channels += 15) {
2800 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2801 for (size_t input_width = pool_size; input_width <= pool_size * 2; input_width++) {
2802 MaxPoolingOperatorTester()
2803 .batch_size(1)
2804 .input_height(2)
2805 .input_width(input_width)
2806 .padding_tf_same(true)
2807 .pooling_height(1)
2808 .pooling_width(pool_size)
2809 .channels(channels)
2810 .TestF32();
2811 }
2812 }
2813 }
2814 }
2815
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_1xM_pool_with_stride)2816 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_1xM_pool_with_stride) {
2817 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2818 for (size_t channels = 1; channels <= 100; channels += 15) {
2819 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2820 MaxPoolingOperatorTester()
2821 .batch_size(1)
2822 .input_height(2)
2823 .input_width(pool_size + 4)
2824 .pooling_height(1)
2825 .pooling_width(pool_size)
2826 .stride_width(2)
2827 .channels(channels)
2828 .TestF32();
2829 }
2830 }
2831 }
2832
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_1xM_pool_with_dilation)2833 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_1xM_pool_with_dilation) {
2834 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2835 for (size_t channels = 1; channels <= 100; channels += 15) {
2836 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2837 MaxPoolingOperatorTester()
2838 .batch_size(1)
2839 .input_height(2)
2840 .input_width(2 * pool_size + 1)
2841 .padding_left(1)
2842 .padding_right(1)
2843 .pooling_height(1)
2844 .pooling_width(pool_size)
2845 .dilation_width(2)
2846 .channels(channels)
2847 .TestF32();
2848 }
2849 }
2850 }
2851
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_Mx1_pool)2852 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_Mx1_pool) {
2853 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2854 for (size_t channels = 1; channels <= 100; channels += 15) {
2855 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2856 MaxPoolingOperatorTester()
2857 .batch_size(1)
2858 .input_height(pool_size + 1)
2859 .input_width(3)
2860 .pooling_height(pool_size)
2861 .pooling_width(1)
2862 .channels(channels)
2863 .TestF32();
2864 }
2865 }
2866 }
2867
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_Mx1_pool_with_padding)2868 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_Mx1_pool_with_padding) {
2869 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2870 for (size_t channels = 1; channels <= 100; channels += 15) {
2871 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2872 for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2873 for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2874 MaxPoolingOperatorTester()
2875 .batch_size(1)
2876 .input_height(pool_size + 1)
2877 .input_width(3)
2878 .padding_top(padding_top)
2879 .padding_bottom(padding_bottom)
2880 .pooling_height(pool_size)
2881 .pooling_width(1)
2882 .channels(channels)
2883 .TestF32();
2884 }
2885 }
2886 }
2887 }
2888 }
2889
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_Mx1_pool_with_tf_same_padding)2890 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_Mx1_pool_with_tf_same_padding) {
2891 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2892 for (size_t channels = 1; channels <= 100; channels += 15) {
2893 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2894 for (size_t input_height = pool_size; input_height <= pool_size * 2; input_height++) {
2895 MaxPoolingOperatorTester()
2896 .batch_size(1)
2897 .input_height(input_height)
2898 .input_width(3)
2899 .padding_tf_same(true)
2900 .pooling_height(pool_size)
2901 .pooling_width(1)
2902 .channels(channels)
2903 .TestF32();
2904 }
2905 }
2906 }
2907 }
2908
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_Mx1_pool_with_stride)2909 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_Mx1_pool_with_stride) {
2910 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2911 for (size_t channels = 1; channels <= 100; channels += 15) {
2912 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2913 MaxPoolingOperatorTester()
2914 .batch_size(1)
2915 .input_height(pool_size + 3)
2916 .input_width(3)
2917 .pooling_height(pool_size)
2918 .pooling_width(1)
2919 .stride_height(2)
2920 .channels(channels)
2921 .TestF32();
2922 }
2923 }
2924 }
2925
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_Mx1_pool_with_dilation)2926 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_Mx1_pool_with_dilation) {
2927 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2928 for (size_t channels = 1; channels <= 100; channels += 15) {
2929 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2930 MaxPoolingOperatorTester()
2931 .batch_size(1)
2932 .input_height(2 * pool_size)
2933 .input_width(3)
2934 .padding_top(1)
2935 .padding_bottom(1)
2936 .pooling_height(pool_size)
2937 .pooling_width(1)
2938 .dilation_height(2)
2939 .channels(channels)
2940 .TestF32();
2941 }
2942 }
2943 }
2944
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_pool_with_input_stride)2945 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_pool_with_input_stride) {
2946 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2947 for (size_t channels = 1; channels <= 100; channels += 15) {
2948 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2949 MaxPoolingOperatorTester()
2950 .batch_size(1)
2951 .input_height(pool_size + 1)
2952 .input_width(3)
2953 .pooling_height(pool_size)
2954 .pooling_width(1)
2955 .channels(channels)
2956 .input_pixel_stride(5 * channels)
2957 .TestF32();
2958 MaxPoolingOperatorTester()
2959 .batch_size(1)
2960 .input_height(2)
2961 .input_width(pool_size + 2)
2962 .pooling_height(1)
2963 .pooling_width(pool_size)
2964 .channels(channels)
2965 .input_pixel_stride(5 * channels)
2966 .TestF32();
2967 }
2968 }
2969 }
2970
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_pool_with_output_stride)2971 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_pool_with_output_stride) {
2972 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2973 for (size_t channels = 1; channels <= 100; channels += 15) {
2974 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
2975 MaxPoolingOperatorTester()
2976 .batch_size(1)
2977 .input_height(pool_size + 1)
2978 .input_width(3)
2979 .pooling_height(pool_size)
2980 .pooling_width(1)
2981 .channels(channels)
2982 .output_pixel_stride(5 * channels)
2983 .TestF32();
2984 MaxPoolingOperatorTester()
2985 .batch_size(1)
2986 .input_height(2)
2987 .input_width(pool_size + 2)
2988 .pooling_height(1)
2989 .pooling_width(pool_size)
2990 .channels(channels)
2991 .output_pixel_stride(5 * channels)
2992 .TestF32();
2993 }
2994 }
2995 }
2996
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_pool_with_qmin)2997 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_pool_with_qmin) {
2998 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
2999 for (size_t channels = 1; channels <= 100; channels += 15) {
3000 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
3001 MaxPoolingOperatorTester()
3002 .batch_size(1)
3003 .input_height(pool_size + 1)
3004 .input_width(3)
3005 .pooling_height(pool_size)
3006 .pooling_width(1)
3007 .channels(channels)
3008 .qmin(192)
3009 .TestF32();
3010 MaxPoolingOperatorTester()
3011 .batch_size(1)
3012 .input_height(2)
3013 .input_width(pool_size + 2)
3014 .pooling_height(1)
3015 .pooling_width(pool_size)
3016 .channels(channels)
3017 .qmin(192)
3018 .TestF32();
3019 }
3020 }
3021 }
3022
TEST(MAX_POOLING_NHWC_F32,unit_batch_large_pool_with_qmax)3023 TEST(MAX_POOLING_NHWC_F32, unit_batch_large_pool_with_qmax) {
3024 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3025 for (size_t channels = 1; channels <= 100; channels += 15) {
3026 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
3027 MaxPoolingOperatorTester()
3028 .batch_size(1)
3029 .input_height(pool_size + 1)
3030 .input_width(3)
3031 .pooling_height(pool_size)
3032 .pooling_width(1)
3033 .channels(channels)
3034 .qmax(192)
3035 .TestF32();
3036 MaxPoolingOperatorTester()
3037 .batch_size(1)
3038 .input_height(2)
3039 .input_width(pool_size + 2)
3040 .pooling_height(1)
3041 .pooling_width(pool_size)
3042 .channels(channels)
3043 .qmax(192)
3044 .TestF32();
3045 }
3046 }
3047 }
3048
TEST(MAX_POOLING_NHWC_F32,small_batch_small_pool)3049 TEST(MAX_POOLING_NHWC_F32, small_batch_small_pool) {
3050 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3051 for (size_t channels = 1; channels <= 100; channels += 15) {
3052 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
3053 MaxPoolingOperatorTester()
3054 .batch_size(3)
3055 .input_height(pool_size + 1)
3056 .input_width(3)
3057 .pooling_height(pool_size)
3058 .pooling_width(1)
3059 .channels(channels)
3060 .TestF32();
3061 MaxPoolingOperatorTester()
3062 .batch_size(3)
3063 .input_height(2)
3064 .input_width(pool_size + 2)
3065 .pooling_height(1)
3066 .pooling_width(pool_size)
3067 .channels(channels)
3068 .TestF32();
3069 }
3070 }
3071 }
3072
TEST(MAX_POOLING_NHWC_F32,small_batch_small_pool_with_input_stride)3073 TEST(MAX_POOLING_NHWC_F32, small_batch_small_pool_with_input_stride) {
3074 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3075 for (size_t channels = 1; channels <= 100; channels += 15) {
3076 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
3077 MaxPoolingOperatorTester()
3078 .batch_size(3)
3079 .input_height(pool_size + 1)
3080 .input_width(3)
3081 .pooling_height(pool_size)
3082 .pooling_width(1)
3083 .channels(channels)
3084 .input_pixel_stride(5 * channels)
3085 .TestF32();
3086 MaxPoolingOperatorTester()
3087 .batch_size(3)
3088 .input_height(2)
3089 .input_width(pool_size + 2)
3090 .pooling_height(1)
3091 .pooling_width(pool_size)
3092 .channels(channels)
3093 .input_pixel_stride(5 * channels)
3094 .TestF32();
3095 }
3096 }
3097 }
3098
TEST(MAX_POOLING_NHWC_F32,small_batch_small_pool_with_output_stride)3099 TEST(MAX_POOLING_NHWC_F32, small_batch_small_pool_with_output_stride) {
3100 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3101 for (size_t channels = 1; channels <= 100; channels += 15) {
3102 for (size_t pool_size = 2; pool_size <= xnn_params.f32.maxpool.mr; pool_size++) {
3103 MaxPoolingOperatorTester()
3104 .batch_size(3)
3105 .input_height(pool_size + 1)
3106 .input_width(3)
3107 .pooling_height(pool_size)
3108 .pooling_width(1)
3109 .channels(channels)
3110 .output_pixel_stride(5 * channels)
3111 .TestF32();
3112 MaxPoolingOperatorTester()
3113 .batch_size(3)
3114 .input_height(2)
3115 .input_width(pool_size + 2)
3116 .pooling_height(1)
3117 .pooling_width(pool_size)
3118 .channels(channels)
3119 .output_pixel_stride(5 * channels)
3120 .TestF32();
3121 }
3122 }
3123 }
3124
TEST(MAX_POOLING_NHWC_F32,small_batch_large_pool)3125 TEST(MAX_POOLING_NHWC_F32, small_batch_large_pool) {
3126 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3127 for (size_t channels = 1; channels <= 100; channels += 15) {
3128 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
3129 MaxPoolingOperatorTester()
3130 .batch_size(3)
3131 .input_height(pool_size + 1)
3132 .input_width(3)
3133 .pooling_height(pool_size)
3134 .pooling_width(1)
3135 .channels(channels)
3136 .TestF32();
3137 MaxPoolingOperatorTester()
3138 .batch_size(3)
3139 .input_height(2)
3140 .input_width(pool_size + 2)
3141 .pooling_height(1)
3142 .pooling_width(pool_size)
3143 .channels(channels)
3144 .TestF32();
3145 }
3146 }
3147 }
3148
TEST(MAX_POOLING_NHWC_F32,small_batch_large_pool_with_input_stride)3149 TEST(MAX_POOLING_NHWC_F32, small_batch_large_pool_with_input_stride) {
3150 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3151 for (size_t channels = 1; channels <= 100; channels += 15) {
3152 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
3153 MaxPoolingOperatorTester()
3154 .batch_size(3)
3155 .input_height(pool_size + 1)
3156 .input_width(3)
3157 .pooling_height(pool_size)
3158 .pooling_width(1)
3159 .channels(channels)
3160 .input_pixel_stride(5 * channels)
3161 .TestF32();
3162 MaxPoolingOperatorTester()
3163 .batch_size(3)
3164 .input_height(2)
3165 .input_width(pool_size + 2)
3166 .pooling_height(1)
3167 .pooling_width(pool_size)
3168 .channels(channels)
3169 .input_pixel_stride(5 * channels)
3170 .TestF32();
3171 }
3172 }
3173 }
3174
TEST(MAX_POOLING_NHWC_F32,small_batch_large_pool_with_output_stride)3175 TEST(MAX_POOLING_NHWC_F32, small_batch_large_pool_with_output_stride) {
3176 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3177 for (size_t channels = 1; channels <= 100; channels += 15) {
3178 for (size_t pool_size = xnn_params.f32.maxpool.mr + 1; pool_size <= xnn_params.f32.maxpool.mr + xnn_params.f32.maxpool.qr; pool_size++) {
3179 MaxPoolingOperatorTester()
3180 .batch_size(3)
3181 .input_height(pool_size + 1)
3182 .input_width(3)
3183 .pooling_height(pool_size)
3184 .pooling_width(1)
3185 .channels(channels)
3186 .output_pixel_stride(5 * channels)
3187 .TestF32();
3188 MaxPoolingOperatorTester()
3189 .batch_size(3)
3190 .input_height(2)
3191 .input_width(pool_size + 2)
3192 .pooling_height(1)
3193 .pooling_width(pool_size)
3194 .channels(channels)
3195 .output_pixel_stride(5 * channels)
3196 .TestF32();
3197 }
3198 }
3199 }
3200
TEST(MAX_POOLING_NHWC_F32,setup_increasing_batch)3201 TEST(MAX_POOLING_NHWC_F32, setup_increasing_batch) {
3202 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3203 MaxPoolingOperatorTester()
3204 .batch_size(3)
3205 .next_batch_size(5)
3206 .input_height(8)
3207 .input_width(8)
3208 .pooling_height(5)
3209 .pooling_width(3)
3210 .channels(24)
3211 .TestSetupF32();
3212 }
3213
TEST(MAX_POOLING_NHWC_F32,setup_decreasing_batch)3214 TEST(MAX_POOLING_NHWC_F32, setup_decreasing_batch) {
3215 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3216 MaxPoolingOperatorTester()
3217 .batch_size(5)
3218 .next_batch_size(3)
3219 .input_height(8)
3220 .input_width(8)
3221 .pooling_height(5)
3222 .pooling_width(3)
3223 .channels(24)
3224 .TestSetupF32();
3225 }
3226
TEST(MAX_POOLING_NHWC_F32,setup_changing_height)3227 TEST(MAX_POOLING_NHWC_F32, setup_changing_height) {
3228 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3229 MaxPoolingOperatorTester()
3230 .batch_size(3)
3231 .input_height(8)
3232 .input_width(8)
3233 .next_input_height(9)
3234 .pooling_height(5)
3235 .pooling_width(3)
3236 .channels(24)
3237 .TestSetupF32();
3238 MaxPoolingOperatorTester()
3239 .batch_size(3)
3240 .input_height(8)
3241 .input_width(8)
3242 .next_input_height(7)
3243 .pooling_height(5)
3244 .pooling_width(3)
3245 .channels(24)
3246 .TestSetupF32();
3247 }
3248
TEST(MAX_POOLING_NHWC_F32,setup_changing_width)3249 TEST(MAX_POOLING_NHWC_F32, setup_changing_width) {
3250 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3251 MaxPoolingOperatorTester()
3252 .batch_size(3)
3253 .input_height(8)
3254 .input_width(8)
3255 .next_input_width(9)
3256 .pooling_height(5)
3257 .pooling_width(3)
3258 .channels(24)
3259 .TestSetupF32();
3260 MaxPoolingOperatorTester()
3261 .batch_size(3)
3262 .input_height(8)
3263 .input_width(8)
3264 .next_input_width(7)
3265 .pooling_height(5)
3266 .pooling_width(3)
3267 .channels(24)
3268 .TestSetupF32();
3269 }
3270
TEST(MAX_POOLING_NHWC_F32,setup_swap_height_and_width)3271 TEST(MAX_POOLING_NHWC_F32, setup_swap_height_and_width) {
3272 ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
3273 MaxPoolingOperatorTester()
3274 .batch_size(3)
3275 .input_height(9)
3276 .input_width(8)
3277 .next_input_height(8)
3278 .next_input_width(9)
3279 .pooling_height(5)
3280 .pooling_width(3)
3281 .channels(24)
3282 .TestSetupF32();
3283 }
3284