xref: /aosp_15_r20/external/XNNPACK/test/global-average-pooling-nwc.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
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 <algorithm>
10 #include <cstddef>
11 #include <cstdint>
12 
13 #include <gtest/gtest.h>
14 
15 #include "global-average-pooling-operator-tester.h"
16 
17 #include <xnnpack/params.h>
18 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width)19 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width) {
20   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
21   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
22   for (size_t channels = 1; channels <= 100; channels += 15) {
23     for (size_t width = 1; width <= spatial_tile; width++) {
24       GlobalAveragePoolingOperatorTester()
25         .batch_size(1)
26         .width(width)
27         .channels(channels)
28         .TestNWCxQU8();
29     }
30   }
31 }
32 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_input_stride)33 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_input_stride) {
34   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
35   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
36   for (size_t channels = 1; channels <= 100; channels += 15) {
37     for (size_t width = 1; width <= spatial_tile; width++) {
38       GlobalAveragePoolingOperatorTester()
39         .batch_size(1)
40         .width(width)
41         .channels(channels)
42         .input_stride(5 * channels)
43         .TestNWCxQU8();
44     }
45   }
46 }
47 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_input_scale)48 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_input_scale) {
49   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
50   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
51   for (size_t channels = 1; channels <= 100; channels += 15) {
52     for (size_t width = 1; width <= spatial_tile; width++) {
53       for (float input_scale = 0.01f; input_scale < 100.0f; input_scale *= 3.14159265f) {
54         GlobalAveragePoolingOperatorTester()
55           .batch_size(1)
56           .width(width)
57           .channels(channels)
58           .input_scale(input_scale)
59           .TestNWCxQU8();
60       }
61     }
62   }
63 }
64 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_input_zero_point)65 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_input_zero_point) {
66   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
67   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
68   for (size_t channels = 1; channels <= 100; channels += 15) {
69     for (size_t width = 1; width <= spatial_tile; width++) {
70       for (int32_t input_zero_point = 0; input_zero_point <= 255; input_zero_point += 51) {
71         GlobalAveragePoolingOperatorTester()
72           .batch_size(1)
73           .width(width)
74           .channels(channels)
75           .input_zero_point(uint8_t(input_zero_point))
76           .TestNWCxQU8();
77       }
78     }
79   }
80 }
81 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_output_scale)82 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_output_scale) {
83   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
84   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
85   for (size_t channels = 1; channels <= 100; channels += 15) {
86     for (size_t width = 1; width <= spatial_tile; width++) {
87       for (float output_scale = 0.01f; output_scale < 100.0f; output_scale *= 3.14159265f) {
88         GlobalAveragePoolingOperatorTester()
89           .batch_size(1)
90           .width(width)
91           .channels(channels)
92           .output_scale(output_scale)
93           .TestNWCxQU8();
94       }
95     }
96   }
97 }
98 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_output_zero_point)99 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_output_zero_point) {
100   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
101   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
102   for (size_t channels = 1; channels <= 100; channels += 15) {
103     for (size_t width = 1; width <= spatial_tile; width++) {
104       for (int32_t output_zero_point = 0; output_zero_point <= 255; output_zero_point += 51) {
105         GlobalAveragePoolingOperatorTester()
106           .batch_size(1)
107           .width(width)
108           .channels(channels)
109           .output_zero_point(uint8_t(output_zero_point))
110           .TestNWCxQU8();
111       }
112     }
113   }
114 }
115 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_qmin)116 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_qmin) {
117   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
118   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
119   for (size_t channels = 1; channels <= 100; channels += 15) {
120     for (size_t width = 1; width <= spatial_tile; width++) {
121       GlobalAveragePoolingOperatorTester()
122         .batch_size(1)
123         .width(width)
124         .channels(channels)
125         .qmin(128)
126         .TestNWCxQU8();
127     }
128   }
129 }
130 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_small_width_with_qmax)131 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_small_width_with_qmax) {
132   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
133   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
134   for (size_t channels = 1; channels <= 100; channels += 15) {
135     for (size_t width = 1; width <= spatial_tile; width++) {
136       GlobalAveragePoolingOperatorTester()
137         .batch_size(1)
138         .width(width)
139         .channels(channels)
140         .qmax(128)
141         .TestNWCxQU8();
142     }
143   }
144 }
145 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width)146 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width) {
147   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
148   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
149   for (size_t channels = 1; channels <= 100; channels += 15) {
150     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
151       GlobalAveragePoolingOperatorTester()
152         .batch_size(1)
153         .width(width)
154         .channels(channels)
155         .TestNWCxQU8();
156     }
157   }
158 }
159 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_input_stride)160 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_input_stride) {
161   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
162   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
163   for (size_t channels = 1; channels <= 100; channels += 15) {
164     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
165       GlobalAveragePoolingOperatorTester()
166         .batch_size(1)
167         .width(width)
168         .channels(channels)
169         .input_stride(5 * channels)
170         .TestNWCxQU8();
171     }
172   }
173 }
174 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_input_scale)175 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_input_scale) {
176   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
177   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
178   for (size_t channels = 1; channels <= 100; channels += 15) {
179     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
180       for (float input_scale = 0.01f; input_scale < 100.0f; input_scale *= 3.14159265f) {
181         GlobalAveragePoolingOperatorTester()
182           .batch_size(1)
183           .width(width)
184           .channels(channels)
185           .input_scale(input_scale)
186           .TestNWCxQU8();
187       }
188     }
189   }
190 }
191 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_input_zero_point)192 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_input_zero_point) {
193   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
194   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
195   for (size_t channels = 1; channels <= 100; channels += 15) {
196     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
197       for (int32_t input_zero_point = 0; input_zero_point <= 255; input_zero_point += 51) {
198         GlobalAveragePoolingOperatorTester()
199           .batch_size(1)
200           .width(width)
201           .channels(channels)
202           .input_zero_point(uint8_t(input_zero_point))
203           .TestNWCxQU8();
204       }
205     }
206   }
207 }
208 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_output_scale)209 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_output_scale) {
210   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
211   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
212   for (size_t channels = 1; channels <= 100; channels += 15) {
213     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
214       for (float output_scale = 0.01f; output_scale < 100.0f; output_scale *= 3.14159265f) {
215         GlobalAveragePoolingOperatorTester()
216           .batch_size(1)
217           .width(width)
218           .channels(channels)
219           .output_scale(output_scale)
220           .TestNWCxQU8();
221       }
222     }
223   }
224 }
225 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_output_zero_point)226 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_output_zero_point) {
227   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
228   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
229   for (size_t channels = 1; channels <= 100; channels += 15) {
230     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
231       for (int32_t output_zero_point = 0; output_zero_point <= 255; output_zero_point += 51) {
232         GlobalAveragePoolingOperatorTester()
233           .batch_size(1)
234           .width(width)
235           .channels(channels)
236           .output_zero_point(uint8_t(output_zero_point))
237           .TestNWCxQU8();
238       }
239     }
240   }
241 }
242 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_qmin)243 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_qmin) {
244   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
245   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
246   for (size_t channels = 1; channels <= 100; channels += 15) {
247     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
248       GlobalAveragePoolingOperatorTester()
249         .batch_size(1)
250         .width(width)
251         .channels(channels)
252         .qmin(128)
253         .TestNWCxQU8();
254     }
255   }
256 }
257 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,unit_batch_large_width_with_qmax)258 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, unit_batch_large_width_with_qmax) {
259   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
260   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
261   for (size_t channels = 1; channels <= 100; channels += 15) {
262     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
263       GlobalAveragePoolingOperatorTester()
264         .batch_size(1)
265         .width(width)
266         .channels(channels)
267         .qmax(128)
268         .TestNWCxQU8();
269     }
270   }
271 }
272 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_small_width)273 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_small_width) {
274   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
275   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
276   for (size_t channels = 1; channels <= 100; channels += 15) {
277     for (size_t width = 1; width <= spatial_tile; width++) {
278       GlobalAveragePoolingOperatorTester()
279         .batch_size(3)
280         .width(width)
281         .channels(channels)
282         .TestNWCxQU8();
283     }
284   }
285 }
286 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_small_width_with_input_stride)287 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_small_width_with_input_stride) {
288   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
289   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
290   for (size_t channels = 1; channels <= 100; channels += 15) {
291     for (size_t width = 1; width <= spatial_tile; width++) {
292       GlobalAveragePoolingOperatorTester()
293         .batch_size(3)
294         .width(width)
295         .channels(channels)
296         .input_stride(5 * channels)
297         .TestNWCxQU8();
298     }
299   }
300 }
301 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_small_width_with_output_stride)302 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_small_width_with_output_stride) {
303   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
304   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
305   for (size_t channels = 1; channels <= 100; channels += 15) {
306     for (size_t width = 1; width <= spatial_tile; width++) {
307       GlobalAveragePoolingOperatorTester()
308         .batch_size(3)
309         .width(width)
310         .channels(channels)
311         .output_stride(5 * channels)
312         .TestNWCxQU8();
313     }
314   }
315 }
316 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_large_width)317 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_large_width) {
318   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
319   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
320   for (size_t channels = 1; channels <= 100; channels += 15) {
321     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
322       GlobalAveragePoolingOperatorTester()
323         .batch_size(3)
324         .width(width)
325         .channels(channels)
326         .TestNWCxQU8();
327     }
328   }
329 }
330 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_large_width_with_input_stride)331 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_large_width_with_input_stride) {
332   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
333   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
334   for (size_t channels = 1; channels <= 100; channels += 15) {
335     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
336       GlobalAveragePoolingOperatorTester()
337         .batch_size(3)
338         .width(width)
339         .channels(channels)
340         .input_stride(5 * channels)
341         .TestNWCxQU8();
342     }
343   }
344 }
345 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8,small_batch_large_width_with_output_stride)346 TEST(GLOBAL_AVERAGE_POOLING_NWC_QU8, small_batch_large_width_with_output_stride) {
347   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
348   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qu8.gavgpool.row_tile, 1);
349   for (size_t channels = 1; channels <= 100; channels += 15) {
350     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
351       GlobalAveragePoolingOperatorTester()
352         .batch_size(3)
353         .width(width)
354         .channels(channels)
355         .output_stride(5 * channels)
356         .TestNWCxQU8();
357     }
358   }
359 }
360 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width)361 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width) {
362   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
363   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
364   for (size_t channels = 1; channels <= 100; channels += 15) {
365     for (size_t width = 1; width <= spatial_tile; width++) {
366       GlobalAveragePoolingOperatorTester()
367         .batch_size(1)
368         .width(width)
369         .channels(channels)
370         .TestNWCxQS8();
371     }
372   }
373 }
374 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_input_stride)375 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_input_stride) {
376   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
377   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
378   for (size_t channels = 1; channels <= 100; channels += 15) {
379     for (size_t width = 1; width <= spatial_tile; width++) {
380       GlobalAveragePoolingOperatorTester()
381         .batch_size(1)
382         .width(width)
383         .channels(channels)
384         .input_stride(5 * channels)
385         .TestNWCxQS8();
386     }
387   }
388 }
389 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_input_scale)390 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_input_scale) {
391   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
392   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
393   for (size_t channels = 1; channels <= 100; channels += 15) {
394     for (size_t width = 1; width <= spatial_tile; width++) {
395       for (float input_scale = 0.01f; input_scale < 100.0f; input_scale *= 3.14159265f) {
396         GlobalAveragePoolingOperatorTester()
397           .batch_size(1)
398           .width(width)
399           .channels(channels)
400           .input_scale(input_scale)
401           .TestNWCxQS8();
402       }
403     }
404   }
405 }
406 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_input_zero_point)407 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_input_zero_point) {
408   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
409   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
410   for (size_t channels = 1; channels <= 100; channels += 15) {
411     for (size_t width = 1; width <= spatial_tile; width++) {
412       for (int32_t input_zero_point = 0; input_zero_point <= 255; input_zero_point += 51) {
413         GlobalAveragePoolingOperatorTester()
414           .batch_size(1)
415           .width(width)
416           .channels(channels)
417           .input_zero_point(uint8_t(input_zero_point))
418           .TestNWCxQS8();
419       }
420     }
421   }
422 }
423 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_output_scale)424 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_output_scale) {
425   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
426   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
427   for (size_t channels = 1; channels <= 100; channels += 15) {
428     for (size_t width = 1; width <= spatial_tile; width++) {
429       for (float output_scale = 0.01f; output_scale < 100.0f; output_scale *= 3.14159265f) {
430         GlobalAveragePoolingOperatorTester()
431           .batch_size(1)
432           .width(width)
433           .channels(channels)
434           .output_scale(output_scale)
435           .TestNWCxQS8();
436       }
437     }
438   }
439 }
440 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_output_zero_point)441 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_output_zero_point) {
442   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
443   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
444   for (size_t channels = 1; channels <= 100; channels += 15) {
445     for (size_t width = 1; width <= spatial_tile; width++) {
446       for (int32_t output_zero_point = 0; output_zero_point <= 255; output_zero_point += 51) {
447         GlobalAveragePoolingOperatorTester()
448           .batch_size(1)
449           .width(width)
450           .channels(channels)
451           .output_zero_point(uint8_t(output_zero_point))
452           .TestNWCxQS8();
453       }
454     }
455   }
456 }
457 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_qmin)458 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_qmin) {
459   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
460   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
461   for (size_t channels = 1; channels <= 100; channels += 15) {
462     for (size_t width = 1; width <= spatial_tile; width++) {
463       GlobalAveragePoolingOperatorTester()
464         .batch_size(1)
465         .width(width)
466         .channels(channels)
467         .qmin(128)
468         .TestNWCxQS8();
469     }
470   }
471 }
472 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_small_width_with_qmax)473 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_small_width_with_qmax) {
474   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
475   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
476   for (size_t channels = 1; channels <= 100; channels += 15) {
477     for (size_t width = 1; width <= spatial_tile; width++) {
478       GlobalAveragePoolingOperatorTester()
479         .batch_size(1)
480         .width(width)
481         .channels(channels)
482         .qmax(128)
483         .TestNWCxQS8();
484     }
485   }
486 }
487 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width)488 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width) {
489   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
490   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
491   for (size_t channels = 1; channels <= 100; channels += 15) {
492     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
493       GlobalAveragePoolingOperatorTester()
494         .batch_size(1)
495         .width(width)
496         .channels(channels)
497         .TestNWCxQS8();
498     }
499   }
500 }
501 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_input_stride)502 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_input_stride) {
503   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
504   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
505   for (size_t channels = 1; channels <= 100; channels += 15) {
506     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
507       GlobalAveragePoolingOperatorTester()
508         .batch_size(1)
509         .width(width)
510         .channels(channels)
511         .input_stride(5 * channels)
512         .TestNWCxQS8();
513     }
514   }
515 }
516 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_input_scale)517 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_input_scale) {
518   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
519   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
520   for (size_t channels = 1; channels <= 100; channels += 15) {
521     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
522       for (float input_scale = 0.01f; input_scale < 100.0f; input_scale *= 3.14159265f) {
523         GlobalAveragePoolingOperatorTester()
524           .batch_size(1)
525           .width(width)
526           .channels(channels)
527           .input_scale(input_scale)
528           .TestNWCxQS8();
529       }
530     }
531   }
532 }
533 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_input_zero_point)534 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_input_zero_point) {
535   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
536   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
537   for (size_t channels = 1; channels <= 100; channels += 15) {
538     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
539       for (int32_t input_zero_point = 0; input_zero_point <= 255; input_zero_point += 51) {
540         GlobalAveragePoolingOperatorTester()
541           .batch_size(1)
542           .width(width)
543           .channels(channels)
544           .input_zero_point(uint8_t(input_zero_point))
545           .TestNWCxQS8();
546       }
547     }
548   }
549 }
550 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_output_scale)551 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_output_scale) {
552   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
553   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
554   for (size_t channels = 1; channels <= 100; channels += 15) {
555     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
556       for (float output_scale = 0.01f; output_scale < 100.0f; output_scale *= 3.14159265f) {
557         GlobalAveragePoolingOperatorTester()
558           .batch_size(1)
559           .width(width)
560           .channels(channels)
561           .output_scale(output_scale)
562           .TestNWCxQS8();
563       }
564     }
565   }
566 }
567 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_output_zero_point)568 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_output_zero_point) {
569   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
570   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
571   for (size_t channels = 1; channels <= 100; channels += 15) {
572     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
573       for (int32_t output_zero_point = 0; output_zero_point <= 255; output_zero_point += 51) {
574         GlobalAveragePoolingOperatorTester()
575           .batch_size(1)
576           .width(width)
577           .channels(channels)
578           .output_zero_point(uint8_t(output_zero_point))
579           .TestNWCxQS8();
580       }
581     }
582   }
583 }
584 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_qmin)585 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_qmin) {
586   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
587   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
588   for (size_t channels = 1; channels <= 100; channels += 15) {
589     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
590       GlobalAveragePoolingOperatorTester()
591         .batch_size(1)
592         .width(width)
593         .channels(channels)
594         .qmin(128)
595         .TestNWCxQS8();
596     }
597   }
598 }
599 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,unit_batch_large_width_with_qmax)600 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, unit_batch_large_width_with_qmax) {
601   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
602   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
603   for (size_t channels = 1; channels <= 100; channels += 15) {
604     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
605       GlobalAveragePoolingOperatorTester()
606         .batch_size(1)
607         .width(width)
608         .channels(channels)
609         .qmax(128)
610         .TestNWCxQS8();
611     }
612   }
613 }
614 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_small_width)615 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_small_width) {
616   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
617   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
618   for (size_t channels = 1; channels <= 100; channels += 15) {
619     for (size_t width = 1; width <= spatial_tile; width++) {
620       GlobalAveragePoolingOperatorTester()
621         .batch_size(3)
622         .width(width)
623         .channels(channels)
624         .TestNWCxQS8();
625     }
626   }
627 }
628 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_small_width_with_input_stride)629 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_small_width_with_input_stride) {
630   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
631   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
632   for (size_t channels = 1; channels <= 100; channels += 15) {
633     for (size_t width = 1; width <= spatial_tile; width++) {
634       GlobalAveragePoolingOperatorTester()
635         .batch_size(3)
636         .width(width)
637         .channels(channels)
638         .input_stride(5 * channels)
639         .TestNWCxQS8();
640     }
641   }
642 }
643 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_small_width_with_output_stride)644 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_small_width_with_output_stride) {
645   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
646   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
647   for (size_t channels = 1; channels <= 100; channels += 15) {
648     for (size_t width = 1; width <= spatial_tile; width++) {
649       GlobalAveragePoolingOperatorTester()
650         .batch_size(3)
651         .width(width)
652         .channels(channels)
653         .output_stride(5 * channels)
654         .TestNWCxQS8();
655     }
656   }
657 }
658 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_large_width)659 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_large_width) {
660   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
661   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
662   for (size_t channels = 1; channels <= 100; channels += 15) {
663     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
664       GlobalAveragePoolingOperatorTester()
665         .batch_size(3)
666         .width(width)
667         .channels(channels)
668         .TestNWCxQS8();
669     }
670   }
671 }
672 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_large_width_with_input_stride)673 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_large_width_with_input_stride) {
674   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
675   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
676   for (size_t channels = 1; channels <= 100; channels += 15) {
677     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
678       GlobalAveragePoolingOperatorTester()
679         .batch_size(3)
680         .width(width)
681         .channels(channels)
682         .input_stride(5 * channels)
683         .TestNWCxQS8();
684     }
685   }
686 }
687 
TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8,small_batch_large_width_with_output_stride)688 TEST(GLOBAL_AVERAGE_POOLING_NWC_QS8, small_batch_large_width_with_output_stride) {
689   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
690   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.qs8.gavgpool.row_tile, 1);
691   for (size_t channels = 1; channels <= 100; channels += 15) {
692     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
693       GlobalAveragePoolingOperatorTester()
694         .batch_size(3)
695         .width(width)
696         .channels(channels)
697         .output_stride(5 * channels)
698         .TestNWCxQS8();
699     }
700   }
701 }
702 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_small_width)703 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_small_width) {
704   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
705   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
706   for (size_t channels = 1; channels <= 100; channels += 15) {
707     for (size_t width = 1; width <= spatial_tile; width++) {
708       GlobalAveragePoolingOperatorTester()
709         .batch_size(1)
710         .width(width)
711         .channels(channels)
712         .TestNWCxF16();
713     }
714   }
715 }
716 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_small_width_with_input_stride)717 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_small_width_with_input_stride) {
718   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
719   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
720   for (size_t channels = 1; channels <= 100; channels += 15) {
721     for (size_t width = 1; width <= spatial_tile; width++) {
722       GlobalAveragePoolingOperatorTester()
723         .batch_size(1)
724         .width(width)
725         .channels(channels)
726         .input_stride(5 * channels)
727         .TestNWCxF16();
728     }
729   }
730 }
731 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_small_width_with_qmin)732 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_small_width_with_qmin) {
733   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
734   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
735   for (size_t channels = 1; channels <= 100; channels += 15) {
736     for (size_t width = 1; width <= spatial_tile; width++) {
737       GlobalAveragePoolingOperatorTester()
738         .batch_size(1)
739         .width(width)
740         .channels(channels)
741         .qmin(128)
742         .TestNWCxF16();
743     }
744   }
745 }
746 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_small_width_with_qmax)747 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_small_width_with_qmax) {
748   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
749   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
750   for (size_t channels = 1; channels <= 100; channels += 15) {
751     for (size_t width = 1; width <= spatial_tile; width++) {
752       GlobalAveragePoolingOperatorTester()
753         .batch_size(1)
754         .width(width)
755         .channels(channels)
756         .qmax(128)
757         .TestNWCxF16();
758     }
759   }
760 }
761 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_large_width)762 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_large_width) {
763   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
764   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
765   for (size_t channels = 1; channels <= 100; channels += 15) {
766     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
767       GlobalAveragePoolingOperatorTester()
768         .batch_size(1)
769         .width(width)
770         .channels(channels)
771         .TestNWCxF16();
772     }
773   }
774 }
775 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_large_width_with_input_stride)776 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_large_width_with_input_stride) {
777   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
778   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
779   for (size_t channels = 1; channels <= 100; channels += 15) {
780     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
781       GlobalAveragePoolingOperatorTester()
782         .batch_size(1)
783         .width(width)
784         .channels(channels)
785         .input_stride(5 * channels)
786         .TestNWCxF16();
787     }
788   }
789 }
790 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_large_width_with_qmin)791 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_large_width_with_qmin) {
792   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
793   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
794   for (size_t channels = 1; channels <= 100; channels += 15) {
795     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
796       GlobalAveragePoolingOperatorTester()
797         .batch_size(1)
798         .width(width)
799         .channels(channels)
800         .qmin(128)
801         .TestNWCxF16();
802     }
803   }
804 }
805 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,unit_batch_large_width_with_qmax)806 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, unit_batch_large_width_with_qmax) {
807   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
808   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
809   for (size_t channels = 1; channels <= 100; channels += 15) {
810     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
811       GlobalAveragePoolingOperatorTester()
812         .batch_size(1)
813         .width(width)
814         .channels(channels)
815         .qmax(128)
816         .TestNWCxF16();
817     }
818   }
819 }
820 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_small_width)821 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_small_width) {
822   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
823   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
824   for (size_t channels = 1; channels <= 100; channels += 15) {
825     for (size_t width = 1; width <= spatial_tile; width++) {
826       GlobalAveragePoolingOperatorTester()
827         .batch_size(3)
828         .width(width)
829         .channels(channels)
830         .TestNWCxF16();
831     }
832   }
833 }
834 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_small_width_with_input_stride)835 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_small_width_with_input_stride) {
836   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
837   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
838   for (size_t channels = 1; channels <= 100; channels += 15) {
839     for (size_t width = 1; width <= spatial_tile; width++) {
840       GlobalAveragePoolingOperatorTester()
841         .batch_size(3)
842         .width(width)
843         .channels(channels)
844         .input_stride(5 * channels)
845         .TestNWCxF16();
846     }
847   }
848 }
849 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_small_width_with_output_stride)850 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_small_width_with_output_stride) {
851   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
852   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
853   for (size_t channels = 1; channels <= 100; channels += 15) {
854     for (size_t width = 1; width <= spatial_tile; width++) {
855       GlobalAveragePoolingOperatorTester()
856         .batch_size(3)
857         .width(width)
858         .channels(channels)
859         .output_stride(5 * channels)
860         .TestNWCxF16();
861     }
862   }
863 }
864 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_large_width)865 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_large_width) {
866   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
867   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
868   for (size_t channels = 1; channels <= 100; channels += 15) {
869     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
870       GlobalAveragePoolingOperatorTester()
871         .batch_size(3)
872         .width(width)
873         .channels(channels)
874         .TestNWCxF16();
875     }
876   }
877 }
878 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_large_width_with_input_stride)879 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_large_width_with_input_stride) {
880   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
881   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
882   for (size_t channels = 1; channels <= 100; channels += 15) {
883     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
884       GlobalAveragePoolingOperatorTester()
885         .batch_size(3)
886         .width(width)
887         .channels(channels)
888         .input_stride(5 * channels)
889         .TestNWCxF16();
890     }
891   }
892 }
893 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F16,small_batch_large_width_with_output_stride)894 TEST(GLOBAL_AVERAGE_POOLING_NWC_F16, small_batch_large_width_with_output_stride) {
895   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
896   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f16.gavgpool.row_tile, 1);
897   for (size_t channels = 1; channels <= 100; channels += 15) {
898     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
899       GlobalAveragePoolingOperatorTester()
900         .batch_size(3)
901         .width(width)
902         .channels(channels)
903         .output_stride(5 * channels)
904         .TestNWCxF16();
905     }
906   }
907 }
908 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_small_width)909 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_small_width) {
910   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
911   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
912   for (size_t channels = 1; channels <= 100; channels += 15) {
913     for (size_t width = 1; width <= spatial_tile; width++) {
914       GlobalAveragePoolingOperatorTester()
915         .batch_size(1)
916         .width(width)
917         .channels(channels)
918         .TestNWCxF32();
919     }
920   }
921 }
922 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_small_width_with_input_stride)923 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_small_width_with_input_stride) {
924   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
925   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
926   for (size_t channels = 1; channels <= 100; channels += 15) {
927     for (size_t width = 1; width <= spatial_tile; width++) {
928       GlobalAveragePoolingOperatorTester()
929         .batch_size(1)
930         .width(width)
931         .channels(channels)
932         .input_stride(5 * channels)
933         .TestNWCxF32();
934     }
935   }
936 }
937 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_small_width_with_qmin)938 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_small_width_with_qmin) {
939   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
940   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
941   for (size_t channels = 1; channels <= 100; channels += 15) {
942     for (size_t width = 1; width <= spatial_tile; width++) {
943       GlobalAveragePoolingOperatorTester()
944         .batch_size(1)
945         .width(width)
946         .channels(channels)
947         .qmin(128)
948         .TestNWCxF32();
949     }
950   }
951 }
952 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_small_width_with_qmax)953 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_small_width_with_qmax) {
954   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
955   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
956   for (size_t channels = 1; channels <= 100; channels += 15) {
957     for (size_t width = 1; width <= spatial_tile; width++) {
958       GlobalAveragePoolingOperatorTester()
959         .batch_size(1)
960         .width(width)
961         .channels(channels)
962         .qmax(128)
963         .TestNWCxF32();
964     }
965   }
966 }
967 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_large_width)968 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_large_width) {
969   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
970   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
971   for (size_t channels = 1; channels <= 100; channels += 15) {
972     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
973       GlobalAveragePoolingOperatorTester()
974         .batch_size(1)
975         .width(width)
976         .channels(channels)
977         .TestNWCxF32();
978     }
979   }
980 }
981 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_large_width_with_input_stride)982 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_large_width_with_input_stride) {
983   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
984   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
985   for (size_t channels = 1; channels <= 100; channels += 15) {
986     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
987       GlobalAveragePoolingOperatorTester()
988         .batch_size(1)
989         .width(width)
990         .channels(channels)
991         .input_stride(5 * channels)
992         .TestNWCxF32();
993     }
994   }
995 }
996 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_large_width_with_qmin)997 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_large_width_with_qmin) {
998   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
999   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1000   for (size_t channels = 1; channels <= 100; channels += 15) {
1001     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
1002       GlobalAveragePoolingOperatorTester()
1003         .batch_size(1)
1004         .width(width)
1005         .channels(channels)
1006         .qmin(128)
1007         .TestNWCxF32();
1008     }
1009   }
1010 }
1011 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,unit_batch_large_width_with_qmax)1012 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, unit_batch_large_width_with_qmax) {
1013   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1014   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1015   for (size_t channels = 1; channels <= 100; channels += 15) {
1016     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
1017       GlobalAveragePoolingOperatorTester()
1018         .batch_size(1)
1019         .width(width)
1020         .channels(channels)
1021         .qmax(128)
1022         .TestNWCxF32();
1023     }
1024   }
1025 }
1026 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_small_width)1027 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_small_width) {
1028   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1029   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1030   for (size_t channels = 1; channels <= 100; channels += 15) {
1031     for (size_t width = 1; width <= spatial_tile; width++) {
1032       GlobalAveragePoolingOperatorTester()
1033         .batch_size(3)
1034         .width(width)
1035         .channels(channels)
1036         .TestNWCxF32();
1037     }
1038   }
1039 }
1040 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_small_width_with_input_stride)1041 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_small_width_with_input_stride) {
1042   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1043   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1044   for (size_t channels = 1; channels <= 100; channels += 15) {
1045     for (size_t width = 1; width <= spatial_tile; width++) {
1046       GlobalAveragePoolingOperatorTester()
1047         .batch_size(3)
1048         .width(width)
1049         .channels(channels)
1050         .input_stride(5 * channels)
1051         .TestNWCxF32();
1052     }
1053   }
1054 }
1055 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_small_width_with_output_stride)1056 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_small_width_with_output_stride) {
1057   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1058   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1059   for (size_t channels = 1; channels <= 100; channels += 15) {
1060     for (size_t width = 1; width <= spatial_tile; width++) {
1061       GlobalAveragePoolingOperatorTester()
1062         .batch_size(3)
1063         .width(width)
1064         .channels(channels)
1065         .output_stride(5 * channels)
1066         .TestNWCxF32();
1067     }
1068   }
1069 }
1070 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_large_width)1071 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_large_width) {
1072   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1073   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1074   for (size_t channels = 1; channels <= 100; channels += 15) {
1075     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
1076       GlobalAveragePoolingOperatorTester()
1077         .batch_size(3)
1078         .width(width)
1079         .channels(channels)
1080         .TestNWCxF32();
1081     }
1082   }
1083 }
1084 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_large_width_with_input_stride)1085 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_large_width_with_input_stride) {
1086   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1087   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1088   for (size_t channels = 1; channels <= 100; channels += 15) {
1089     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
1090       GlobalAveragePoolingOperatorTester()
1091         .batch_size(3)
1092         .width(width)
1093         .channels(channels)
1094         .input_stride(5 * channels)
1095         .TestNWCxF32();
1096     }
1097   }
1098 }
1099 
TEST(GLOBAL_AVERAGE_POOLING_NWC_F32,small_batch_large_width_with_output_stride)1100 TEST(GLOBAL_AVERAGE_POOLING_NWC_F32, small_batch_large_width_with_output_stride) {
1101   ASSERT_EQ(xnn_status_success, xnn_initialize(nullptr /* allocator */));
1102   const uint32_t spatial_tile = std::max<uint32_t>(xnn_params.f32.gavgpool.row_tile, 1);
1103   for (size_t channels = 1; channels <= 100; channels += 15) {
1104     for (size_t width = spatial_tile; width <= 4 * spatial_tile; width++) {
1105       GlobalAveragePoolingOperatorTester()
1106         .batch_size(3)
1107         .width(width)
1108         .channels(channels)
1109         .output_stride(5 * channels)
1110         .TestNWCxF32();
1111     }
1112   }
1113 }
1114