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