blob: 8a15c62820219579743ca2220094eee87bd927c7 [file] [log] [blame]
Marat Dukhan329da642019-11-19 21:44:39 -08001#!/usr/bin/env python
2# Copyright 2019 Google LLC
3#
4# This source code is licensed under the BSD-style license found in the
5# LICENSE file in the root directory of this source tree.
6
7import argparse
8import codecs
9import math
10import os
11import re
12import sys
13import yaml
14
15sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16from primes import next_prime
17import xngen
18import xnncommon
19
20
21parser = argparse.ArgumentParser(description='MaxPool microkernel test generator')
22parser.add_argument("-s", "--spec", metavar="FILE", required=True,
23 help="Specification (YAML) file")
24parser.add_argument("-o", "--output", metavar="FILE", required=True,
25 help='Output (C++ source) file')
26parser.set_defaults(defines=list())
27
28
29def split_ukernel_name(name):
Marat Dukhan99936602020-04-11 16:47:01 -070030 match = re.match(r"^xnn_(s8|u8|s16|f16|f32)_maxpool(_(minmax))?_ukernel_(\d+)p(\d+)x__(.+)_c(\d+)$", name)
Marat Dukhan329da642019-11-19 21:44:39 -080031 if match is None:
32 raise ValueError("Unexpected microkernel name: " + name)
33
Marat Dukhan99936602020-04-11 16:47:01 -070034 primary_tile = int(match.group(4))
35 incremental_tile = int(match.group(5))
36 channel_tile = int(match.group(7))
Marat Dukhan329da642019-11-19 21:44:39 -080037
Marat Dukhan99936602020-04-11 16:47:01 -070038 arch, isa = xnncommon.parse_target_name(target_name=match.group(6))
Marat Dukhan329da642019-11-19 21:44:39 -080039 return primary_tile, incremental_tile, channel_tile, arch, isa
40
41
42MAXPOOL_TEST_TEMPLATE = """\
43TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile) {
44 $if ISA_CHECK:
45 ${ISA_CHECK};
46 MaxPoolMicrokernelTester()
47 .pooling_elements(${PRIMARY_TILE})
48 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
49 .channels(${CHANNEL_TILE})
50 .Test(${", ".join(TEST_ARGS)});
51}
52
53TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
54 $if ISA_CHECK:
55 ${ISA_CHECK};
56 MaxPoolMicrokernelTester()
57 .pooling_elements(${PRIMARY_TILE})
58 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
59 .channels(${CHANNEL_TILE})
60 .input_offset(${next_prime(CHANNEL_TILE+1)})
61 .Test(${", ".join(TEST_ARGS)});
62}
63
64TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
65 $if ISA_CHECK:
66 ${ISA_CHECK};
67 MaxPoolMicrokernelTester()
68 .pooling_elements(${PRIMARY_TILE})
69 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
70 .channels(${CHANNEL_TILE})
71 .qmin(192)
72 .Test(${", ".join(TEST_ARGS)});
73}
74
75TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
76 $if ISA_CHECK:
77 ${ISA_CHECK};
78 MaxPoolMicrokernelTester()
79 .pooling_elements(${PRIMARY_TILE})
80 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
81 .channels(${CHANNEL_TILE})
82 .qmax(192)
83 .Test(${", ".join(TEST_ARGS)});
84}
85
86TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_subtile) {
87 $if ISA_CHECK:
88 ${ISA_CHECK};
89 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
90 MaxPoolMicrokernelTester()
91 .pooling_elements(pooling_elements)
92 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
93 .channels(${CHANNEL_TILE})
94 .Test(${", ".join(TEST_ARGS)});
95 }
96}
97
98TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
99 $if ISA_CHECK:
100 ${ISA_CHECK};
101 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
102 MaxPoolMicrokernelTester()
103 .pooling_elements(pooling_elements)
104 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
105 .channels(${CHANNEL_TILE})
106 .input_offset(${next_prime(CHANNEL_TILE+1)})
107 .Test(${", ".join(TEST_ARGS)});
108 }
109}
110
111$if CHANNEL_TILE > 1:
112 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile) {
113 $if ISA_CHECK:
114 ${ISA_CHECK};
115 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
116 MaxPoolMicrokernelTester()
117 .pooling_elements(${PRIMARY_TILE})
118 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
119 .channels(channels)
120 .Test(${", ".join(TEST_ARGS)});
121 }
122 }
123
124 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
125 $if ISA_CHECK:
126 ${ISA_CHECK};
127 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
128 MaxPoolMicrokernelTester()
129 .pooling_elements(${PRIMARY_TILE})
130 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
131 .channels(channels)
132 .input_offset(${next_prime(CHANNEL_TILE*8)})
133 .Test(${", ".join(TEST_ARGS)});
134 }
135 }
136
137 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
138 $if ISA_CHECK:
139 ${ISA_CHECK};
140 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
141 MaxPoolMicrokernelTester()
142 .pooling_elements(${PRIMARY_TILE})
143 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
144 .channels(channels)
145 .qmin(192)
146 .Test(${", ".join(TEST_ARGS)});
147 }
148 }
149
150 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
151 $if ISA_CHECK:
152 ${ISA_CHECK};
153 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
154 MaxPoolMicrokernelTester()
155 .pooling_elements(${PRIMARY_TILE})
156 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
157 .channels(channels)
158 .qmax(192)
159 .Test(${", ".join(TEST_ARGS)});
160 }
161 }
162
163 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_subtile) {
164 $if ISA_CHECK:
165 ${ISA_CHECK};
166 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
167 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
168 MaxPoolMicrokernelTester()
169 .pooling_elements(pooling_elements)
170 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
171 .channels(channels)
172 .Test(${", ".join(TEST_ARGS)});
173 }
174 }
175 }
176
177 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
178 $if ISA_CHECK:
179 ${ISA_CHECK};
180 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
181 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
182 MaxPoolMicrokernelTester()
183 .pooling_elements(pooling_elements)
184 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
185 .channels(channels)
186 .input_offset(${next_prime(CHANNEL_TILE*8)})
187 .Test(${", ".join(TEST_ARGS)});
188 }
189 }
190 }
191
192 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile) {
193 $if ISA_CHECK:
194 ${ISA_CHECK};
195 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
196 MaxPoolMicrokernelTester()
197 .pooling_elements(${PRIMARY_TILE})
198 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
199 .channels(channels)
200 .Test(${", ".join(TEST_ARGS)});
201 }
202 }
203
204 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
205 $if ISA_CHECK:
206 ${ISA_CHECK};
207 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
208 MaxPoolMicrokernelTester()
209 .pooling_elements(${PRIMARY_TILE})
210 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
211 .channels(channels)
212 .input_offset(${next_prime(CHANNEL_TILE)})
213 .Test(${", ".join(TEST_ARGS)});
214 }
215 }
216
217 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
218 $if ISA_CHECK:
219 ${ISA_CHECK};
220 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
221 MaxPoolMicrokernelTester()
222 .pooling_elements(${PRIMARY_TILE})
223 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
224 .channels(channels)
225 .qmin(192)
226 .Test(${", ".join(TEST_ARGS)});
227 }
228 }
229
230 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
231 $if ISA_CHECK:
232 ${ISA_CHECK};
233 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
234 MaxPoolMicrokernelTester()
235 .pooling_elements(${PRIMARY_TILE})
236 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
237 .channels(channels)
238 .qmax(192)
239 .Test(${", ".join(TEST_ARGS)});
240 }
241 }
242
243 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_subtile) {
244 $if ISA_CHECK:
245 ${ISA_CHECK};
246 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
247 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
248 MaxPoolMicrokernelTester()
249 .pooling_elements(pooling_elements)
250 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
251 .channels(channels)
252 .Test(${", ".join(TEST_ARGS)});
253 }
254 }
255 }
256
257 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
258 $if ISA_CHECK:
259 ${ISA_CHECK};
260 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
261 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
262 MaxPoolMicrokernelTester()
263 .pooling_elements(pooling_elements)
264 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
265 .channels(channels)
266 .input_offset(${next_prime(CHANNEL_TILE)})
267 .Test(${", ".join(TEST_ARGS)});
268 }
269 }
270 }
271
272TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile) {
273 $if ISA_CHECK:
274 ${ISA_CHECK};
275 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
276 MaxPoolMicrokernelTester()
277 .pooling_elements(${PRIMARY_TILE})
278 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
279 .channels(channels)
280 .Test(${", ".join(TEST_ARGS)});
281 }
282}
283
284TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
285 $if ISA_CHECK:
286 ${ISA_CHECK};
287 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
288 MaxPoolMicrokernelTester()
289 .pooling_elements(${PRIMARY_TILE})
290 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
291 .channels(channels)
292 .input_offset(${next_prime(CHANNEL_TILE*2)})
293 .Test(${", ".join(TEST_ARGS)});
294 }
295}
296
297TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
298 $if ISA_CHECK:
299 ${ISA_CHECK};
300 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
301 MaxPoolMicrokernelTester()
302 .pooling_elements(${PRIMARY_TILE})
303 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
304 .channels(channels)
305 .qmin(192)
306 .Test(${", ".join(TEST_ARGS)});
307 }
308}
309
310TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
311 $if ISA_CHECK:
312 ${ISA_CHECK};
313 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
314 MaxPoolMicrokernelTester()
315 .pooling_elements(${PRIMARY_TILE})
316 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
317 .channels(channels)
318 .qmax(192)
319 .Test(${", ".join(TEST_ARGS)});
320 }
321}
322
323TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_subtile) {
324 $if ISA_CHECK:
325 ${ISA_CHECK};
326 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
327 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
328 MaxPoolMicrokernelTester()
329 .pooling_elements(pooling_elements)
330 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
331 .channels(channels)
332 .Test(${", ".join(TEST_ARGS)});
333 }
334 }
335}
336
337TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
338 $if ISA_CHECK:
339 ${ISA_CHECK};
340 for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
341 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
342 MaxPoolMicrokernelTester()
343 .pooling_elements(pooling_elements)
344 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
345 .channels(channels)
346 .input_offset(${next_prime(CHANNEL_TILE*2)})
347 .Test(${", ".join(TEST_ARGS)});
348 }
349 }
350}
351
352TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile) {
353 $if ISA_CHECK:
354 ${ISA_CHECK};
355 MaxPoolMicrokernelTester()
356 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
357 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
358 .channels(${CHANNEL_TILE})
359 .Test(${", ".join(TEST_ARGS)});
360}
361
362TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
363 $if ISA_CHECK:
364 ${ISA_CHECK};
365 MaxPoolMicrokernelTester()
366 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
367 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
368 .channels(${CHANNEL_TILE})
369 .input_offset(${next_prime(CHANNEL_TILE+1)})
370 .Test(${", ".join(TEST_ARGS)});
371}
372
373TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
374 $if ISA_CHECK:
375 ${ISA_CHECK};
376 MaxPoolMicrokernelTester()
377 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
378 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
379 .channels(${CHANNEL_TILE})
380 .qmin(192)
381 .Test(${", ".join(TEST_ARGS)});
382}
383
384TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
385 $if ISA_CHECK:
386 ${ISA_CHECK};
387 MaxPoolMicrokernelTester()
388 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
389 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
390 .channels(${CHANNEL_TILE})
391 .qmax(192)
392 .Test(${", ".join(TEST_ARGS)});
393}
394
395TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_subtile) {
396 $if ISA_CHECK:
397 ${ISA_CHECK};
398 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
399 MaxPoolMicrokernelTester()
400 .pooling_elements(pooling_elements)
401 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
402 .channels(${CHANNEL_TILE})
403 .Test(${", ".join(TEST_ARGS)});
404 }
405}
406
407TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
408 $if ISA_CHECK:
409 ${ISA_CHECK};
410 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
411 MaxPoolMicrokernelTester()
412 .pooling_elements(pooling_elements)
413 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
414 .channels(${CHANNEL_TILE})
415 .input_offset(${next_prime(CHANNEL_TILE+1)})
416 .Test(${", ".join(TEST_ARGS)});
417 }
418}
419
420$if CHANNEL_TILE > 1:
421 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile) {
422 $if ISA_CHECK:
423 ${ISA_CHECK};
424 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
425 MaxPoolMicrokernelTester()
426 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
427 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
428 .channels(channels)
429 .Test(${", ".join(TEST_ARGS)});
430 }
431 }
432
433 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
434 $if ISA_CHECK:
435 ${ISA_CHECK};
436 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
437 MaxPoolMicrokernelTester()
438 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
439 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
440 .channels(channels)
441 .input_offset(${next_prime(CHANNEL_TILE*5)})
442 .Test(${", ".join(TEST_ARGS)});
443 }
444 }
445
446 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
447 $if ISA_CHECK:
448 ${ISA_CHECK};
449 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
450 MaxPoolMicrokernelTester()
451 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
452 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
453 .channels(channels)
454 .qmin(192)
455 .Test(${", ".join(TEST_ARGS)});
456 }
457 }
458
459 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
460 $if ISA_CHECK:
461 ${ISA_CHECK};
462 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
463 MaxPoolMicrokernelTester()
464 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
465 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
466 .channels(channels)
467 .qmax(192)
468 .Test(${", ".join(TEST_ARGS)});
469 }
470 }
471
472 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_subtile) {
473 $if ISA_CHECK:
474 ${ISA_CHECK};
475 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
476 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
477 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800478 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800479 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
480 .channels(channels)
481 .Test(${", ".join(TEST_ARGS)});
482 }
483 }
484 }
485
486 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
487 $if ISA_CHECK:
488 ${ISA_CHECK};
489 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
490 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
491 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800492 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800493 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
494 .channels(channels)
495 .input_offset(${next_prime(CHANNEL_TILE*8)})
496 .Test(${", ".join(TEST_ARGS)});
497 }
498 }
499 }
500
501 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile) {
502 $if ISA_CHECK:
503 ${ISA_CHECK};
504 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
505 MaxPoolMicrokernelTester()
506 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
507 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
508 .channels(channels)
509 .Test(${", ".join(TEST_ARGS)});
510 }
511 }
512
513 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
514 $if ISA_CHECK:
515 ${ISA_CHECK};
516 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
517 MaxPoolMicrokernelTester()
518 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
519 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
520 .channels(channels)
521 .input_offset(${next_prime(CHANNEL_TILE)})
522 .Test(${", ".join(TEST_ARGS)});
523 }
524 }
525
526 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
527 $if ISA_CHECK:
528 ${ISA_CHECK};
529 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
530 MaxPoolMicrokernelTester()
531 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
532 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
533 .channels(channels)
534 .qmin(192)
535 .Test(${", ".join(TEST_ARGS)});
536 }
537 }
538
539 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
540 $if ISA_CHECK:
541 ${ISA_CHECK};
542 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
543 MaxPoolMicrokernelTester()
544 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
545 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
546 .channels(channels)
547 .qmax(192)
548 .Test(${", ".join(TEST_ARGS)});
549 }
550 }
551
552 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_subtile) {
553 $if ISA_CHECK:
554 ${ISA_CHECK};
555 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
556 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
557 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800558 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800559 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
560 .channels(channels)
561 .Test(${", ".join(TEST_ARGS)});
562 }
563 }
564 }
565
566 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
567 $if ISA_CHECK:
568 ${ISA_CHECK};
569 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
570 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
571 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800572 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800573 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
574 .channels(channels)
575 .input_offset(${next_prime(CHANNEL_TILE)})
576 .Test(${", ".join(TEST_ARGS)});
577 }
578 }
579 }
580
581TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile) {
582 $if ISA_CHECK:
583 ${ISA_CHECK};
584 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
585 MaxPoolMicrokernelTester()
586 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
587 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
588 .channels(channels)
589 .Test(${", ".join(TEST_ARGS)});
590 }
591}
592
593TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
594 $if ISA_CHECK:
595 ${ISA_CHECK};
596 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
597 MaxPoolMicrokernelTester()
598 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
599 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
600 .channels(channels)
601 .input_offset(${next_prime(CHANNEL_TILE*2)})
602 .Test(${", ".join(TEST_ARGS)});
603 }
604}
605
606TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
607 $if ISA_CHECK:
608 ${ISA_CHECK};
609 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
610 MaxPoolMicrokernelTester()
611 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
612 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
613 .channels(channels)
614 .qmin(192)
615 .Test(${", ".join(TEST_ARGS)});
616 }
617}
618
619TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
620 $if ISA_CHECK:
621 ${ISA_CHECK};
622 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
623 MaxPoolMicrokernelTester()
624 .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
625 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
626 .channels(channels)
627 .qmax(192)
628 .Test(${", ".join(TEST_ARGS)});
629 }
630}
631
632TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_subtile) {
633 $if ISA_CHECK:
634 ${ISA_CHECK};
635 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
636 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
637 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800638 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800639 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
640 .channels(channels)
641 .Test(${", ".join(TEST_ARGS)});
642 }
643 }
644}
645
646TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
647 $if ISA_CHECK:
648 ${ISA_CHECK};
649 for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
650 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
651 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800652 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800653 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
654 .channels(channels)
655 .input_offset(${next_prime(CHANNEL_TILE*2)})
656 .Test(${", ".join(TEST_ARGS)});
657 }
658 }
659}
660
661TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass) {
662 $if ISA_CHECK:
663 ${ISA_CHECK};
664 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
665 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800666 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800667 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
668 .channels(${CHANNEL_TILE})
669 .Test(${", ".join(TEST_ARGS)});
670 }
671}
672
673TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_input_offset) {
674 $if ISA_CHECK:
675 ${ISA_CHECK};
676 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
677 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800678 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800679 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
680 .channels(${CHANNEL_TILE})
681 .input_offset(${next_prime(CHANNEL_TILE+1)})
682 .Test(${", ".join(TEST_ARGS)});
683 }
684}
685
686TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_qmin) {
687 $if ISA_CHECK:
688 ${ISA_CHECK};
689 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
690 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800691 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800692 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
693 .channels(${CHANNEL_TILE})
694 .qmin(192)
695 .Test(${", ".join(TEST_ARGS)});
696 }
697}
698
699TEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_qmax) {
700 $if ISA_CHECK:
701 ${ISA_CHECK};
702 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
703 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800704 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800705 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
706 .channels(${CHANNEL_TILE})
707 .qmax(192)
708 .Test(${", ".join(TEST_ARGS)});
709 }
710}
711
712$if CHANNEL_TILE > 1:
713 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass) {
714 $if ISA_CHECK:
715 ${ISA_CHECK};
716 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
717 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
718 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800719 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800720 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
721 .channels(channels)
722 .Test(${", ".join(TEST_ARGS)});
723 }
724 }
725 }
726
727 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_input_offset) {
728 $if ISA_CHECK:
729 ${ISA_CHECK};
730 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
731 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
732 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800733 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800734 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
735 .channels(channels)
736 .input_offset(${next_prime(CHANNEL_TILE*8)})
737 .Test(${", ".join(TEST_ARGS)});
738 }
739 }
740 }
741
742 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_qmin) {
743 $if ISA_CHECK:
744 ${ISA_CHECK};
745 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
746 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
747 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800748 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800749 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
750 .channels(channels)
751 .qmin(192)
752 .Test(${", ".join(TEST_ARGS)});
753 }
754 }
755 }
756
757 TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_qmax) {
758 $if ISA_CHECK:
759 ${ISA_CHECK};
760 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
761 for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
762 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800763 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800764 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
765 .channels(channels)
766 .qmax(192)
767 .Test(${", ".join(TEST_ARGS)});
768 }
769 }
770 }
771
772 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass) {
773 $if ISA_CHECK:
774 ${ISA_CHECK};
775 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
776 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
777 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800778 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800779 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
780 .channels(channels)
781 .Test(${", ".join(TEST_ARGS)});
782 }
783 }
784 }
785
786 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_input_offset) {
787 $if ISA_CHECK:
788 ${ISA_CHECK};
789 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
790 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
791 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800792 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800793 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
794 .channels(channels)
795 .input_offset(${CHANNEL_TILE})
796 .Test(${", ".join(TEST_ARGS)});
797 }
798 }
799 }
800
801 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_qmin) {
802 $if ISA_CHECK:
803 ${ISA_CHECK};
804 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
805 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
806 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800807 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800808 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
809 .channels(channels)
810 .qmin(192)
811 .Test(${", ".join(TEST_ARGS)});
812 }
813 }
814 }
815
816 TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_qmax) {
817 $if ISA_CHECK:
818 ${ISA_CHECK};
819 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
820 for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
821 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800822 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800823 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
824 .channels(channels)
825 .qmax(192)
826 .Test(${", ".join(TEST_ARGS)});
827 }
828 }
829 }
830
831TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass) {
832 $if ISA_CHECK:
833 ${ISA_CHECK};
834 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
835 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
836 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800837 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800838 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
839 .channels(channels)
840 .Test(${", ".join(TEST_ARGS)});
841 }
842 }
843}
844
845TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_input_offset) {
846 $if ISA_CHECK:
847 ${ISA_CHECK};
848 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
849 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
850 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800851 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800852 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
853 .channels(channels)
854 .input_offset(${next_prime(CHANNEL_TILE*2)})
855 .Test(${", ".join(TEST_ARGS)});
856 }
857 }
858}
859
860TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_qmin) {
861 $if ISA_CHECK:
862 ${ISA_CHECK};
863 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
864 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
865 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800866 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800867 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
868 .channels(channels)
869 .qmin(192)
870 .Test(${", ".join(TEST_ARGS)});
871 }
872 }
873}
874
875TEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_qmax) {
876 $if ISA_CHECK:
877 ${ISA_CHECK};
878 for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
879 for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
880 MaxPoolMicrokernelTester()
Marat Dukhanf5fec4b2020-02-27 13:48:33 -0800881 .pooling_elements(pooling_elements)
Marat Dukhan329da642019-11-19 21:44:39 -0800882 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
883 .channels(channels)
884 .qmax(192)
885 .Test(${", ".join(TEST_ARGS)});
886 }
887 }
888}
889
890TEST(${TEST_NAME}, few_output_pixels) {
891 $if ISA_CHECK:
892 ${ISA_CHECK};
893 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
894 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
895 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
896 MaxPoolMicrokernelTester()
897 .output_pixels(output_pixels)
898 .pooling_elements(pooling_elements)
899 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
900 .channels(channels)
901 .Test(${", ".join(TEST_ARGS)});
902 }
903 }
904 }
905}
906
907TEST(${TEST_NAME}, few_output_pixels_with_input_offset) {
908 $if ISA_CHECK:
909 ${ISA_CHECK};
910 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
911 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
912 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
913 MaxPoolMicrokernelTester()
914 .output_pixels(output_pixels)
915 .pooling_elements(pooling_elements)
916 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
917 .channels(channels)
918 .input_offset(${next_prime(CHANNEL_TILE*5+1)})
919 .Test(${", ".join(TEST_ARGS)});
920 }
921 }
922 }
923}
924
925TEST(${TEST_NAME}, few_output_pixels_with_qmin) {
926 $if ISA_CHECK:
927 ${ISA_CHECK};
928 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
929 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
930 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
931 MaxPoolMicrokernelTester()
932 .output_pixels(output_pixels)
933 .pooling_elements(pooling_elements)
934 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
935 .channels(channels)
936 .qmin(192)
937 .Test(${", ".join(TEST_ARGS)});
938 }
939 }
940 }
941}
942
943TEST(${TEST_NAME}, few_output_pixels_with_qmax) {
944 $if ISA_CHECK:
945 ${ISA_CHECK};
946 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
947 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
948 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
949 MaxPoolMicrokernelTester()
950 .output_pixels(output_pixels)
951 .pooling_elements(pooling_elements)
952 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
953 .channels(channels)
954 .qmax(192)
955 .Test(${", ".join(TEST_ARGS)});
956 }
957 }
958 }
959}
960
961TEST(${TEST_NAME}, few_output_pixels_with_output_stride) {
962 $if ISA_CHECK:
963 ${ISA_CHECK};
964 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
965 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
966 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
967 MaxPoolMicrokernelTester()
968 .output_pixels(output_pixels)
969 .pooling_elements(pooling_elements)
970 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
971 .channels(channels)
972 .output_stride(${next_prime(CHANNEL_TILE*5+1)})
973 .Test(${", ".join(TEST_ARGS)});
974 }
975 }
976 }
977}
978
979TEST(${TEST_NAME}, few_output_pixels_with_step) {
980 $if ISA_CHECK:
981 ${ISA_CHECK};
982 for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
983 for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
984 for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
985 for (size_t step = 2; step <= pooling_elements; step++) {
986 MaxPoolMicrokernelTester()
987 .output_pixels(output_pixels)
988 .pooling_elements(pooling_elements)
989 .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
990 .step(step)
991 .channels(channels)
992 .output_stride(${next_prime(CHANNEL_TILE*5+1)})
993 .Test(${", ".join(TEST_ARGS)});
994 }
995 }
996 }
997 }
998}
999"""
1000
1001
1002def generate_test_cases(ukernel, primary_tile, incremental_tile, channel_tile,
1003 isa):
1004 """Generates all tests cases for a MAXPOOL micro-kernel.
1005
1006 Args:
1007 ukernel: C name of the micro-kernel function.
1008 primary_tile: Number of rows (pixels) processed per one iteration of the
1009 primary outer loop of the micro-kernel.
1010 incremental_tile: Number of rows (pixels) processed per one iteration of
1011 the incremental outer loop of the micro-kernel.
1012 channel_tile: Number of channels processed per one iteration of the inner
1013 loops of the micro-kernel.
1014 isa: instruction set required to run the micro-kernel. Generated unit test
1015 will skip execution if the host processor doesn't support this ISA.
1016
1017 Returns:
1018 Code for the test case.
1019 """
1020 _, test_name = ukernel.split("_", 1)
1021 _, datatype, ukernel_type, _ = ukernel.split("_", 3)
1022 test_args = [ukernel]
Marat Dukhan3de5dfa2020-12-10 11:19:47 -08001023 if not isa:
Marat Dukhan329da642019-11-19 21:44:39 -08001024 test_args.append("MaxPoolMicrokernelTester::Variant::Scalar")
1025 return xngen.preprocess(MAXPOOL_TEST_TEMPLATE, {
1026 "TEST_NAME": test_name.upper().replace("UKERNEL_", ""),
1027 "TEST_ARGS": test_args,
1028 "DATATYPE": datatype,
1029 "PRIMARY_TILE": primary_tile,
1030 "INCREMENTAL_TILE": incremental_tile,
1031 "CHANNEL_TILE": channel_tile,
1032 "ISA_CHECK": xnncommon.generate_isa_check_macro(isa),
1033 "next_prime": next_prime,
1034 })
1035
1036
1037def main(args):
1038 options = parser.parse_args(args)
1039
1040 with codecs.open(options.spec, "r", encoding="utf-8") as spec_file:
1041 spec_yaml = yaml.safe_load(spec_file)
1042 if not isinstance(spec_yaml, list):
1043 raise ValueError("expected a list of micro-kernels in the spec")
1044
1045 tests = """\
1046// Copyright (c) Facebook, Inc. and its affiliates.
1047// All rights reserved.
1048//
1049// Copyright 2019 Google LLC
1050//
1051// This source code is licensed under the BSD-style license found in the
1052// LICENSE file in the root directory of this source tree.
1053//
1054// Auto-generated file. Do not edit!
1055// Specification: {specification}
1056// Generator: {generator}
1057
1058
1059#include <gtest/gtest.h>
1060
1061#include <xnnpack/common.h>
1062#include <xnnpack/isa-checks.h>
1063
1064#include <xnnpack/maxpool.h>
1065#include "maxpool-microkernel-tester.h"
1066""".format(specification=options.spec, generator=sys.argv[0])
1067
1068 for ukernel_spec in spec_yaml:
1069 name = ukernel_spec["name"]
1070 primary_tile, incremental_tile, channel_tile, arch, isa = \
1071 split_ukernel_name(name)
1072
1073 # specification can override architecture
1074 arch = ukernel_spec.get("arch", arch)
1075
1076 test_case = generate_test_cases(name, primary_tile, incremental_tile,
1077 channel_tile, isa)
1078 tests += "\n\n" + xnncommon.postprocess_test_case(test_case, arch, isa)
1079
1080 with codecs.open(options.output, "w", encoding="utf-8") as output_file:
1081 output_file.write(tests)
1082
1083
1084if __name__ == "__main__":
1085 main(sys.argv[1:])