From 8ba9a072444a0d62ea2b89e03e5f029a09c57039 Mon Sep 17 00:00:00 2001
From: bdemsky <bdemsky>
Date: Fri, 2 May 2008 19:45:05 +0000
Subject: [PATCH] new makefile and rewritten benchmark

---
 .../MatrixMultiply/MatrixMultiplyN.java       | 159 ++++++++++++++++++
 .../Prefetch/MatrixMultiply/makefile          |  12 +-
 2 files changed, 162 insertions(+), 9 deletions(-)
 create mode 100644 Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiplyN.java

diff --git a/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiplyN.java b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiplyN.java
new file mode 100644
index 00000000..1a5aa110
--- /dev/null
+++ b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/MatrixMultiplyN.java
@@ -0,0 +1,159 @@
+public class MatrixMultiply extends Thread{
+    MMul mmul;
+    public int x0, y0, x1, y1;
+    
+    public MatrixMultiply(MMul mmul, int x0, int x1, int y0, int y1) {
+	this.mmul = mmul;
+	this.x0 = x0;
+	this.y0 = y0;
+	this.x1 = x1;
+	this.y1 = y1;
+    }
+    
+    public void run() {
+	atomic {
+	    //Use btranspose for cache performance
+	    for(int i = x0; i<= x1; i++){
+		double a[]=mmul.a[i];
+		double c[]=mmul.c[i];
+		int M=mmul.M;
+		for (int j = y0; j <= y1; j++) {
+		    double innerProduct=0;
+		    double b[] = mmul.btranspose[j];
+		    for(int k = 0; k < M; k++) {
+			innerProduct += a[k] *b[k];
+		    }
+		    c[j]=innerProduct;
+		}
+	    }
+	}
+    }
+    
+    public static void main(String[] args) {
+	int NUM_THREADS = 4;
+	int SIZE=600;
+	if (args.length>0) {
+	    NUM_THREADS=Integer.parseInt(args[0]);
+	    if (args.length>1)
+		SIZE=Integer.parseInt(args[1]);
+	}
+	
+	int[] mid = new int[NUM_THREADS];
+	mid[0] = (128<<24)|(195<<16)|(175<<8)|80;
+	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 p, q, r;
+	MatrixMultiply[] mm;
+	MatrixMultiply tmp;
+	MMul matrix;
+	
+	atomic {
+	    matrix = global new MMul(SIZE, SIZE, SIZE);
+	    matrix.setValues();
+	    matrix.transpose();
+	    mm = global new MatrixMultiply[NUM_THREADS];
+	    int increment=SIZE/NUM_THREADS;
+	    int base=0;
+	    for(int i=0;i<NUM_THREADS;i++) {
+		if ((i+1)==NUM_THREADS)
+		    mm[i]=global new MatrixMultiply(matrix,base, SIZE-1, 0, SIZE-1);
+		else
+		    mm[i]=global new MatrixMultiply(matrix,base, base+increment, 0, SIZE-1);
+		base+=increment;
+	    }
+	    p = matrix.L;
+	    q = matrix.M;
+	    r = matrix.N;
+	}
+	
+	// print out the matrices to be multiplied
+	System.printString("\n");
+	System.printString("MatrixMultiply: L=");
+	System.printInt(p);
+	System.printString("\t");
+	System.printString("M=");
+	System.printInt(q);
+	System.printString("\t");
+	System.printString("N=");
+	System.printInt(r);
+	System.printString("\n");
+	
+	// start a thread to compute each c[l,n]
+	for (int i = 0; i < NUM_THREADS; i++) {
+	    atomic {
+		tmp = mm[i];
+	    }
+	    tmp.start(mid[i]);
+	}
+	
+	// wait for them to finish
+	for (int i = 0; i < NUM_THREADS; i++) {
+	    atomic {
+		tmp = mm[i];
+	    }
+	    tmp.join();
+	}
+	
+	// print out the result of the matrix multiply
+
+	System.printString("Finished\n");
+    }
+}
+
+public class MMul{
+
+	public int L, M, N;
+	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 double[L][M];  
+		b = global new double[M][N]; 
+		c = global new double[L][N]; 
+		btranspose = global new double[N][M];
+	}
+
+	public void setValues() {
+		for(int i = 0; i < L; i++) {
+            double ai[] = a[i];
+			for(int j = 0; j < M; j++) {
+				ai[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(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];
+			}
+		}
+	}
+}
diff --git a/Robust/src/Benchmarks/Prefetch/MatrixMultiply/makefile b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/makefile
index d8af9eb5..6281f4ce 100644
--- a/Robust/src/Benchmarks/Prefetch/MatrixMultiply/makefile
+++ b/Robust/src/Benchmarks/Prefetch/MatrixMultiply/makefile
@@ -1,16 +1,10 @@
 MAINCLASS=MatrixMultiply
-SRC1=${MAINCLASS}1.java
-SRC2=${MAINCLASS}2.java
-SRC4=${MAINCLASS}4.java
+SRC1=${MAINCLASS}N.java
 FLAGS=-dsm -prefetch -optimize -profile -debug -excprefetch MatrixMultiply.main -excprefetch MMul.setValues -excprefetch MMul.transpose -mainclass ${MAINCLASS} -trueprob 0.8
 FLAGS2=-dsm -optimize -profile -debug -excprefetch MatrixMultiply.main -excprefetch MMul.setValues -excprefetch MMul.transpose -mainclass ${MAINCLASS}
 default:
-	../../../buildscript ${FLAGS2} -o ${MAINCLASS}1NP ${SRC1}
-	../../../buildscript ${FLAGS} -o ${MAINCLASS}1 ${SRC1}
-	../../../buildscript ${FLAGS2} -o ${MAINCLASS}2NP ${SRC2}
-	../../../buildscript ${FLAGS} -o ${MAINCLASS}2 ${SRC2}
-	../../../buildscript ${FLAGS2} -o ${MAINCLASS}4NP ${SRC4}
-	../../../buildscript ${FLAGS} -o ${MAINCLASS}4 ${SRC4}
+	../../../buildscript ${FLAGS2} -o ${MAINCLASS}NNP ${SRC1}
+	../../../buildscript ${FLAGS} -o ${MAINCLASS}N ${SRC1}
 
 clean:
 	rm *.bin
-- 
2.34.1