1 /**************************************************************************
3 * Java Grande Forum Benchmark Suite - Thread Version 1.0 *
7 * Java Grande Benchmarking Project *
11 * Edinburgh Parallel Computing Centre *
13 * email: epcc-javagrande@epcc.ed.ac.uk *
16 * This version copyright (c) The University of Edinburgh, 2001. *
17 * All rights reserved. *
19 **************************************************************************/
20 public class JGFSORBench {
30 public JGFSORBench(int nthreads){
31 this.nthreads = nthreads;
32 datasizes = global new int[3];
36 JACOBI_NUM_ITER = 100;
37 RANDOM_SEED = 10101010;
38 R = global new Random(RANDOM_SEED);
42 public void JGFsetsize(int size){
46 public static void JGFkernel(JGFSORBench sor) {
47 int numthreads, datasize;
51 int[] mid = new int[4];
52 mid[0] = (128<<24)|(195<<16)|(175<<8)|79;
53 mid[1] = (128<<24)|(195<<16)|(175<<8)|73;
54 mid[2] = (128<<24)|(195<<16)|(175<<8)|78;
55 mid[3] = (128<<24)|(195<<16)|(175<<8)|69;
58 numthreads = sor.nthreads;
60 datasize = sor.datasizes[sor.size];
61 mybarr = global new BarrierServer(numthreads);
68 G = sor.RandomMatrix(datasize, datasize, rand);
75 num_iterations = sor.JACOBI_NUM_ITER;
78 double omega_over_four = omega * 0.25;
79 double one_minus_omega = 1.0 - omega;
81 // update interior points
87 SORRunner[] thobjects;
89 thobjects = global new SORRunner[numthreads];
92 //JGFInstrumentor.startTimer("Section2:SOR:Kernel", instr.timers);
94 boolean waitfordone=true;
103 for(int i=1;i<numthreads;i++) {
105 thobjects[i] = global new SORRunner(i,omega,G,num_iterations,numthreads);
111 thobjects[0] = global new SORRunner(0,omega,G,num_iterations,numthreads);
117 for(int i=1;i<numthreads;i++) {
124 //JGFInstrumentor.stopTimer("Section2:SOR:Kernel", instr.timers);
126 for (int i=1; i<Nm1; i++) {
127 for (int j=1; j<Nm1; j++) {
128 sor.Gtotal += G[i][j];
134 public double[][] RandomMatrix(int M, int N, Random R)
136 double A[][] = global new double[M][N];
138 for (int i=0; i<N; i++)
139 for (int j=0; j<N; j++)
141 A[i][j] = R.nextDouble() * 1e-6;
146 public int JGFvalidate(){
149 refval = new double[3];
150 refval[0] = 0.498574406322512;
151 refval[1] = 1.1234778980135105;
152 refval[2] = 1.9954895063582696;
153 double dev = Math.fabs(Gtotal - refval[size]);
154 long l = (long) refval[size] * 1000000;
155 long r = (long) Gtotal * 1000000;
157 //System.printString("Validation failed");
158 //System.printString("Gtotal = " + (long) Gtotal * 1000000 + " " +(long) dev * 1000000 + " " + size);