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