1 #include "FullyConnected.h"
2 #include <stdio.h>
3 #include "Error.h"
4 #include "arm_nnfunctions.h"
5 #include "Test.h"
6 #include "stdio.h"
7
8
9
printPattern(char * s,Client::AnyPattern<q7_t> pat)10 void printPattern(char *s,Client::AnyPattern<q7_t> pat)
11 {
12 q7_t *p=pat.ptr();
13 printf("%s\n",s);
14 for(int i=0;i < pat.nbSamples(); i++)
15 {
16 printf("0x%02x\n",p[i]);
17 }
18 printf("----\n");
19 }
20
test_fully_connected_tflite_s8()21 void FullyConnected::test_fully_connected_tflite_s8()
22 {
23
24 q7_t *inp=input.ptr();
25 q31_t *biasp=bias.ptr();
26 q7_t *weightp=weight.ptr();
27 q7_t *outp=output.ptr();
28 q7_t *refp=ref.ptr();
29 q15_t *tempp=temp.ptr();
30
31 arm_fully_connected_s8((int8_t*)inp
32 ,(const int8_t*)weightp
33 ,colDim
34 ,rowDim
35 ,nb_batches
36 ,input_offset
37 ,filter_offset
38 ,output_mult
39 ,output_shift
40 ,output_offset
41 ,(const int32_t*)biasp
42 ,(int8_t*)outp
43 ,act_min
44 ,act_max
45 ,tempp
46 );
47
48 ASSERT_EQ(ref,output);
49 }
50
51
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)52 void FullyConnected::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
53 {
54
55
56 nb_batches = 1;
57
58
59 switch(id)
60 {
61 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_1:
62 output_mult = 1073741824;
63 output_shift = -1;
64 filter_offset = 1;
65 input_offset = 1;
66 output_offset = -1;
67 act_min =-128;
68 act_max= 127;
69
70 input.reload(FullyConnected::INPUT1_S8_ID,mgr);
71 bias.reload(FullyConnected::BIAS1_S8_ID,mgr);
72 weight.reload(FullyConnected::WEIGHT1_S8_ID,mgr);
73
74 ref.reload(FullyConnected::REF1_S8_ID,mgr);
75
76 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
77 temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
78
79 colDim=input.nbSamples();
80 rowDim=output.nbSamples();
81 break;
82
83 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_2:
84 output_mult = 1073741824;
85 output_shift = 1;
86 filter_offset = 1;
87 input_offset = 1;
88 output_offset = -1;
89 act_min =-128;
90 act_max= 127;
91
92 input.reload(FullyConnected::INPUT2_S8_ID,mgr);
93 bias.reload(FullyConnected::BIAS2_S8_ID,mgr);
94 weight.reload(FullyConnected::WEIGHT2_S8_ID,mgr);
95
96 ref.reload(FullyConnected::REF2_S8_ID,mgr);
97
98 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
99 temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
100
101 colDim=input.nbSamples();
102 rowDim=output.nbSamples();
103 break;
104
105 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_3:
106 output_mult = 1073741824;
107 output_shift = 2;
108 filter_offset = 1;
109 input_offset = 1;
110 output_offset = -1;
111 act_min =-1;
112 act_max= 127;
113
114 input.reload(FullyConnected::INPUT3_S8_ID,mgr);
115 bias.reload(FullyConnected::BIAS3_S8_ID,mgr);
116 weight.reload(FullyConnected::WEIGHT3_S8_ID,mgr);
117
118 ref.reload(FullyConnected::REF3_S8_ID,mgr);
119
120 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
121 temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
122
123 colDim=input.nbSamples();
124 rowDim=output.nbSamples();
125 break;
126
127 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_4:
128
129 output_mult = 1073741824;
130 output_shift = 1;
131 filter_offset = 1;
132 input_offset = 1;
133 output_offset = -1;
134 act_min =-128;
135 act_max= 127;
136
137
138 input.reload(FullyConnected::INPUT4_S8_ID,mgr);
139 bias.reload(FullyConnected::BIAS4_S8_ID,mgr);
140 weight.reload(FullyConnected::WEIGHT4_S8_ID,mgr);
141
142 ref.reload(FullyConnected::REF4_S8_ID,mgr);
143
144 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
145 temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
146
147 colDim=input.nbSamples();
148 rowDim=output.nbSamples();
149 break;
150
151 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_5:
152
153 output_mult = 1073741824;
154 output_shift = 1;
155 filter_offset = 1;
156 input_offset = 1;
157 output_offset = -1;
158 act_min =-128;
159 act_max= 127;
160
161
162 input.reload(FullyConnected::INPUT5_S8_ID,mgr);
163 bias.reload(FullyConnected::BIAS5_S8_ID,mgr);
164 weight.reload(FullyConnected::WEIGHT5_S8_ID,mgr);
165
166 ref.reload(FullyConnected::REF5_S8_ID,mgr);
167
168 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
169 temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
170
171 colDim=input.nbSamples();
172 rowDim=output.nbSamples();
173 break;
174
175 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_6:
176 output_mult = 1073741824;
177 output_shift = -1;
178 filter_offset = 1;
179 input_offset = 1;
180 output_offset = -1;
181 act_min =-128;
182 act_max= 127;
183
184
185 nb_batches=9;
186
187 colDim=6;
188 rowDim=1;
189
190 input.reload(FullyConnected::INPUT6_S8_ID,mgr);
191 bias.reload(FullyConnected::BIAS6_S8_ID,mgr);
192 weight.reload(FullyConnected::WEIGHT6_S8_ID,mgr);
193
194 ref.reload(FullyConnected::REF6_S8_ID,mgr);
195
196 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
197 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
198 break;
199
200 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_7:
201 output_mult = 1073741824;
202 output_shift = -1;
203 filter_offset = 1;
204 input_offset = 1;
205 output_offset = -1;
206 act_min =-128;
207 act_max= 127;
208
209
210 nb_batches=8;
211
212 colDim=8;
213 rowDim=1;
214
215
216 input.reload(FullyConnected::INPUT7_S8_ID,mgr);
217 bias.reload(FullyConnected::BIAS7_S8_ID,mgr);
218 weight.reload(FullyConnected::WEIGHT7_S8_ID,mgr);
219
220 ref.reload(FullyConnected::REF7_S8_ID,mgr);
221
222 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
223 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
224 break;
225
226 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_8:
227 output_mult = 1073741824;
228 output_shift = -1;
229 filter_offset = 1;
230 input_offset = 1;
231 output_offset = -1;
232 act_min =-128;
233 act_max= 127;
234
235
236 nb_batches=4;
237
238 colDim=10;
239 rowDim=1;
240
241
242 input.reload(FullyConnected::INPUT8_S8_ID,mgr);
243 bias.reload(FullyConnected::BIAS8_S8_ID,mgr);
244 weight.reload(FullyConnected::WEIGHT8_S8_ID,mgr);
245
246 ref.reload(FullyConnected::REF8_S8_ID,mgr);
247
248 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
249 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
250 break;
251
252 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_9:
253 output_mult = 1073741824;
254 output_shift = -1;
255 filter_offset = 1;
256 input_offset = 1;
257 output_offset = -1;
258 act_min =-128;
259 act_max= 127;
260
261
262 nb_batches=9;
263
264 colDim=6;
265 rowDim=1;
266
267 input.reload(FullyConnected::INPUT9_S8_ID,mgr);
268 bias.reload(FullyConnected::BIAS9_S8_ID,mgr);
269 weight.reload(FullyConnected::WEIGHT9_S8_ID,mgr);
270
271 ref.reload(FullyConnected::REF9_S8_ID,mgr);
272
273 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
274 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
275 break;
276
277 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_10:
278 output_mult = 1073741824;
279 output_shift = -1;
280 filter_offset = 1;
281 input_offset = 1;
282 output_offset = -1;
283 act_min =-128;
284 act_max= 127;
285
286
287 nb_batches=4;
288
289 colDim=10;
290 rowDim=1;
291
292 input.reload(FullyConnected::INPUT10_S8_ID,mgr);
293 bias.reload(FullyConnected::BIAS10_S8_ID,mgr);
294 weight.reload(FullyConnected::WEIGHT10_S8_ID,mgr);
295
296 ref.reload(FullyConnected::REF10_S8_ID,mgr);
297
298 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
299 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
300 break;
301
302 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_11:
303 output_mult = 1073741824;
304 output_shift = -1;
305 filter_offset = 1;
306 input_offset = 1;
307 output_offset = -1;
308 act_min =-128;
309 act_max= 127;
310
311
312 nb_batches=8;
313
314 colDim=8;
315 rowDim=1;
316
317 input.reload(FullyConnected::INPUT11_S8_ID,mgr);
318 bias.reload(FullyConnected::BIAS11_S8_ID,mgr);
319 weight.reload(FullyConnected::WEIGHT11_S8_ID,mgr);
320
321 ref.reload(FullyConnected::REF11_S8_ID,mgr);
322
323 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
324 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
325 break;
326
327 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_12:
328 output_mult = 1073741824;
329 output_shift = 1;
330 filter_offset = 0;
331 input_offset = 0;
332 output_offset = 0;
333 act_min =-128;
334 act_max= 127;
335
336
337 nb_batches=9;
338
339 colDim=8;
340 rowDim=4;
341
342
343 input.reload(FullyConnected::INPUT12_S8_ID,mgr);
344 bias.reload(FullyConnected::BIAS12_S8_ID,mgr);
345 weight.reload(FullyConnected::WEIGHT12_S8_ID,mgr);
346
347 ref.reload(FullyConnected::REF12_S8_ID,mgr);
348
349 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
350 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
351 break;
352
353 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_13:
354 output_mult = 1077969154;
355 output_shift = 2;
356 filter_offset = 0;
357 input_offset = 0;
358 output_offset = 1;
359 act_min =-128;
360 act_max= 127;
361
362
363 nb_batches=8;
364
365 colDim=8;
366 rowDim=5;
367
368 input.reload(FullyConnected::INPUT13_S8_ID,mgr);
369 bias.reload(FullyConnected::BIAS13_S8_ID,mgr);
370 weight.reload(FullyConnected::WEIGHT13_S8_ID,mgr);
371
372 ref.reload(FullyConnected::REF13_S8_ID,mgr);
373
374 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
375 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
376 break;
377
378 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_14:
379 output_mult = 1073741824;
380 output_shift = 1;
381 filter_offset = 1;
382 input_offset = 1;
383 output_offset = -1;
384 act_min =-128;
385 act_max= 127;
386
387
388 nb_batches=4;
389
390 colDim=7;
391 rowDim=3;
392
393
394 input.reload(FullyConnected::INPUT14_S8_ID,mgr);
395 bias.reload(FullyConnected::BIAS14_S8_ID,mgr);
396 weight.reload(FullyConnected::WEIGHT14_S8_ID,mgr);
397
398 ref.reload(FullyConnected::REF14_S8_ID,mgr);
399
400 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
401 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
402 break;
403
404 case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_15:
405 output_mult = 1073741824;
406 output_shift = 1;
407 filter_offset = 1;
408 input_offset = 1;
409 output_offset = -1;
410 act_min =-128;
411 act_max= 127;
412
413
414 nb_batches=8;
415
416 colDim=7;
417 rowDim=4;
418
419
420 input.reload(FullyConnected::INPUT15_S8_ID,mgr);
421 bias.reload(FullyConnected::BIAS15_S8_ID,mgr);
422 weight.reload(FullyConnected::WEIGHT15_S8_ID,mgr);
423
424 ref.reload(FullyConnected::REF15_S8_ID,mgr);
425
426 output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
427 temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
428 break;
429 }
430
431
432
433 }
434
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)435 void FullyConnected::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
436 {
437 output.dump(mgr);
438 }
439