aboutsummaryrefslogtreecommitdiff
path: root/mt/av_matmul.c
diff options
context:
space:
mode:
Diffstat (limited to 'mt/av_matmul.c')
-rw-r--r--mt/av_matmul.c259
1 files changed, 259 insertions, 0 deletions
diff --git a/mt/av_matmul.c b/mt/av_matmul.c
new file mode 100644
index 0000000..0f0dbae
--- /dev/null
+++ b/mt/av_matmul.c
@@ -0,0 +1,259 @@
+#include "stdlib.h"
+
+#include "util.h"
+
+#include "dataset.h"
+void __attribute__((noinline)) matmul(const int coreid, const int ncores, const int lda, const data_t A[], const data_t B[], data_t C[] )
+{
+
+ //-----------------------------------------------------------------version 2.16, optimize v2.15 get rid of tempb. MSI 83K.w/ test one 81K.
+
+
+ static __thread data_t TempA[8];
+ static __thread data_t TempB[8];
+ static __thread data_t TempC[8];
+ static __thread int j,m,n;
+
+ if(coreid == 1 || ncores == 1 )
+ {
+ for ( j = 16; j < 32; j++ )
+ {
+
+ for ( m = 0; m < 4; m++ )
+ {
+
+ TempA[0] = A[j*lda+0+8*m];
+ TempA[1] = A[j*lda+1+8*m];
+ TempA[2] = A[j*lda+2+8*m];
+ TempA[3] = A[j*lda+3+8*m];
+ TempA[4] = A[j*lda+4+8*m];
+ TempA[5] = A[j*lda+5+8*m];
+ TempA[6] = A[j*lda+6+8*m];
+ TempA[7] = A[j*lda+7+8*m];
+
+
+
+ for( n = 0; n < 4; n++)
+ {
+
+
+
+
+
+ TempC[0] = TempA[0] * B[(0+8*m)*lda+0+8*n];
+ TempC[1] = TempA[0] * B[(0+8*m)*lda+1+8*n];
+ TempC[2] = TempA[0] * B[(0+8*m)*lda+2+8*n];
+ TempC[3] = TempA[0] * B[(0+8*m)*lda+3+8*n];
+ TempC[4] = TempA[0] * B[(0+8*m)*lda+4+8*n];
+ TempC[5] = TempA[0] * B[(0+8*m)*lda+5+8*n];
+ TempC[6] = TempA[0] * B[(0+8*m)*lda+6+8*n];
+ TempC[7] = TempA[0] * B[(0+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[1] * B[(1+8*m)*lda+0+8*n];
+ TempC[1] += TempA[1] * B[(1+8*m)*lda+1+8*n];
+ TempC[2] += TempA[1] * B[(1+8*m)*lda+2+8*n];
+ TempC[3] += TempA[1] * B[(1+8*m)*lda+3+8*n];
+ TempC[4] += TempA[1] * B[(1+8*m)*lda+4+8*n];
+ TempC[5] += TempA[1] * B[(1+8*m)*lda+5+8*n];
+ TempC[6] += TempA[1] * B[(1+8*m)*lda+6+8*n];
+ TempC[7] += TempA[1] * B[(1+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[2] * B[(2+8*m)*lda+0+8*n];
+ TempC[1] += TempA[2] * B[(2+8*m)*lda+1+8*n];
+ TempC[2] += TempA[2] * B[(2+8*m)*lda+2+8*n];
+ TempC[3] += TempA[2] * B[(2+8*m)*lda+3+8*n];
+ TempC[4] += TempA[2] * B[(2+8*m)*lda+4+8*n];
+ TempC[5] += TempA[2] * B[(2+8*m)*lda+5+8*n];
+ TempC[6] += TempA[2] * B[(2+8*m)*lda+6+8*n];
+ TempC[7] += TempA[2] * B[(2+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[3] * B[(3+8*m)*lda+0+8*n];
+ TempC[1] += TempA[3] * B[(3+8*m)*lda+1+8*n];
+ TempC[2] += TempA[3] * B[(3+8*m)*lda+2+8*n];
+ TempC[3] += TempA[3] * B[(3+8*m)*lda+3+8*n];
+ TempC[4] += TempA[3] * B[(3+8*m)*lda+4+8*n];
+ TempC[5] += TempA[3] * B[(3+8*m)*lda+5+8*n];
+ TempC[6] += TempA[3] * B[(3+8*m)*lda+6+8*n];
+ TempC[7] += TempA[3] * B[(3+8*m)*lda+7+8*n];
+
+ TempC[0] += TempA[4] * B[(4+8*m)*lda+0+8*n];
+ TempC[1] += TempA[4] * B[(4+8*m)*lda+1+8*n];
+ TempC[2] += TempA[4] * B[(4+8*m)*lda+2+8*n];
+ TempC[3] += TempA[4] * B[(4+8*m)*lda+3+8*n];
+ TempC[4] += TempA[4] * B[(4+8*m)*lda+4+8*n];
+ TempC[5] += TempA[4] * B[(4+8*m)*lda+5+8*n];
+ TempC[6] += TempA[4] * B[(4+8*m)*lda+6+8*n];
+ TempC[7] += TempA[4] * B[(4+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[5] * B[(5+8*m)*lda+0+8*n];
+ TempC[1] += TempA[5] * B[(5+8*m)*lda+1+8*n];
+ TempC[2] += TempA[5] * B[(5+8*m)*lda+2+8*n];
+ TempC[3] += TempA[5] * B[(5+8*m)*lda+3+8*n];
+ TempC[4] += TempA[5] * B[(5+8*m)*lda+4+8*n];
+ TempC[5] += TempA[5] * B[(5+8*m)*lda+5+8*n];
+ TempC[6] += TempA[5] * B[(5+8*m)*lda+6+8*n];
+ TempC[7] += TempA[5] * B[(5+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[6] * B[(6+8*m)*lda+0+8*n];
+ TempC[1] += TempA[6] * B[(6+8*m)*lda+1+8*n];
+ TempC[2] += TempA[6] * B[(6+8*m)*lda+2+8*n];
+ TempC[3] += TempA[6] * B[(6+8*m)*lda+3+8*n];
+ TempC[4] += TempA[6] * B[(6+8*m)*lda+4+8*n];
+ TempC[5] += TempA[6] * B[(6+8*m)*lda+5+8*n];
+ TempC[6] += TempA[6] * B[(6+8*m)*lda+6+8*n];
+ TempC[7] += TempA[6] * B[(6+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[7] * B[(7+8*m)*lda+0+8*n];
+ TempC[1] += TempA[7] * B[(7+8*m)*lda+1+8*n];
+ TempC[2] += TempA[7] * B[(7+8*m)*lda+2+8*n];
+ TempC[3] += TempA[7] * B[(7+8*m)*lda+3+8*n];
+ TempC[4] += TempA[7] * B[(7+8*m)*lda+4+8*n];
+ TempC[5] += TempA[7] * B[(7+8*m)*lda+5+8*n];
+ TempC[6] += TempA[7] * B[(7+8*m)*lda+6+8*n];
+ TempC[7] += TempA[7] * B[(7+8*m)*lda+7+8*n];
+
+
+
+ C[0+8*n+j*lda] += TempC[0];
+ C[1+8*n+j*lda] += TempC[1];
+ C[2+8*n+j*lda] += TempC[2];
+ C[3+8*n+j*lda] += TempC[3];
+ C[4+8*n+j*lda] += TempC[4];
+ C[5+8*n+j*lda] += TempC[5];
+ C[6+8*n+j*lda] += TempC[6];
+ C[7+8*n+j*lda] += TempC[7];
+ }
+ }
+ }
+ }
+ if(coreid == 0)
+ {
+ for ( j = 0; j < 16; j++ )
+ {
+
+ for ( m = 0; m < 4; m++ )
+ {
+
+ TempA[0] = A[j*lda+0+8*m];
+ TempA[1] = A[j*lda+1+8*m];
+ TempA[2] = A[j*lda+2+8*m];
+ TempA[3] = A[j*lda+3+8*m];
+ TempA[4] = A[j*lda+4+8*m];
+ TempA[5] = A[j*lda+5+8*m];
+ TempA[6] = A[j*lda+6+8*m];
+ TempA[7] = A[j*lda+7+8*m];
+
+
+
+ for( n = 0; n < 4; n++)
+ {
+
+
+
+
+
+ TempC[0] = TempA[0] * B[(0+8*m)*lda+0+8*n];
+ TempC[1] = TempA[0] * B[(0+8*m)*lda+1+8*n];
+ TempC[2] = TempA[0] * B[(0+8*m)*lda+2+8*n];
+ TempC[3] = TempA[0] * B[(0+8*m)*lda+3+8*n];
+ TempC[4] = TempA[0] * B[(0+8*m)*lda+4+8*n];
+ TempC[5] = TempA[0] * B[(0+8*m)*lda+5+8*n];
+ TempC[6] = TempA[0] * B[(0+8*m)*lda+6+8*n];
+ TempC[7] = TempA[0] * B[(0+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[1] * B[(1+8*m)*lda+0+8*n];
+ TempC[1] += TempA[1] * B[(1+8*m)*lda+1+8*n];
+ TempC[2] += TempA[1] * B[(1+8*m)*lda+2+8*n];
+ TempC[3] += TempA[1] * B[(1+8*m)*lda+3+8*n];
+ TempC[4] += TempA[1] * B[(1+8*m)*lda+4+8*n];
+ TempC[5] += TempA[1] * B[(1+8*m)*lda+5+8*n];
+ TempC[6] += TempA[1] * B[(1+8*m)*lda+6+8*n];
+ TempC[7] += TempA[1] * B[(1+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[2] * B[(2+8*m)*lda+0+8*n];
+ TempC[1] += TempA[2] * B[(2+8*m)*lda+1+8*n];
+ TempC[2] += TempA[2] * B[(2+8*m)*lda+2+8*n];
+ TempC[3] += TempA[2] * B[(2+8*m)*lda+3+8*n];
+ TempC[4] += TempA[2] * B[(2+8*m)*lda+4+8*n];
+ TempC[5] += TempA[2] * B[(2+8*m)*lda+5+8*n];
+ TempC[6] += TempA[2] * B[(2+8*m)*lda+6+8*n];
+ TempC[7] += TempA[2] * B[(2+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[3] * B[(3+8*m)*lda+0+8*n];
+ TempC[1] += TempA[3] * B[(3+8*m)*lda+1+8*n];
+ TempC[2] += TempA[3] * B[(3+8*m)*lda+2+8*n];
+ TempC[3] += TempA[3] * B[(3+8*m)*lda+3+8*n];
+ TempC[4] += TempA[3] * B[(3+8*m)*lda+4+8*n];
+ TempC[5] += TempA[3] * B[(3+8*m)*lda+5+8*n];
+ TempC[6] += TempA[3] * B[(3+8*m)*lda+6+8*n];
+ TempC[7] += TempA[3] * B[(3+8*m)*lda+7+8*n];
+
+ TempC[0] += TempA[4] * B[(4+8*m)*lda+0+8*n];
+ TempC[1] += TempA[4] * B[(4+8*m)*lda+1+8*n];
+ TempC[2] += TempA[4] * B[(4+8*m)*lda+2+8*n];
+ TempC[3] += TempA[4] * B[(4+8*m)*lda+3+8*n];
+ TempC[4] += TempA[4] * B[(4+8*m)*lda+4+8*n];
+ TempC[5] += TempA[4] * B[(4+8*m)*lda+5+8*n];
+ TempC[6] += TempA[4] * B[(4+8*m)*lda+6+8*n];
+ TempC[7] += TempA[4] * B[(4+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[5] * B[(5+8*m)*lda+0+8*n];
+ TempC[1] += TempA[5] * B[(5+8*m)*lda+1+8*n];
+ TempC[2] += TempA[5] * B[(5+8*m)*lda+2+8*n];
+ TempC[3] += TempA[5] * B[(5+8*m)*lda+3+8*n];
+ TempC[4] += TempA[5] * B[(5+8*m)*lda+4+8*n];
+ TempC[5] += TempA[5] * B[(5+8*m)*lda+5+8*n];
+ TempC[6] += TempA[5] * B[(5+8*m)*lda+6+8*n];
+ TempC[7] += TempA[5] * B[(5+8*m)*lda+7+8*n];
+
+
+
+ TempC[0] += TempA[6] * B[(6+8*m)*lda+0+8*n];
+ TempC[1] += TempA[6] * B[(6+8*m)*lda+1+8*n];
+ TempC[2] += TempA[6] * B[(6+8*m)*lda+2+8*n];
+ TempC[3] += TempA[6] * B[(6+8*m)*lda+3+8*n];
+ TempC[4] += TempA[6] * B[(6+8*m)*lda+4+8*n];
+ TempC[5] += TempA[6] * B[(6+8*m)*lda+5+8*n];
+ TempC[6] += TempA[6] * B[(6+8*m)*lda+6+8*n];
+ TempC[7] += TempA[6] * B[(6+8*m)*lda+7+8*n];
+
+
+ TempC[0] += TempA[7] * B[(7+8*m)*lda+0+8*n];
+ TempC[1] += TempA[7] * B[(7+8*m)*lda+1+8*n];
+ TempC[2] += TempA[7] * B[(7+8*m)*lda+2+8*n];
+ TempC[3] += TempA[7] * B[(7+8*m)*lda+3+8*n];
+ TempC[4] += TempA[7] * B[(7+8*m)*lda+4+8*n];
+ TempC[5] += TempA[7] * B[(7+8*m)*lda+5+8*n];
+ TempC[6] += TempA[7] * B[(7+8*m)*lda+6+8*n];
+ TempC[7] += TempA[7] * B[(7+8*m)*lda+7+8*n];
+
+
+
+ C[0+8*n+j*lda] += TempC[0];
+ C[1+8*n+j*lda] += TempC[1];
+ C[2+8*n+j*lda] += TempC[2];
+ C[3+8*n+j*lda] += TempC[3];
+ C[4+8*n+j*lda] += TempC[4];
+ C[5+8*n+j*lda] += TempC[5];
+ C[6+8*n+j*lda] += TempC[6];
+ C[7+8*n+j*lda] += TempC[7];
+ }
+ }
+ }
+ }
+}