mutable_function.h 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /* ----------------------------------------------------------------------
  2. * Project: TinyEngine
  3. * Title: mutable_function.h
  4. *
  5. * Reference papers:
  6. * - MCUNet: Tiny Deep Learning on IoT Device, NeurIPS 2020
  7. * - MCUNetV2: Memory-Efficient Patch-based Inference for Tiny Deep Learning, NeurIPS 2021
  8. * - MCUNetV3: On-Device Training Under 256KB Memory, NeurIPS 2022
  9. * Contact authors:
  10. * - Wei-Ming Chen, wmchen@mit.edu
  11. * - Wei-Chen Wang, wweichen@mit.edu
  12. * - Ji Lin, jilin@mit.edu
  13. * - Ligeng Zhu, ligeng@mit.edu
  14. * - Song Han, songhan@mit.edu
  15. *
  16. * Target ISA: ARMv7E-M
  17. * -------------------------------------------------------------------- */
  18. #ifndef TINYENGINE_SOURCE_CONVOLUTIONFUNCTIONS_MIX_MUTABLE_FUNCTION_H_
  19. #define TINYENGINE_SOURCE_CONVOLUTIONFUNCTIONS_MIX_MUTABLE_FUNCTION_H_
  20. /* mutable functions */
  21. #if KERNEL_PRE == 4
  22. #define mix_read_and_pad_reordered b4_read_and_pad_reordered
  23. #define mix_nn_read_q7x4 b4_nn_read_q7x4
  24. #define mix_read_and_pad b4_read_and_pad
  25. #elif KERNEL_PRE == 2
  26. #define mix_read_and_pad_reordered b2_read_and_pad_reordered
  27. #define mix_nn_read_q7x4 b2_nn_read_q7x4
  28. #define mix_read_and_pad b2_read_and_pad
  29. #else
  30. #define mix_read_and_pad_reordered read_and_pad_reordered
  31. #define mix_nn_read_q7x4 hpm_nn_read_q7x4
  32. #define mix_read_and_pad read_and_pad
  33. #endif
  34. #if INPUT_PRE == 4
  35. #define mix_q7_q15_offset_ele b4_q7_q15_offset_ele
  36. #elif INPUT_PRE == 2
  37. #define mix_q7_q15_offset_ele b2_q7_q15_offset_ele
  38. #else
  39. #define mix_q7_q15_offset_ele q7_q15_offset_ele
  40. #endif
  41. #if INPUT_PRE == 4
  42. #define mix_q7_q15_offset_reordered_ele b4_q15_offset_reordered_ele
  43. #define mix_load_1row_1col b4_load_1row_1col
  44. #define mix_load_1row_2col b4_load_1row_2col
  45. #define mix_load_1row_3col b4_load_1row_3col
  46. #define mix_load_1row_4col b4_load_1row_4col
  47. #define mix_load_1row_5col b4_load_1row_5col
  48. #define mix_load_1row_6col b4_load_1row_6col
  49. #define mix_load_1row_7col b4_load_1row_7col
  50. #define mix_load_2row_1col b4_load_2row_1col
  51. #define mix_load_2row_2col b4_load_2row_2col
  52. #define mix_load_2row_3col b4_load_2row_3col
  53. #define mix_load_2row_4col b4_load_2row_4col
  54. #define mix_load_2row_5col b4_load_2row_5col
  55. #define mix_load_2row_6col b4_load_2row_6col
  56. #define mix_load_2row_7col b4_load_2row_7col
  57. #define mix_load_3row_1col b4_load_3row_1col
  58. #define mix_load_3row_2col b4_load_3row_2col
  59. #define mix_load_3row_3col b4_load_3row_3col
  60. #define mix_load_3row_4col b4_load_3row_4col
  61. #define mix_load_3row_5col b4_load_3row_5col
  62. #define mix_load_3row_6col b4_load_3row_6col
  63. #define mix_load_3row_7col b4_load_3row_7col
  64. #define mix_load_4row_1col b4_load_4row_1col
  65. #define mix_load_4row_2col b4_load_4row_2col
  66. #define mix_load_4row_3col b4_load_4row_3col
  67. #define mix_load_4row_4col b4_load_4row_4col
  68. #define mix_load_4row_5col b4_load_4row_5col
  69. #define mix_load_4row_6col b4_load_4row_6col
  70. #define mix_load_4row_7col b4_load_4row_7col
  71. #define mix_load_5row_1col b4_load_5row_1col
  72. #define mix_load_5row_2col b4_load_5row_2col
  73. #define mix_load_5row_3col b4_load_5row_3col
  74. #define mix_load_5row_4col b4_load_5row_4col
  75. #define mix_load_5row_5col b4_load_5row_5col
  76. #define mix_load_5row_6col b4_load_5row_6col
  77. #define mix_load_5row_7col b4_load_5row_7col
  78. #define mix_load_6row_1col b4_load_6row_1col
  79. #define mix_load_6row_2col b4_load_6row_2col
  80. #define mix_load_6row_3col b4_load_6row_3col
  81. #define mix_load_6row_4col b4_load_6row_4col
  82. #define mix_load_6row_5col b4_load_6row_5col
  83. #define mix_load_6row_6col b4_load_6row_6col
  84. #define mix_load_6row_7col b4_load_6row_7col
  85. #define mix_load_7row_1col b4_load_7row_1col
  86. #define mix_load_7row_2col b4_load_7row_2col
  87. #define mix_load_7row_3col b4_load_7row_3col
  88. #define mix_load_7row_4col b4_load_7row_4col
  89. #define mix_load_7row_5col b4_load_7row_5col
  90. #define mix_load_7row_6col b4_load_7row_6col
  91. #define mix_load_7row_7col b4_load_7row_7col
  92. #elif INPUT_PRE == 2
  93. #define mix_q7_q15_offset_reordered_ele b2_q15_offset_reordered_ele
  94. #define mix_load_1row_1col b2_load_1row_1col
  95. #define mix_load_1row_2col b2_load_1row_2col
  96. #define mix_load_1row_3col b2_load_1row_3col
  97. #define mix_load_1row_4col b2_load_1row_4col
  98. #define mix_load_1row_5col b2_load_1row_5col
  99. #define mix_load_1row_6col b2_load_1row_6col
  100. #define mix_load_1row_7col b2_load_1row_7col
  101. #define mix_load_2row_1col b2_load_2row_1col
  102. #define mix_load_2row_2col b2_load_2row_2col
  103. #define mix_load_2row_3col b2_load_2row_3col
  104. #define mix_load_2row_4col b2_load_2row_4col
  105. #define mix_load_2row_5col b2_load_2row_5col
  106. #define mix_load_2row_6col b2_load_2row_6col
  107. #define mix_load_2row_7col b2_load_2row_7col
  108. #define mix_load_3row_1col b2_load_3row_1col
  109. #define mix_load_3row_2col b2_load_3row_2col
  110. #define mix_load_3row_3col b2_load_3row_3col
  111. #define mix_load_3row_4col b2_load_3row_4col
  112. #define mix_load_3row_5col b2_load_3row_5col
  113. #define mix_load_3row_6col b2_load_3row_6col
  114. #define mix_load_3row_7col b2_load_3row_7col
  115. #define mix_load_4row_1col b2_load_4row_1col
  116. #define mix_load_4row_2col b2_load_4row_2col
  117. #define mix_load_4row_3col b2_load_4row_3col
  118. #define mix_load_4row_4col b2_load_4row_4col
  119. #define mix_load_4row_5col b2_load_4row_5col
  120. #define mix_load_4row_6col b2_load_4row_6col
  121. #define mix_load_4row_7col b2_load_4row_7col
  122. #define mix_load_5row_1col b2_load_5row_1col
  123. #define mix_load_5row_2col b2_load_5row_2col
  124. #define mix_load_5row_3col b2_load_5row_3col
  125. #define mix_load_5row_4col b2_load_5row_4col
  126. #define mix_load_5row_5col b2_load_5row_5col
  127. #define mix_load_5row_6col b2_load_5row_6col
  128. #define mix_load_5row_7col b2_load_5row_7col
  129. #define mix_load_6row_1col b2_load_6row_1col
  130. #define mix_load_6row_2col b2_load_6row_2col
  131. #define mix_load_6row_3col b2_load_6row_3col
  132. #define mix_load_6row_4col b2_load_6row_4col
  133. #define mix_load_6row_5col b2_load_6row_5col
  134. #define mix_load_6row_6col b2_load_6row_6col
  135. #define mix_load_6row_7col b2_load_6row_7col
  136. #define mix_load_7row_1col b2_load_7row_1col
  137. #define mix_load_7row_2col b2_load_7row_2col
  138. #define mix_load_7row_3col b2_load_7row_3col
  139. #define mix_load_7row_4col b2_load_7row_4col
  140. #define mix_load_7row_5col b2_load_7row_5col
  141. #define mix_load_7row_6col b2_load_7row_6col
  142. #define mix_load_7row_7col b2_load_7row_7col
  143. #else
  144. #define mix_q7_q15_offset_reordered_ele q7_q15_offset_reordered_ele
  145. #define mix_load_1row_1col load_1row_1col
  146. #define mix_load_1row_2col load_1row_2col
  147. #define mix_load_1row_3col load_1row_3col
  148. #define mix_load_1row_4col load_1row_4col
  149. #define mix_load_1row_5col load_1row_5col
  150. #define mix_load_1row_6col load_1row_6col
  151. #define mix_load_1row_7col load_1row_7col
  152. #define mix_load_2row_1col load_2row_1col
  153. #define mix_load_2row_2col load_2row_2col
  154. #define mix_load_2row_3col load_2row_3col
  155. #define mix_load_2row_4col load_2row_4col
  156. #define mix_load_2row_5col load_2row_5col
  157. #define mix_load_2row_6col load_2row_6col
  158. #define mix_load_2row_7col load_2row_7col
  159. #define mix_load_3row_1col load_3row_1col
  160. #define mix_load_3row_2col load_3row_2col
  161. #define mix_load_3row_3col load_3row_3col
  162. #define mix_load_3row_4col load_3row_4col
  163. #define mix_load_3row_5col load_3row_5col
  164. #define mix_load_3row_6col load_3row_6col
  165. #define mix_load_3row_7col load_3row_7col
  166. #define mix_load_4row_1col load_4row_1col
  167. #define mix_load_4row_2col load_4row_2col
  168. #define mix_load_4row_3col load_4row_3col
  169. #define mix_load_4row_4col load_4row_4col
  170. #define mix_load_4row_5col load_4row_5col
  171. #define mix_load_4row_6col load_4row_6col
  172. #define mix_load_4row_7col load_4row_7col
  173. #define mix_load_5row_1col load_5row_1col
  174. #define mix_load_5row_2col load_5row_2col
  175. #define mix_load_5row_3col load_5row_3col
  176. #define mix_load_5row_4col load_5row_4col
  177. #define mix_load_5row_5col load_5row_5col
  178. #define mix_load_5row_6col load_5row_6col
  179. #define mix_load_5row_7col load_5row_7col
  180. #define mix_load_6row_1col load_6row_1col
  181. #define mix_load_6row_2col load_6row_2col
  182. #define mix_load_6row_3col load_6row_3col
  183. #define mix_load_6row_4col load_6row_4col
  184. #define mix_load_6row_5col load_6row_5col
  185. #define mix_load_6row_6col load_6row_6col
  186. #define mix_load_6row_7col load_6row_7col
  187. #define mix_load_7row_1col load_7row_1col
  188. #define mix_load_7row_2col load_7row_2col
  189. #define mix_load_7row_3col load_7row_3col
  190. #define mix_load_7row_4col load_7row_4col
  191. #define mix_load_7row_5col load_7row_5col
  192. #define mix_load_7row_6col load_7row_6col
  193. #define mix_load_7row_7col load_7row_7col
  194. #endif
  195. #if OUTPUT_PRE == 4
  196. #define mix_assign_requantize() b4_assign_requantize()
  197. #elif OUTPUT_PRE == 2
  198. #define mix_assign_requantize() b2_assign_requantize()
  199. #else
  200. #define mix_assign_requantize() assign_requantize()
  201. #endif
  202. #if KERNEL_PRE == 4
  203. #if OUTPUT_PRE == 4
  204. #define mix_nn_mat_mult_kernel_s8_s16_reordered b44_nn_mat_mult_kernel_s8_s16_reordered
  205. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b44_nn_mat_mult_kernel_s8_s16_reordered_8mul
  206. #elif OUTPUT_PRE == 2
  207. #define mix_nn_mat_mult_kernel_s8_s16_reordered b42_nn_mat_mult_kernel_s8_s16_reordered
  208. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b42_nn_mat_mult_kernel_s8_s16_reordered_8mul
  209. #else
  210. #define mix_nn_mat_mult_kernel_s8_s16_reordered b48_nn_mat_mult_kernel_s8_s16_reordered
  211. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b48_nn_mat_mult_kernel_s8_s16_reordered_8mul
  212. #endif//OUTPUT
  213. #elif KERNEL_PRE == 2
  214. #if OUTPUT_PRE == 4
  215. #define mix_nn_mat_mult_kernel_s8_s16_reordered b24_nn_mat_mult_kernel_s8_s16_reordered
  216. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b24_nn_mat_mult_kernel_s8_s16_reordered_8mul
  217. #elif OUTPUT_PRE == 2
  218. #define mix_nn_mat_mult_kernel_s8_s16_reordered b22_nn_mat_mult_kernel_s8_s16_reordered
  219. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b22_nn_mat_mult_kernel_s8_s16_reordered_8mul
  220. #else
  221. #define mix_nn_mat_mult_kernel_s8_s16_reordered b28_nn_mat_mult_kernel_s8_s16_reordered
  222. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul b28_nn_mat_mult_kernel_s8_s16_reordered_8mul
  223. #endif//OUTPUT
  224. #else
  225. #define mix_nn_mat_mult_kernel_s8_s16_reordered hpm_nn_mat_mult_kernel_s8_s16_reordered_8mul
  226. #define mix_nn_mat_mult_kernel_s8_s16_reordered_8mul hpm_nn_mat_mult_kernel_s8_s16_reordered_8mul
  227. #endif
  228. #endif /* TINYENGINE_SOURCE_CONVOLUTIONFUNCTIONS_MIX_MUTABLE_FUNCTION_H_ */