av_matmul.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #include "stdlib.h"
  2. #include "util.h"
  3. #include "dataset.h"
  4. void __attribute__((noinline)) matmul(const int coreid, const int ncores, const int lda, const data_t A[], const data_t B[], data_t C[] )
  5. {
  6. //-----------------------------------------------------------------version 2.16, optimize v2.15 get rid of tempb. MSI 83K.w/ test one 81K.
  7. static __thread data_t TempA[8];
  8. static __thread data_t TempB[8];
  9. static __thread data_t TempC[8];
  10. static __thread int j,m,n;
  11. if(coreid == 1 || ncores == 1 )
  12. {
  13. for ( j = 16; j < 32; j++ )
  14. {
  15. for ( m = 0; m < 4; m++ )
  16. {
  17. TempA[0] = A[j*lda+0+8*m];
  18. TempA[1] = A[j*lda+1+8*m];
  19. TempA[2] = A[j*lda+2+8*m];
  20. TempA[3] = A[j*lda+3+8*m];
  21. TempA[4] = A[j*lda+4+8*m];
  22. TempA[5] = A[j*lda+5+8*m];
  23. TempA[6] = A[j*lda+6+8*m];
  24. TempA[7] = A[j*lda+7+8*m];
  25. for( n = 0; n < 4; n++)
  26. {
  27. TempC[0] = TempA[0] * B[(0+8*m)*lda+0+8*n];
  28. TempC[1] = TempA[0] * B[(0+8*m)*lda+1+8*n];
  29. TempC[2] = TempA[0] * B[(0+8*m)*lda+2+8*n];
  30. TempC[3] = TempA[0] * B[(0+8*m)*lda+3+8*n];
  31. TempC[4] = TempA[0] * B[(0+8*m)*lda+4+8*n];
  32. TempC[5] = TempA[0] * B[(0+8*m)*lda+5+8*n];
  33. TempC[6] = TempA[0] * B[(0+8*m)*lda+6+8*n];
  34. TempC[7] = TempA[0] * B[(0+8*m)*lda+7+8*n];
  35. TempC[0] += TempA[1] * B[(1+8*m)*lda+0+8*n];
  36. TempC[1] += TempA[1] * B[(1+8*m)*lda+1+8*n];
  37. TempC[2] += TempA[1] * B[(1+8*m)*lda+2+8*n];
  38. TempC[3] += TempA[1] * B[(1+8*m)*lda+3+8*n];
  39. TempC[4] += TempA[1] * B[(1+8*m)*lda+4+8*n];
  40. TempC[5] += TempA[1] * B[(1+8*m)*lda+5+8*n];
  41. TempC[6] += TempA[1] * B[(1+8*m)*lda+6+8*n];
  42. TempC[7] += TempA[1] * B[(1+8*m)*lda+7+8*n];
  43. TempC[0] += TempA[2] * B[(2+8*m)*lda+0+8*n];
  44. TempC[1] += TempA[2] * B[(2+8*m)*lda+1+8*n];
  45. TempC[2] += TempA[2] * B[(2+8*m)*lda+2+8*n];
  46. TempC[3] += TempA[2] * B[(2+8*m)*lda+3+8*n];
  47. TempC[4] += TempA[2] * B[(2+8*m)*lda+4+8*n];
  48. TempC[5] += TempA[2] * B[(2+8*m)*lda+5+8*n];
  49. TempC[6] += TempA[2] * B[(2+8*m)*lda+6+8*n];
  50. TempC[7] += TempA[2] * B[(2+8*m)*lda+7+8*n];
  51. TempC[0] += TempA[3] * B[(3+8*m)*lda+0+8*n];
  52. TempC[1] += TempA[3] * B[(3+8*m)*lda+1+8*n];
  53. TempC[2] += TempA[3] * B[(3+8*m)*lda+2+8*n];
  54. TempC[3] += TempA[3] * B[(3+8*m)*lda+3+8*n];
  55. TempC[4] += TempA[3] * B[(3+8*m)*lda+4+8*n];
  56. TempC[5] += TempA[3] * B[(3+8*m)*lda+5+8*n];
  57. TempC[6] += TempA[3] * B[(3+8*m)*lda+6+8*n];
  58. TempC[7] += TempA[3] * B[(3+8*m)*lda+7+8*n];
  59. TempC[0] += TempA[4] * B[(4+8*m)*lda+0+8*n];
  60. TempC[1] += TempA[4] * B[(4+8*m)*lda+1+8*n];
  61. TempC[2] += TempA[4] * B[(4+8*m)*lda+2+8*n];
  62. TempC[3] += TempA[4] * B[(4+8*m)*lda+3+8*n];
  63. TempC[4] += TempA[4] * B[(4+8*m)*lda+4+8*n];
  64. TempC[5] += TempA[4] * B[(4+8*m)*lda+5+8*n];
  65. TempC[6] += TempA[4] * B[(4+8*m)*lda+6+8*n];
  66. TempC[7] += TempA[4] * B[(4+8*m)*lda+7+8*n];
  67. TempC[0] += TempA[5] * B[(5+8*m)*lda+0+8*n];
  68. TempC[1] += TempA[5] * B[(5+8*m)*lda+1+8*n];
  69. TempC[2] += TempA[5] * B[(5+8*m)*lda+2+8*n];
  70. TempC[3] += TempA[5] * B[(5+8*m)*lda+3+8*n];
  71. TempC[4] += TempA[5] * B[(5+8*m)*lda+4+8*n];
  72. TempC[5] += TempA[5] * B[(5+8*m)*lda+5+8*n];
  73. TempC[6] += TempA[5] * B[(5+8*m)*lda+6+8*n];
  74. TempC[7] += TempA[5] * B[(5+8*m)*lda+7+8*n];
  75. TempC[0] += TempA[6] * B[(6+8*m)*lda+0+8*n];
  76. TempC[1] += TempA[6] * B[(6+8*m)*lda+1+8*n];
  77. TempC[2] += TempA[6] * B[(6+8*m)*lda+2+8*n];
  78. TempC[3] += TempA[6] * B[(6+8*m)*lda+3+8*n];
  79. TempC[4] += TempA[6] * B[(6+8*m)*lda+4+8*n];
  80. TempC[5] += TempA[6] * B[(6+8*m)*lda+5+8*n];
  81. TempC[6] += TempA[6] * B[(6+8*m)*lda+6+8*n];
  82. TempC[7] += TempA[6] * B[(6+8*m)*lda+7+8*n];
  83. TempC[0] += TempA[7] * B[(7+8*m)*lda+0+8*n];
  84. TempC[1] += TempA[7] * B[(7+8*m)*lda+1+8*n];
  85. TempC[2] += TempA[7] * B[(7+8*m)*lda+2+8*n];
  86. TempC[3] += TempA[7] * B[(7+8*m)*lda+3+8*n];
  87. TempC[4] += TempA[7] * B[(7+8*m)*lda+4+8*n];
  88. TempC[5] += TempA[7] * B[(7+8*m)*lda+5+8*n];
  89. TempC[6] += TempA[7] * B[(7+8*m)*lda+6+8*n];
  90. TempC[7] += TempA[7] * B[(7+8*m)*lda+7+8*n];
  91. C[0+8*n+j*lda] += TempC[0];
  92. C[1+8*n+j*lda] += TempC[1];
  93. C[2+8*n+j*lda] += TempC[2];
  94. C[3+8*n+j*lda] += TempC[3];
  95. C[4+8*n+j*lda] += TempC[4];
  96. C[5+8*n+j*lda] += TempC[5];
  97. C[6+8*n+j*lda] += TempC[6];
  98. C[7+8*n+j*lda] += TempC[7];
  99. }
  100. }
  101. }
  102. }
  103. if(coreid == 0)
  104. {
  105. for ( j = 0; j < 16; j++ )
  106. {
  107. for ( m = 0; m < 4; m++ )
  108. {
  109. TempA[0] = A[j*lda+0+8*m];
  110. TempA[1] = A[j*lda+1+8*m];
  111. TempA[2] = A[j*lda+2+8*m];
  112. TempA[3] = A[j*lda+3+8*m];
  113. TempA[4] = A[j*lda+4+8*m];
  114. TempA[5] = A[j*lda+5+8*m];
  115. TempA[6] = A[j*lda+6+8*m];
  116. TempA[7] = A[j*lda+7+8*m];
  117. for( n = 0; n < 4; n++)
  118. {
  119. TempC[0] = TempA[0] * B[(0+8*m)*lda+0+8*n];
  120. TempC[1] = TempA[0] * B[(0+8*m)*lda+1+8*n];
  121. TempC[2] = TempA[0] * B[(0+8*m)*lda+2+8*n];
  122. TempC[3] = TempA[0] * B[(0+8*m)*lda+3+8*n];
  123. TempC[4] = TempA[0] * B[(0+8*m)*lda+4+8*n];
  124. TempC[5] = TempA[0] * B[(0+8*m)*lda+5+8*n];
  125. TempC[6] = TempA[0] * B[(0+8*m)*lda+6+8*n];
  126. TempC[7] = TempA[0] * B[(0+8*m)*lda+7+8*n];
  127. TempC[0] += TempA[1] * B[(1+8*m)*lda+0+8*n];
  128. TempC[1] += TempA[1] * B[(1+8*m)*lda+1+8*n];
  129. TempC[2] += TempA[1] * B[(1+8*m)*lda+2+8*n];
  130. TempC[3] += TempA[1] * B[(1+8*m)*lda+3+8*n];
  131. TempC[4] += TempA[1] * B[(1+8*m)*lda+4+8*n];
  132. TempC[5] += TempA[1] * B[(1+8*m)*lda+5+8*n];
  133. TempC[6] += TempA[1] * B[(1+8*m)*lda+6+8*n];
  134. TempC[7] += TempA[1] * B[(1+8*m)*lda+7+8*n];
  135. TempC[0] += TempA[2] * B[(2+8*m)*lda+0+8*n];
  136. TempC[1] += TempA[2] * B[(2+8*m)*lda+1+8*n];
  137. TempC[2] += TempA[2] * B[(2+8*m)*lda+2+8*n];
  138. TempC[3] += TempA[2] * B[(2+8*m)*lda+3+8*n];
  139. TempC[4] += TempA[2] * B[(2+8*m)*lda+4+8*n];
  140. TempC[5] += TempA[2] * B[(2+8*m)*lda+5+8*n];
  141. TempC[6] += TempA[2] * B[(2+8*m)*lda+6+8*n];
  142. TempC[7] += TempA[2] * B[(2+8*m)*lda+7+8*n];
  143. TempC[0] += TempA[3] * B[(3+8*m)*lda+0+8*n];
  144. TempC[1] += TempA[3] * B[(3+8*m)*lda+1+8*n];
  145. TempC[2] += TempA[3] * B[(3+8*m)*lda+2+8*n];
  146. TempC[3] += TempA[3] * B[(3+8*m)*lda+3+8*n];
  147. TempC[4] += TempA[3] * B[(3+8*m)*lda+4+8*n];
  148. TempC[5] += TempA[3] * B[(3+8*m)*lda+5+8*n];
  149. TempC[6] += TempA[3] * B[(3+8*m)*lda+6+8*n];
  150. TempC[7] += TempA[3] * B[(3+8*m)*lda+7+8*n];
  151. TempC[0] += TempA[4] * B[(4+8*m)*lda+0+8*n];
  152. TempC[1] += TempA[4] * B[(4+8*m)*lda+1+8*n];
  153. TempC[2] += TempA[4] * B[(4+8*m)*lda+2+8*n];
  154. TempC[3] += TempA[4] * B[(4+8*m)*lda+3+8*n];
  155. TempC[4] += TempA[4] * B[(4+8*m)*lda+4+8*n];
  156. TempC[5] += TempA[4] * B[(4+8*m)*lda+5+8*n];
  157. TempC[6] += TempA[4] * B[(4+8*m)*lda+6+8*n];
  158. TempC[7] += TempA[4] * B[(4+8*m)*lda+7+8*n];
  159. TempC[0] += TempA[5] * B[(5+8*m)*lda+0+8*n];
  160. TempC[1] += TempA[5] * B[(5+8*m)*lda+1+8*n];
  161. TempC[2] += TempA[5] * B[(5+8*m)*lda+2+8*n];
  162. TempC[3] += TempA[5] * B[(5+8*m)*lda+3+8*n];
  163. TempC[4] += TempA[5] * B[(5+8*m)*lda+4+8*n];
  164. TempC[5] += TempA[5] * B[(5+8*m)*lda+5+8*n];
  165. TempC[6] += TempA[5] * B[(5+8*m)*lda+6+8*n];
  166. TempC[7] += TempA[5] * B[(5+8*m)*lda+7+8*n];
  167. TempC[0] += TempA[6] * B[(6+8*m)*lda+0+8*n];
  168. TempC[1] += TempA[6] * B[(6+8*m)*lda+1+8*n];
  169. TempC[2] += TempA[6] * B[(6+8*m)*lda+2+8*n];
  170. TempC[3] += TempA[6] * B[(6+8*m)*lda+3+8*n];
  171. TempC[4] += TempA[6] * B[(6+8*m)*lda+4+8*n];
  172. TempC[5] += TempA[6] * B[(6+8*m)*lda+5+8*n];
  173. TempC[6] += TempA[6] * B[(6+8*m)*lda+6+8*n];
  174. TempC[7] += TempA[6] * B[(6+8*m)*lda+7+8*n];
  175. TempC[0] += TempA[7] * B[(7+8*m)*lda+0+8*n];
  176. TempC[1] += TempA[7] * B[(7+8*m)*lda+1+8*n];
  177. TempC[2] += TempA[7] * B[(7+8*m)*lda+2+8*n];
  178. TempC[3] += TempA[7] * B[(7+8*m)*lda+3+8*n];
  179. TempC[4] += TempA[7] * B[(7+8*m)*lda+4+8*n];
  180. TempC[5] += TempA[7] * B[(7+8*m)*lda+5+8*n];
  181. TempC[6] += TempA[7] * B[(7+8*m)*lda+6+8*n];
  182. TempC[7] += TempA[7] * B[(7+8*m)*lda+7+8*n];
  183. C[0+8*n+j*lda] += TempC[0];
  184. C[1+8*n+j*lda] += TempC[1];
  185. C[2+8*n+j*lda] += TempC[2];
  186. C[3+8*n+j*lda] += TempC[3];
  187. C[4+8*n+j*lda] += TempC[4];
  188. C[5+8*n+j*lda] += TempC[5];
  189. C[6+8*n+j*lda] += TempC[6];
  190. C[7+8*n+j*lda] += TempC[7];
  191. }
  192. }
  193. }
  194. }
  195. }