FullyConnected.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. #include "FullyConnected.h"
  2. #include "Error.h"
  3. #include "arm_nnfunctions.h"
  4. #include "Test.h"
  5. #include <cstdio>
  6. void printPattern(char *s,Client::AnyPattern<q7_t> pat)
  7. {
  8. q7_t *p=pat.ptr();
  9. printf("%s\n",s);
  10. for(int i=0;i < pat.nbSamples(); i++)
  11. {
  12. printf("0x%02x\n",p[i]);
  13. }
  14. printf("----\n");
  15. }
  16. void FullyConnected::test_fully_connected_tflite_s8()
  17. {
  18. q7_t *inp=input.ptr();
  19. q7_t *biasp=bias.ptr();
  20. q7_t *weightp=weight.ptr();
  21. q7_t *outp=output.ptr();
  22. q7_t *refp=ref.ptr();
  23. q15_t *tempp=temp.ptr();
  24. arm_fully_connected_s8((int8_t*)inp
  25. ,(const int8_t*)weightp
  26. ,colDim
  27. ,rowDim
  28. ,nb_batches
  29. ,input_offset
  30. ,filter_offset
  31. ,output_mult
  32. ,output_shift
  33. ,output_offset
  34. ,(const int8_t*)biasp
  35. ,(int8_t*)outp
  36. ,act_min
  37. ,act_max
  38. ,tempp
  39. );
  40. ASSERT_EQ(ref,output);
  41. }
  42. void FullyConnected::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  43. {
  44. nb_batches = 1;
  45. switch(id)
  46. {
  47. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_1:
  48. output_mult = 1073741824;
  49. output_shift = -1;
  50. filter_offset = 1;
  51. input_offset = 1;
  52. output_offset = -1;
  53. act_min =-128;
  54. act_max= 127;
  55. input.reload(FullyConnected::INPUT1_S8_ID,mgr);
  56. bias.reload(FullyConnected::BIAS1_S8_ID,mgr);
  57. weight.reload(FullyConnected::WEIGHT1_S8_ID,mgr);
  58. ref.reload(FullyConnected::REF1_S8_ID,mgr);
  59. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  60. temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
  61. colDim=input.nbSamples();
  62. rowDim=output.nbSamples();
  63. break;
  64. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_2:
  65. output_mult = 1073741824;
  66. output_shift = 1;
  67. filter_offset = 1;
  68. input_offset = 1;
  69. output_offset = -1;
  70. act_min =-128;
  71. act_max= 127;
  72. input.reload(FullyConnected::INPUT2_S8_ID,mgr);
  73. bias.reload(FullyConnected::BIAS2_S8_ID,mgr);
  74. weight.reload(FullyConnected::WEIGHT2_S8_ID,mgr);
  75. ref.reload(FullyConnected::REF2_S8_ID,mgr);
  76. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  77. temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
  78. colDim=input.nbSamples();
  79. rowDim=output.nbSamples();
  80. break;
  81. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_3:
  82. output_mult = 1073741824;
  83. output_shift = 2;
  84. filter_offset = 1;
  85. input_offset = 1;
  86. output_offset = -1;
  87. act_min =-1;
  88. act_max= 127;
  89. input.reload(FullyConnected::INPUT3_S8_ID,mgr);
  90. bias.reload(FullyConnected::BIAS3_S8_ID,mgr);
  91. weight.reload(FullyConnected::WEIGHT3_S8_ID,mgr);
  92. ref.reload(FullyConnected::REF3_S8_ID,mgr);
  93. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  94. temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
  95. colDim=input.nbSamples();
  96. rowDim=output.nbSamples();
  97. break;
  98. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_4:
  99. output_mult = 1073741824;
  100. output_shift = 1;
  101. filter_offset = 1;
  102. input_offset = 1;
  103. output_offset = -1;
  104. act_min =-128;
  105. act_max= 127;
  106. input.reload(FullyConnected::INPUT4_S8_ID,mgr);
  107. bias.reload(FullyConnected::BIAS4_S8_ID,mgr);
  108. weight.reload(FullyConnected::WEIGHT4_S8_ID,mgr);
  109. ref.reload(FullyConnected::REF4_S8_ID,mgr);
  110. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  111. temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
  112. colDim=input.nbSamples();
  113. rowDim=output.nbSamples();
  114. break;
  115. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_5:
  116. output_mult = 1073741824;
  117. output_shift = 1;
  118. filter_offset = 1;
  119. input_offset = 1;
  120. output_offset = -1;
  121. act_min =-128;
  122. act_max= 127;
  123. input.reload(FullyConnected::INPUT5_S8_ID,mgr);
  124. bias.reload(FullyConnected::BIAS5_S8_ID,mgr);
  125. weight.reload(FullyConnected::WEIGHT5_S8_ID,mgr);
  126. ref.reload(FullyConnected::REF5_S8_ID,mgr);
  127. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  128. temp.create(input.nbSamples(),FullyConnected::TEMP_S16_ID,mgr);
  129. colDim=input.nbSamples();
  130. rowDim=output.nbSamples();
  131. break;
  132. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_6:
  133. output_mult = 1073741824;
  134. output_shift = -1;
  135. filter_offset = 1;
  136. input_offset = 1;
  137. output_offset = -1;
  138. act_min =-128;
  139. act_max= 127;
  140. nb_batches=9;
  141. colDim=6;
  142. rowDim=1;
  143. input.reload(FullyConnected::INPUT6_S8_ID,mgr);
  144. bias.reload(FullyConnected::BIAS6_S8_ID,mgr);
  145. weight.reload(FullyConnected::WEIGHT6_S8_ID,mgr);
  146. ref.reload(FullyConnected::REF6_S8_ID,mgr);
  147. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  148. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  149. break;
  150. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_7:
  151. output_mult = 1073741824;
  152. output_shift = -1;
  153. filter_offset = 1;
  154. input_offset = 1;
  155. output_offset = -1;
  156. act_min =-128;
  157. act_max= 127;
  158. nb_batches=8;
  159. colDim=8;
  160. rowDim=1;
  161. input.reload(FullyConnected::INPUT7_S8_ID,mgr);
  162. bias.reload(FullyConnected::BIAS7_S8_ID,mgr);
  163. weight.reload(FullyConnected::WEIGHT7_S8_ID,mgr);
  164. ref.reload(FullyConnected::REF7_S8_ID,mgr);
  165. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  166. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  167. break;
  168. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_8:
  169. output_mult = 1073741824;
  170. output_shift = -1;
  171. filter_offset = 1;
  172. input_offset = 1;
  173. output_offset = -1;
  174. act_min =-128;
  175. act_max= 127;
  176. nb_batches=4;
  177. colDim=10;
  178. rowDim=1;
  179. input.reload(FullyConnected::INPUT8_S8_ID,mgr);
  180. bias.reload(FullyConnected::BIAS8_S8_ID,mgr);
  181. weight.reload(FullyConnected::WEIGHT8_S8_ID,mgr);
  182. ref.reload(FullyConnected::REF8_S8_ID,mgr);
  183. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  184. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  185. break;
  186. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_9:
  187. output_mult = 1073741824;
  188. output_shift = -1;
  189. filter_offset = 1;
  190. input_offset = 1;
  191. output_offset = -1;
  192. act_min =-128;
  193. act_max= 127;
  194. nb_batches=9;
  195. colDim=6;
  196. rowDim=1;
  197. input.reload(FullyConnected::INPUT9_S8_ID,mgr);
  198. bias.reload(FullyConnected::BIAS9_S8_ID,mgr);
  199. weight.reload(FullyConnected::WEIGHT9_S8_ID,mgr);
  200. ref.reload(FullyConnected::REF9_S8_ID,mgr);
  201. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  202. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  203. break;
  204. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_10:
  205. output_mult = 1073741824;
  206. output_shift = -1;
  207. filter_offset = 1;
  208. input_offset = 1;
  209. output_offset = -1;
  210. act_min =-128;
  211. act_max= 127;
  212. nb_batches=4;
  213. colDim=10;
  214. rowDim=1;
  215. input.reload(FullyConnected::INPUT10_S8_ID,mgr);
  216. bias.reload(FullyConnected::BIAS10_S8_ID,mgr);
  217. weight.reload(FullyConnected::WEIGHT10_S8_ID,mgr);
  218. ref.reload(FullyConnected::REF10_S8_ID,mgr);
  219. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  220. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  221. break;
  222. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_11:
  223. output_mult = 1073741824;
  224. output_shift = -1;
  225. filter_offset = 1;
  226. input_offset = 1;
  227. output_offset = -1;
  228. act_min =-128;
  229. act_max= 127;
  230. nb_batches=8;
  231. colDim=8;
  232. rowDim=1;
  233. input.reload(FullyConnected::INPUT11_S8_ID,mgr);
  234. bias.reload(FullyConnected::BIAS11_S8_ID,mgr);
  235. weight.reload(FullyConnected::WEIGHT11_S8_ID,mgr);
  236. ref.reload(FullyConnected::REF11_S8_ID,mgr);
  237. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  238. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  239. break;
  240. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_12:
  241. output_mult = 1073741824;
  242. output_shift = 1;
  243. filter_offset = 0;
  244. input_offset = 0;
  245. output_offset = 0;
  246. act_min =-128;
  247. act_max= 127;
  248. nb_batches=9;
  249. colDim=8;
  250. rowDim=4;
  251. input.reload(FullyConnected::INPUT12_S8_ID,mgr);
  252. bias.reload(FullyConnected::BIAS12_S8_ID,mgr);
  253. weight.reload(FullyConnected::WEIGHT12_S8_ID,mgr);
  254. ref.reload(FullyConnected::REF12_S8_ID,mgr);
  255. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  256. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  257. break;
  258. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_13:
  259. output_mult = 1077969154;
  260. output_shift = 2;
  261. filter_offset = 0;
  262. input_offset = 0;
  263. output_offset = 1;
  264. act_min =-128;
  265. act_max= 127;
  266. nb_batches=8;
  267. colDim=8;
  268. rowDim=5;
  269. input.reload(FullyConnected::INPUT13_S8_ID,mgr);
  270. bias.reload(FullyConnected::BIAS13_S8_ID,mgr);
  271. weight.reload(FullyConnected::WEIGHT13_S8_ID,mgr);
  272. ref.reload(FullyConnected::REF13_S8_ID,mgr);
  273. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  274. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  275. break;
  276. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_14:
  277. output_mult = 1073741824;
  278. output_shift = 1;
  279. filter_offset = 1;
  280. input_offset = 1;
  281. output_offset = -1;
  282. act_min =-128;
  283. act_max= 127;
  284. nb_batches=4;
  285. colDim=7;
  286. rowDim=3;
  287. input.reload(FullyConnected::INPUT14_S8_ID,mgr);
  288. bias.reload(FullyConnected::BIAS14_S8_ID,mgr);
  289. weight.reload(FullyConnected::WEIGHT14_S8_ID,mgr);
  290. ref.reload(FullyConnected::REF14_S8_ID,mgr);
  291. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  292. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  293. break;
  294. case FullyConnected::TEST_FULLY_CONNECTED_TFLITE_S8_15:
  295. output_mult = 1073741824;
  296. output_shift = 1;
  297. filter_offset = 1;
  298. input_offset = 1;
  299. output_offset = -1;
  300. act_min =-128;
  301. act_max= 127;
  302. nb_batches=8;
  303. colDim=7;
  304. rowDim=4;
  305. input.reload(FullyConnected::INPUT15_S8_ID,mgr);
  306. bias.reload(FullyConnected::BIAS15_S8_ID,mgr);
  307. weight.reload(FullyConnected::WEIGHT15_S8_ID,mgr);
  308. ref.reload(FullyConnected::REF15_S8_ID,mgr);
  309. output.create(ref.nbSamples(),FullyConnected::OUTPUT_S8_ID,mgr);
  310. temp.create(colDim,FullyConnected::TEMP_S16_ID,mgr);
  311. break;
  312. }
  313. }
  314. void FullyConnected::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  315. {
  316. output.dump(mgr);
  317. }