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