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 {
29 public int cachelinesize;
32 public JGFSORBench(int nthreads){
33 this.nthreads = nthreads;
34 datasizes = global new int[3];
38 JACOBI_NUM_ITER = 100;
39 RANDOM_SEED = 10101010;
40 R = global new Random(RANDOM_SEED);
45 public void JGFsetsize(int size){
49 public static void JGFkernel(JGFSORBench sor) {
50 int numthreads, datasize;
53 numthreads = sor.nthreads;
55 datasize = sor.datasizes[sor.size];
61 G = sor.RandomMatrix(datasize, datasize, rand);
68 num_iterations = sor.JACOBI_NUM_ITER;
71 double omega_over_four = omega * 0.25;
72 double one_minus_omega = 1.0 - omega;
74 // update interior points
82 tmpcachelinesize = sor.cachelinesize;
85 SORRunner[] thobjects;
87 thobjects = global new SORRunner[numthreads];
88 sor.sync = sor.init_sync(numthreads, tmpcachelinesize);
91 //JGFInstrumentor.startTimer("Section2:SOR:Kernel", instr.timers);
94 int[] mid = new int[4];
95 mid[0] = (128<<24)|(195<<16)|(175<<8)|79;
96 mid[1] = (128<<24)|(195<<16)|(175<<8)|80;
97 mid[2] = (128<<24)|(195<<16)|(175<<8)|73;
98 mid[3] = (128<<24)|(195<<16)|(175<<8)|78;
99 for(int i=1;i<numthreads;i++) {
101 thobjects[i] = global new SORRunner(i,omega,G,num_iterations,sor.sync,numthreads);
107 thobjects[0] = global new SORRunner(0,omega,G,num_iterations,sor.sync,numthreads);
113 for(int i=1;i<numthreads;i++) {
120 //JGFInstrumentor.stopTimer("Section2:SOR:Kernel", instr.timers);
122 for (int i=1; i<Nm1; i++) {
123 for (int j=1; j<Nm1; j++) {
124 sor.Gtotal += G[i][j];
130 public int[][] init_sync(int nthreads, int cachelinesize) {
132 sync = global new int [nthreads][cachelinesize];
133 for (int i = 0; i<nthreads; i++)
138 public double[][] RandomMatrix(int M, int N, Random R)
140 double A[][] = global new double[M][N];
142 for (int i=0; i<N; i++)
143 for (int j=0; j<N; j++)
145 A[i][j] = R.nextDouble() * 1e-6;
150 public int JGFvalidate(){
153 refval = new double[3];
154 refval[0] = 0.498574406322512;
155 refval[1] = 1.1234778980135105;
156 refval[2] = 1.9954895063582696;
157 double dev = Math.fabs(Gtotal - refval[size]);
158 long l = (long) refval[size] * 1000000;
159 long r = (long) Gtotal * 1000000;
161 //System.printString("Validation failed");
162 //System.printString("Gtotal = " + (long) Gtotal * 1000000 + " " +(long) dev * 1000000 + " " + size);