1 // Copyright (c) Facebook, Inc. and its affiliates.
2 // All rights reserved.
3 //
4 // Copyright 2019 Google LLC
5 //
6 // This source code is licensed under the BSD-style license found in the
7 // LICENSE file in the root directory of this source tree.
8
9 #include <gtest/gtest.h>
10
11 #include "fully-connected-operator-tester.h"
12
13
TEST(FULLY_CONNECTED_NC_QS8,unit_batch)14 TEST(FULLY_CONNECTED_NC_QS8, unit_batch) {
15 FullyConnectedOperatorTester()
16 .batch_size(1)
17 .input_channels(23)
18 .output_channels(19)
19 .iterations(3)
20 .TestQS8();
21 }
22
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_with_qmin)23 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_with_qmin) {
24 FullyConnectedOperatorTester()
25 .batch_size(1)
26 .input_channels(23)
27 .output_channels(19)
28 .qmin(128)
29 .iterations(3)
30 .TestQS8();
31 }
32
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_with_qmax)33 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_with_qmax) {
34 FullyConnectedOperatorTester()
35 .batch_size(1)
36 .input_channels(23)
37 .output_channels(19)
38 .qmax(128)
39 .iterations(3)
40 .TestQS8();
41 }
42
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_with_input_stride)43 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_with_input_stride) {
44 FullyConnectedOperatorTester()
45 .batch_size(1)
46 .input_channels(23)
47 .input_stride(28)
48 .output_channels(19)
49 .iterations(3)
50 .TestQS8();
51 }
52
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_with_output_stride)53 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_with_output_stride) {
54 FullyConnectedOperatorTester()
55 .batch_size(1)
56 .input_channels(23)
57 .output_channels(19)
58 .output_stride(29)
59 .iterations(3)
60 .TestQS8();
61 }
62
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_transpose_weights)63 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_transpose_weights) {
64 FullyConnectedOperatorTester()
65 .transpose_weights(true)
66 .batch_size(1)
67 .input_channels(23)
68 .output_channels(19)
69 .iterations(3)
70 .TestQS8();
71 }
72
TEST(FULLY_CONNECTED_NC_QS8,unit_batch_without_bias)73 TEST(FULLY_CONNECTED_NC_QS8, unit_batch_without_bias) {
74 FullyConnectedOperatorTester()
75 .has_bias(false)
76 .batch_size(1)
77 .input_channels(23)
78 .output_channels(19)
79 .iterations(3)
80 .TestQS8();
81 }
82
TEST(FULLY_CONNECTED_NC_QS8,small_batch)83 TEST(FULLY_CONNECTED_NC_QS8, small_batch) {
84 FullyConnectedOperatorTester()
85 .batch_size(12)
86 .input_channels(23)
87 .output_channels(19)
88 .iterations(3)
89 .TestQS8();
90 }
91
TEST(FULLY_CONNECTED_NC_QS8,small_batch_with_qmin)92 TEST(FULLY_CONNECTED_NC_QS8, small_batch_with_qmin) {
93 FullyConnectedOperatorTester()
94 .batch_size(12)
95 .input_channels(23)
96 .output_channels(19)
97 .qmin(128)
98 .iterations(3)
99 .TestQS8();
100 }
101
TEST(FULLY_CONNECTED_NC_QS8,small_batch_with_qmax)102 TEST(FULLY_CONNECTED_NC_QS8, small_batch_with_qmax) {
103 FullyConnectedOperatorTester()
104 .batch_size(12)
105 .input_channels(23)
106 .output_channels(19)
107 .qmax(128)
108 .iterations(3)
109 .TestQS8();
110 }
111
TEST(FULLY_CONNECTED_NC_QS8,small_batch_with_input_stride)112 TEST(FULLY_CONNECTED_NC_QS8, small_batch_with_input_stride) {
113 FullyConnectedOperatorTester()
114 .batch_size(12)
115 .input_channels(23)
116 .input_stride(28)
117 .output_channels(19)
118 .iterations(3)
119 .TestQS8();
120 }
121
TEST(FULLY_CONNECTED_NC_QS8,small_batch_with_output_stride)122 TEST(FULLY_CONNECTED_NC_QS8, small_batch_with_output_stride) {
123 FullyConnectedOperatorTester()
124 .batch_size(12)
125 .input_channels(23)
126 .output_channels(19)
127 .output_stride(29)
128 .iterations(3)
129 .TestQS8();
130 }
131
TEST(FULLY_CONNECTED_NC_QS8,small_batch_transpose_weights)132 TEST(FULLY_CONNECTED_NC_QS8, small_batch_transpose_weights) {
133 FullyConnectedOperatorTester()
134 .transpose_weights(true)
135 .batch_size(12)
136 .input_channels(23)
137 .output_channels(19)
138 .iterations(3)
139 .TestQS8();
140 }
141
TEST(FULLY_CONNECTED_NC_QS8,small_batch_without_bias)142 TEST(FULLY_CONNECTED_NC_QS8, small_batch_without_bias) {
143 FullyConnectedOperatorTester()
144 .has_bias(false)
145 .batch_size(12)
146 .input_channels(23)
147 .output_channels(19)
148 .iterations(3)
149 .TestQS8();
150 }
151
TEST(FULLY_CONNECTED_NC_QU8,unit_batch)152 TEST(FULLY_CONNECTED_NC_QU8, unit_batch) {
153 FullyConnectedOperatorTester()
154 .batch_size(1)
155 .input_channels(23)
156 .output_channels(19)
157 .iterations(3)
158 .TestQU8();
159 }
160
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_with_qmin)161 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_with_qmin) {
162 FullyConnectedOperatorTester()
163 .batch_size(1)
164 .input_channels(23)
165 .output_channels(19)
166 .qmin(128)
167 .iterations(3)
168 .TestQU8();
169 }
170
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_with_qmax)171 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_with_qmax) {
172 FullyConnectedOperatorTester()
173 .batch_size(1)
174 .input_channels(23)
175 .output_channels(19)
176 .qmax(128)
177 .iterations(3)
178 .TestQU8();
179 }
180
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_with_input_stride)181 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_with_input_stride) {
182 FullyConnectedOperatorTester()
183 .batch_size(1)
184 .input_channels(23)
185 .input_stride(28)
186 .output_channels(19)
187 .iterations(3)
188 .TestQU8();
189 }
190
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_with_output_stride)191 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_with_output_stride) {
192 FullyConnectedOperatorTester()
193 .batch_size(1)
194 .input_channels(23)
195 .output_channels(19)
196 .output_stride(29)
197 .iterations(3)
198 .TestQU8();
199 }
200
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_transpose_weights)201 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_transpose_weights) {
202 FullyConnectedOperatorTester()
203 .transpose_weights(true)
204 .batch_size(1)
205 .input_channels(23)
206 .output_channels(19)
207 .iterations(3)
208 .TestQU8();
209 }
210
TEST(FULLY_CONNECTED_NC_QU8,unit_batch_without_bias)211 TEST(FULLY_CONNECTED_NC_QU8, unit_batch_without_bias) {
212 FullyConnectedOperatorTester()
213 .has_bias(false)
214 .batch_size(1)
215 .input_channels(23)
216 .output_channels(19)
217 .iterations(3)
218 .TestQU8();
219 }
220
TEST(FULLY_CONNECTED_NC_QU8,small_batch)221 TEST(FULLY_CONNECTED_NC_QU8, small_batch) {
222 FullyConnectedOperatorTester()
223 .batch_size(12)
224 .input_channels(23)
225 .output_channels(19)
226 .iterations(3)
227 .TestQU8();
228 }
229
TEST(FULLY_CONNECTED_NC_QU8,small_batch_with_qmin)230 TEST(FULLY_CONNECTED_NC_QU8, small_batch_with_qmin) {
231 FullyConnectedOperatorTester()
232 .batch_size(12)
233 .input_channels(23)
234 .output_channels(19)
235 .qmin(128)
236 .iterations(3)
237 .TestQU8();
238 }
239
TEST(FULLY_CONNECTED_NC_QU8,small_batch_with_qmax)240 TEST(FULLY_CONNECTED_NC_QU8, small_batch_with_qmax) {
241 FullyConnectedOperatorTester()
242 .batch_size(12)
243 .input_channels(23)
244 .output_channels(19)
245 .qmax(128)
246 .iterations(3)
247 .TestQU8();
248 }
249
TEST(FULLY_CONNECTED_NC_QU8,small_batch_with_input_stride)250 TEST(FULLY_CONNECTED_NC_QU8, small_batch_with_input_stride) {
251 FullyConnectedOperatorTester()
252 .batch_size(12)
253 .input_channels(23)
254 .input_stride(28)
255 .output_channels(19)
256 .iterations(3)
257 .TestQU8();
258 }
259
TEST(FULLY_CONNECTED_NC_QU8,small_batch_with_output_stride)260 TEST(FULLY_CONNECTED_NC_QU8, small_batch_with_output_stride) {
261 FullyConnectedOperatorTester()
262 .batch_size(12)
263 .input_channels(23)
264 .output_channels(19)
265 .output_stride(29)
266 .iterations(3)
267 .TestQU8();
268 }
269
TEST(FULLY_CONNECTED_NC_QU8,small_batch_transpose_weights)270 TEST(FULLY_CONNECTED_NC_QU8, small_batch_transpose_weights) {
271 FullyConnectedOperatorTester()
272 .transpose_weights(true)
273 .batch_size(12)
274 .input_channels(23)
275 .output_channels(19)
276 .iterations(3)
277 .TestQU8();
278 }
279
TEST(FULLY_CONNECTED_NC_QU8,small_batch_without_bias)280 TEST(FULLY_CONNECTED_NC_QU8, small_batch_without_bias) {
281 FullyConnectedOperatorTester()
282 .has_bias(false)
283 .batch_size(12)
284 .input_channels(23)
285 .output_channels(19)
286 .iterations(3)
287 .TestQU8();
288 }
289
TEST(FULLY_CONNECTED_NC_F32,unit_batch)290 TEST(FULLY_CONNECTED_NC_F32, unit_batch) {
291 FullyConnectedOperatorTester()
292 .batch_size(1)
293 .input_channels(23)
294 .output_channels(19)
295 .iterations(3)
296 .TestF32();
297 }
298
TEST(FULLY_CONNECTED_NC_F32,unit_batch_with_qmin)299 TEST(FULLY_CONNECTED_NC_F32, unit_batch_with_qmin) {
300 FullyConnectedOperatorTester()
301 .batch_size(1)
302 .input_channels(23)
303 .output_channels(19)
304 .qmin(128)
305 .iterations(3)
306 .TestF32();
307 }
308
TEST(FULLY_CONNECTED_NC_F32,unit_batch_with_qmax)309 TEST(FULLY_CONNECTED_NC_F32, unit_batch_with_qmax) {
310 FullyConnectedOperatorTester()
311 .batch_size(1)
312 .input_channels(23)
313 .output_channels(19)
314 .qmax(128)
315 .iterations(3)
316 .TestF32();
317 }
318
TEST(FULLY_CONNECTED_NC_F32,unit_batch_with_input_stride)319 TEST(FULLY_CONNECTED_NC_F32, unit_batch_with_input_stride) {
320 FullyConnectedOperatorTester()
321 .batch_size(1)
322 .input_channels(23)
323 .input_stride(28)
324 .output_channels(19)
325 .iterations(3)
326 .TestF32();
327 }
328
TEST(FULLY_CONNECTED_NC_F32,unit_batch_with_output_stride)329 TEST(FULLY_CONNECTED_NC_F32, unit_batch_with_output_stride) {
330 FullyConnectedOperatorTester()
331 .batch_size(1)
332 .input_channels(23)
333 .output_channels(19)
334 .output_stride(29)
335 .iterations(3)
336 .TestF32();
337 }
338
TEST(FULLY_CONNECTED_NC_F32,unit_batch_transpose_weights)339 TEST(FULLY_CONNECTED_NC_F32, unit_batch_transpose_weights) {
340 FullyConnectedOperatorTester()
341 .transpose_weights(true)
342 .batch_size(1)
343 .input_channels(23)
344 .output_channels(19)
345 .iterations(3)
346 .TestF32();
347 }
348
TEST(FULLY_CONNECTED_NC_F32,unit_batch_without_bias)349 TEST(FULLY_CONNECTED_NC_F32, unit_batch_without_bias) {
350 FullyConnectedOperatorTester()
351 .has_bias(false)
352 .batch_size(1)
353 .input_channels(23)
354 .output_channels(19)
355 .iterations(3)
356 .TestF32();
357 }
358
TEST(FULLY_CONNECTED_NC_F32,small_batch)359 TEST(FULLY_CONNECTED_NC_F32, small_batch) {
360 FullyConnectedOperatorTester()
361 .batch_size(12)
362 .input_channels(23)
363 .output_channels(19)
364 .iterations(3)
365 .TestF32();
366 }
367
TEST(FULLY_CONNECTED_NC_F32,small_batch_with_qmin)368 TEST(FULLY_CONNECTED_NC_F32, small_batch_with_qmin) {
369 FullyConnectedOperatorTester()
370 .batch_size(12)
371 .input_channels(23)
372 .output_channels(19)
373 .qmin(128)
374 .iterations(3)
375 .TestF32();
376 }
377
TEST(FULLY_CONNECTED_NC_F32,small_batch_with_qmax)378 TEST(FULLY_CONNECTED_NC_F32, small_batch_with_qmax) {
379 FullyConnectedOperatorTester()
380 .batch_size(12)
381 .input_channels(23)
382 .output_channels(19)
383 .qmax(128)
384 .iterations(3)
385 .TestF32();
386 }
387
TEST(FULLY_CONNECTED_NC_F32,small_batch_with_input_stride)388 TEST(FULLY_CONNECTED_NC_F32, small_batch_with_input_stride) {
389 FullyConnectedOperatorTester()
390 .batch_size(12)
391 .input_channels(23)
392 .input_stride(28)
393 .output_channels(19)
394 .iterations(3)
395 .TestF32();
396 }
397
TEST(FULLY_CONNECTED_NC_F32,small_batch_with_output_stride)398 TEST(FULLY_CONNECTED_NC_F32, small_batch_with_output_stride) {
399 FullyConnectedOperatorTester()
400 .batch_size(12)
401 .input_channels(23)
402 .output_channels(19)
403 .output_stride(29)
404 .iterations(3)
405 .TestF32();
406 }
407
TEST(FULLY_CONNECTED_NC_F32,small_batch_transpose_weights)408 TEST(FULLY_CONNECTED_NC_F32, small_batch_transpose_weights) {
409 FullyConnectedOperatorTester()
410 .transpose_weights(true)
411 .batch_size(12)
412 .input_channels(23)
413 .output_channels(19)
414 .iterations(3)
415 .TestF32();
416 }
417
TEST(FULLY_CONNECTED_NC_F32,small_batch_without_bias)418 TEST(FULLY_CONNECTED_NC_F32, small_batch_without_bias) {
419 FullyConnectedOperatorTester()
420 .has_bias(false)
421 .batch_size(12)
422 .input_channels(23)
423 .output_channels(19)
424 .iterations(3)
425 .TestF32();
426 }
427
428
TEST(FULLY_CONNECTED_NC_F16,unit_batch)429 TEST(FULLY_CONNECTED_NC_F16, unit_batch) {
430 FullyConnectedOperatorTester()
431 .batch_size(1)
432 .input_channels(23)
433 .output_channels(19)
434 .iterations(3)
435 .TestF16();
436 }
437
TEST(FULLY_CONNECTED_NC_F16,unit_batch_with_qmin)438 TEST(FULLY_CONNECTED_NC_F16, unit_batch_with_qmin) {
439 FullyConnectedOperatorTester()
440 .batch_size(1)
441 .input_channels(23)
442 .output_channels(19)
443 .qmin(128)
444 .iterations(3)
445 .TestF16();
446 }
447
TEST(FULLY_CONNECTED_NC_F16,unit_batch_with_qmax)448 TEST(FULLY_CONNECTED_NC_F16, unit_batch_with_qmax) {
449 FullyConnectedOperatorTester()
450 .batch_size(1)
451 .input_channels(23)
452 .output_channels(19)
453 .qmax(128)
454 .iterations(3)
455 .TestF16();
456 }
457
TEST(FULLY_CONNECTED_NC_F16,unit_batch_with_input_stride)458 TEST(FULLY_CONNECTED_NC_F16, unit_batch_with_input_stride) {
459 FullyConnectedOperatorTester()
460 .batch_size(1)
461 .input_channels(23)
462 .input_stride(28)
463 .output_channels(19)
464 .iterations(3)
465 .TestF16();
466 }
467
TEST(FULLY_CONNECTED_NC_F16,unit_batch_with_output_stride)468 TEST(FULLY_CONNECTED_NC_F16, unit_batch_with_output_stride) {
469 FullyConnectedOperatorTester()
470 .batch_size(1)
471 .input_channels(23)
472 .output_channels(19)
473 .output_stride(29)
474 .iterations(3)
475 .TestF16();
476 }
477
TEST(FULLY_CONNECTED_NC_F16,unit_batch_transpose_weights)478 TEST(FULLY_CONNECTED_NC_F16, unit_batch_transpose_weights) {
479 FullyConnectedOperatorTester()
480 .transpose_weights(true)
481 .batch_size(1)
482 .input_channels(23)
483 .output_channels(19)
484 .iterations(3)
485 .TestF16();
486 }
487
TEST(FULLY_CONNECTED_NC_F16,unit_batch_without_bias)488 TEST(FULLY_CONNECTED_NC_F16, unit_batch_without_bias) {
489 FullyConnectedOperatorTester()
490 .has_bias(false)
491 .batch_size(1)
492 .input_channels(23)
493 .output_channels(19)
494 .iterations(3)
495 .TestF16();
496 }
497
TEST(FULLY_CONNECTED_NC_F16,small_batch)498 TEST(FULLY_CONNECTED_NC_F16, small_batch) {
499 FullyConnectedOperatorTester()
500 .batch_size(12)
501 .input_channels(23)
502 .output_channels(19)
503 .iterations(3)
504 .TestF16();
505 }
506
TEST(FULLY_CONNECTED_NC_F16,small_batch_fp32_weights)507 TEST(FULLY_CONNECTED_NC_F16, small_batch_fp32_weights) {
508 FullyConnectedOperatorTester()
509 .weights_type(FullyConnectedOperatorTester::WeightsType::FP32)
510 .batch_size(12)
511 .input_channels(23)
512 .output_channels(19)
513 .iterations(3)
514 .TestF16();
515 }
516
TEST(FULLY_CONNECTED_NC_F16,small_batch_with_qmin)517 TEST(FULLY_CONNECTED_NC_F16, small_batch_with_qmin) {
518 FullyConnectedOperatorTester()
519 .batch_size(12)
520 .input_channels(23)
521 .output_channels(19)
522 .qmin(128)
523 .iterations(3)
524 .TestF16();
525 }
526
TEST(FULLY_CONNECTED_NC_F16,small_batch_with_qmax)527 TEST(FULLY_CONNECTED_NC_F16, small_batch_with_qmax) {
528 FullyConnectedOperatorTester()
529 .batch_size(12)
530 .input_channels(23)
531 .output_channels(19)
532 .qmax(128)
533 .iterations(3)
534 .TestF16();
535 }
536
TEST(FULLY_CONNECTED_NC_F16,small_batch_with_input_stride)537 TEST(FULLY_CONNECTED_NC_F16, small_batch_with_input_stride) {
538 FullyConnectedOperatorTester()
539 .batch_size(12)
540 .input_channels(23)
541 .input_stride(28)
542 .output_channels(19)
543 .iterations(3)
544 .TestF16();
545 }
546
TEST(FULLY_CONNECTED_NC_F16,small_batch_with_output_stride)547 TEST(FULLY_CONNECTED_NC_F16, small_batch_with_output_stride) {
548 FullyConnectedOperatorTester()
549 .batch_size(12)
550 .input_channels(23)
551 .output_channels(19)
552 .output_stride(29)
553 .iterations(3)
554 .TestF16();
555 }
556
TEST(FULLY_CONNECTED_NC_F16,small_batch_transpose_fp32_weights)557 TEST(FULLY_CONNECTED_NC_F16, small_batch_transpose_fp32_weights) {
558 FullyConnectedOperatorTester()
559 .weights_type(FullyConnectedOperatorTester::WeightsType::FP32)
560 .transpose_weights(true)
561 .batch_size(12)
562 .input_channels(23)
563 .output_channels(19)
564 .iterations(3)
565 .TestF16();
566 }
567
TEST(FULLY_CONNECTED_NC_F16,small_batch_without_bias)568 TEST(FULLY_CONNECTED_NC_F16, small_batch_without_bias) {
569 FullyConnectedOperatorTester()
570 .has_bias(false)
571 .batch_size(12)
572 .input_channels(23)
573 .output_channels(19)
574 .iterations(3)
575 .TestF16();
576 }
577