Don't assume PRV1/2 and IE1/2 are reset
[riscv-tests.git] / mt / ci_matmul.c
1 #include "stdlib.h"
2
3 #include "util.h"
4
5 #include "dataset.h"
6 void __attribute__((noinline)) matmul(const int coreid, const int ncores, const int lda, const data_t A[], const data_t B[], data_t C[] )
7 {
8
9 // ***************************** //
10 // **** ADD YOUR CODE HERE ***** //
11 // ***************************** //
12 //
13 // feel free to make a separate function for MI and MSI versions.
14
15 //----------MSI--------------
16 /*
17 int i,j,k;
18 barrier(nc);
19 for(j = coreid*lda/ncores; j < coreid*lda/ncores + lda/ncores; j++) {
20 for(i = 0; i < lda; i+=4) {
21 data_t Cval0 = 0;
22 data_t Cval1 = 0;
23 data_t Cval2 = 0;
24 data_t Cval3 = 0;
25 for(k = 0; k < lda; k++) {
26 Cval0 += A[j*lda+k]*B[k*lda+i];
27 Cval1 += A[j*lda+k]*B[k*lda+i+1];
28 Cval2 += A[j*lda+k]*B[k*lda+i+2];
29 Cval3 += A[j*lda+k]*B[k*lda+i+3];
30 }
31 C[j*lda+i] = Cval0;
32 C[j*lda+i+1] = Cval1;
33 C[j*lda+i+2] = Cval2;
34 C[j*lda+i+3] = Cval3;
35 }
36 }
37 */
38
39 //------------------MI-------------------
40
41 int i,j,k;
42 barrier(ncores);
43 for(j = coreid*lda/ncores; j < coreid*lda/ncores + lda/ncores; j++) {
44 for(i = 0; i < lda; i+=4) {
45 data_t Cval0 = 0;
46 data_t Cval1 = 0;
47 data_t Cval2 = 0;
48 data_t Cval3 = 0;
49 if(coreid == 0) {
50 for(k = 0; k < lda; k++) {
51 Cval0 += A[j*lda+k]*B[k*lda+i];
52 Cval1 += A[j*lda+k]*B[k*lda+i+1];
53 Cval2 += A[j*lda+k]*B[k*lda+i+2];
54 Cval3 += A[j*lda+k]*B[k*lda+i+3];
55 }
56 } else {
57 for(k = lda-1; k >= 0; k--) {
58 Cval0 += A[j*lda+k]*B[k*lda+i];
59 Cval1 += A[j*lda+k]*B[k*lda+i+1];
60 Cval2 += A[j*lda+k]*B[k*lda+i+2];
61 Cval3 += A[j*lda+k]*B[k*lda+i+3];
62 }
63 }
64 C[j*lda+i] = Cval0;
65 C[j*lda+i+1] = Cval1;
66 C[j*lda+i+2] = Cval2;
67 C[j*lda+i+3] = Cval3;
68 }
69 }
70 }