From: adash Date: Tue, 12 Feb 2008 23:57:41 +0000 (+0000) Subject: Add MatrixMultiply benchmark with thread join X-Git-Tag: preEdgeChange~281 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=87a55a0da45f47fbee5ed33660c5bb487b29f2db;p=IRC.git Add MatrixMultiply benchmark with thread join --- diff --git a/Robust/src/Benchmarks/Prefetch/MatrixMultiply.java b/Robust/src/Benchmarks/Prefetch/MatrixMultiply.java new file mode 100644 index 00000000..a319ed82 --- /dev/null +++ b/Robust/src/Benchmarks/Prefetch/MatrixMultiply.java @@ -0,0 +1,140 @@ +public class MatrixMultiply extends Thread{ + public int L, M, N, l, n; + public int[][] a; + public int[][] b; + public int[][] c; + + public MatrixMultiply(int l, int n) { + this.l = l; + this.n = n; + } + + public void setValues(int l, int n) { + this.l = l; + this.n = n; + } + + public void run() { + int innerProduct = 0; + atomic { + for (int m = 0; m < M; m++) { + innerProduct += a[l][m]*b[m][n]; + } + c[l][n] = innerProduct; + } + } + + public static void main(String[] args) { + int tt,k,q,r; + MatrixMultiply mm = null; + + atomic { + mm = global new MatrixMultiply(0,0); + mm.L = 2; + mm.M = 2; + mm.N = 2; + } + + int mid = (128<<24)|(195<<16)|(175<<8)|70; + + atomic { + mm.a = global new int[mm.L][mm.M]; + mm.a[0][0] = 2; + mm.a[0][1] = 2; + mm.a[1][0] = 2; + mm.a[1][1] = 2; + } + + atomic { + mm.b = global new int[mm.M][mm.N]; + mm.b[0][0] = 3; + mm.b[0][1] = 3; + mm.b[1][0] = 3; + mm.b[1][1] = 3; + } + + atomic { + mm.c = global new int[mm.L][mm.N]; + mm.c[0][0] = 0; + mm.c[0][1] = 0; + mm.c[1][0] = 0; + mm.c[1][1] = 0; + } + + // print out the matrices to be multiplied + atomic { + k = mm.L; + q = mm.M; + r = mm.N; + } + + System.printString("MatrixMultiply: L="); + System.printInt(k); + System.printString("\t"); + System.printString("M="); + System.printInt(q); + System.printString("\t"); + System.printString("N="); + System.printInt(r); + System.printString("\t"); + + System.printString("\n"); + System.printString("a ="); + for (int l = 0; l < k; l++) { + for (int m = 0; m < q; m++) { + atomic { + tt = mm.a[l][m]; + } + System.printString(" " + tt); + System.printString("\t"); + } + } + System.printString("\n"); + + //System.printString("\n"); + System.printString("b ="); + for (int m = 0; m < q; m++) { + for (int n = 0; n < r; n++) { + atomic { + tt = mm.b[m][n]; + } + System.printString(" " + tt); + System.printString("\t"); + } + } + System.printString("\n"); + + // start a thread to compute each c[l,n] + for (int l = 0; l < k; l++) { + for (int n = 0; n < r; n++){ + atomic { + mm.setValues(l,n); + } + mm.start(mid); + } + } + + // wait for them to finish + for (int l = 0; l < k; l++){ + for (int n = 0; n < r; n++){ + mm.join(); + } + } + + // print out the result of the matrix multiply + System.printString("c ="); + for (int l = 0; l < k; l++) { + for (int n = 0; n < r; n++) { + atomic { + tt = mm.c[l][n]; + } + System.printString(" " + tt); + System.printString("\t"); + } + } + System.printString("\n"); + while(true) { + ; + } + } +}