start of new file
[IRC.git] / Robust / src / Benchmarks / Prefetch / MatrixMultiply / MatrixMultiply.java
index 8238605c3e9038ded52e6f915b68a50b18cd001b..e56a6faa60d9bf9e3e154bd47def0a08e327dc2d 100644 (file)
@@ -11,29 +11,34 @@ public class MatrixMultiply extends Thread{
        }
 
        public void run() {
-               int localresults[][];
+               double localresults[][];
 
                atomic {
                    //compute the results
-                   localresults=new int[1+x1-x0][1+y1-y0];
-                   
+                   localresults=new double[1+x1-x0][1+y1-y0];
+                   double la[][]=mmul.a;
+                   double lbtranspose[][]=mmul.b;
+                   double lc[][]=mmul.c;
+                   int M=mmul.M;
+
+                   //Use b transpose for cache performance
                    for(int i = x0; i<= x1; i++){
-                       int a[]=mmul.a[i];
-                       int b[][]=mmul.b;
-                       int M=mmul.M;
+                       double a[]=la[i];
                        for (int j = y0; j <= y1; j++) {
-                           int innerProduct=0;
+                           double innerProduct=0;
+                           double b[] = lbtranspose[j];
                            for(int k = 0; k < M; k++) {
-                               innerProduct += a[k] * b[k][j];
+                               innerProduct += a[k] *b[k];
                            }
                            localresults[i-x0][j-y0]=innerProduct;
                        }
                    }
                }
+
                atomic {
                    //write the results
                    for(int i=x0;i<=x1;i++) {
-                       int c[]=mmul.c[i];
+                       double c[]=mmul.c[i];
                        for(int j=y0;j<=y1;j++) {
                            c[j]=localresults[i-x0][j-y0];
                        }
@@ -42,28 +47,41 @@ public class MatrixMultiply extends Thread{
        }
 
        public static void main(String[] args) {
-               int mid1 = (128<<24)|(195<<16)|(175<<8)|70;
+<<<<<<< MatrixMultiply.java
+               int mid1 = (128<<24)|(195<<16)|(175<<8)|69;
                int mid2 = (128<<24)|(195<<16)|(175<<8)|69;
                int mid3 = (128<<24)|(195<<16)|(175<<8)|71;
-               int NUM_THREADS = 2;
-               int i, j, p, q, r;
+               int NUM_THREADS = 1;
+=======
+      int NUM_THREADS = 4;
+      int[] mid = new int[NUM_THREADS];
+      mid[0] = (128<<24)|(195<<16)|(175<<8)|69;
+      mid[1] = (128<<24)|(195<<16)|(175<<8)|73;
+      mid[2] = (128<<24)|(195<<16)|(175<<8)|78;
+      mid[3] = (128<<24)|(195<<16)|(175<<8)|79;
+               //int mid1 = (128<<24)|(195<<16)|(175<<8)|69;
+               //int mid2 = (128<<24)|(195<<16)|(175<<8)|73;
+>>>>>>> 1.19
+               int p, q, r;
                MatrixMultiply[] mm;
                MatrixMultiply tmp;
                MMul matrix;
 
                atomic {
-                       matrix = global new MMul(70, 70, 70);
+                       matrix = global new MMul(400, 400, 400);
                        matrix.setValues();
+                       matrix.transpose();
                }
 
                atomic{
                        mm = global new MatrixMultiply[NUM_THREADS];
                }
 
-               // Currently it is a 70 X 70 matrix divided into 4 blocks 
                atomic {
-                       mm[0] = global new MatrixMultiply(matrix,0,0,69,35);
-                       mm[1] = global new MatrixMultiply(matrix,0,36,69,69);
+                       mm[0] = global new MatrixMultiply(matrix,0,0,200,200);
+                       mm[1] = global new MatrixMultiply(matrix,0,201,200,399);
+                       mm[2] = global new MatrixMultiply(matrix,201,0,399,200);
+                       mm[3] = global new MatrixMultiply(matrix,201,201,399,399);
                }
 
                atomic {
@@ -84,43 +102,16 @@ public class MatrixMultiply extends Thread{
                System.printInt(r);
                System.printString("\n");
 
-               //Print Matrices to be multiplied
-               /*
-               System.printString("a =\n");
-               for (i = 0; i < p; i++) {
-                       for (j = 0; j < q; j++) {
-                               atomic {
-                                       val = matrix.a[i][j];
-                               }
-                               System.printString(" " + val);
-                       }
-                       System.printString("\n");
-               }
-               System.printString("\n");
-
-               System.printString("b =\n");
-               for (i = 0; i < q; i++) {
-                       for (j = 0; j < r; j++) {
-                               atomic {
-                                       val = matrix.b[i][j];
-                               }
-                               System.printString(" " + val);
-                       }
-                       System.printString("\n");
-               }
-               System.printString("\n");
-               */
-
                // start a thread to compute each c[l,n]
-               for (i = 0; i < NUM_THREADS; i++) {
+               for (int i = 0; i < NUM_THREADS; i++) {
                        atomic {
                                tmp = mm[i];
                        }
-                       tmp.start(mid1);
+                       tmp.start(mid[i]);
                }
 
                // wait for them to finish
-               for (i = 0; i < NUM_THREADS; i++) {
+               for (int i = 0; i < NUM_THREADS; i++) {
                        atomic {
                                tmp = mm[i];
                        }
@@ -130,20 +121,15 @@ public class MatrixMultiply extends Thread{
                // print out the result of the matrix multiply
                System.printString("Starting\n");
                System.printString("Matrix Product c =\n");
-               StringBuffer sb = new StringBuffer("");
-               int val;
+               double val;
                atomic {
-                       for (i = 0; i < p; i++) {
-                               int c[]=matrix.c[i];
-                               for (j = 0; j < r; j++) {
+                       for (int i = 0; i < p; i++) {
+                               double c[]=matrix.c[i];
+                               for (int j = 0; j < r; j++) {
                                        val = c[j];
-                                       sb.append(" ");
-                                       sb.append((new Integer(val)).toString());
                                }
-                               sb.append("\n");
                        }
                }
-               System.printString(sb.toString());
                System.printString("Finished\n");
        }
 }
@@ -151,39 +137,56 @@ public class MatrixMultiply extends Thread{
 public class MMul{
 
        public int L, M, N;
-       public int[][] a;
-       public int[][] b;
-       public int[][] c;
+       public double[][] a;
+       public double[][] b;
+       public double[][] c;
+       public double[][] btranspose;
 
        public MMul(int L, int M, int N) {
                this.L = L;
                this.M = M;
                this.N = N;
-               a = global new int[L][M];  
-               b = global new int[M][N]; 
-               c = global new int[L][N]; 
+               a = global new double[L][M];  
+               b = global new double[M][N]; 
+               c = global new double[L][N]; 
+               btranspose = global new double[N][M];
        }
 
        public void setValues() {
-               int i;
-               int j;
-               for(i = 0; i < L; i++) {
-                       for(j = 0; j < M; j++) {
-                               a[i][j] = j+1;
+               for(int i = 0; i < L; i++) {
+            double ai[] = a[i];
+                       for(int j = 0; j < M; j++) {
+                               ai[j] = j+1;
                        }
                }
 
-               for(i = 0; i < M; i++) {
-                       for(j = 0; j < N; j++) {
-                               b[i][j] = j+1;
+               for(int i = 0; i < M; i++) {
+            double bi[] = b[i];
+                       for(int j = 0; j < N; j++) {
+                               bi[j] = j+1;
                        }
                }
 
-               for(i = 0; i < L; i++) {
-                       for(j = 0; j < N; j++) {
-                               c[i][j] = 0;
+               for(int i = 0; i < L; i++) {
+            double ci[] = c[i];
+                       for(int j = 0; j < N; j++) {
+                               ci[j] = 0;
+                       }
+               }
+               for(int i = 0; i < N; i++) {
+            double btransposei[] = btranspose[i];
+                       for(int j = 0; j < M; j++) {
+                               btransposei[j] = 0;
                        }
                }
        }
-}
 
+       public void transpose() {
+               for(int row = 0; row < M; row++) {
+            double brow[] = b[row];
+                       for(int col = 0; col < N; col++) {
+                               btranspose[col][row] = brow[col];
+                       }
+               }
+       }
+}