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 *
15 * adapted from SciMark 2.0, author Roldan Pozo (pozo@cam.nist.gov) *
17 * This version copyright (c) The University of Edinburgh, 2001. *
18 * All rights reserved. *
20 **************************************************************************/
24 int id, num_iterations;
29 public SORRunner(int id, double omega, double G[][], int num_iterations, int nthreads, long RANDOM_SEED) {
33 this.num_iterations=num_iterations;
34 this.nthreads = nthreads;
35 this.RANDOM_SEED = RANDOM_SEED;
39 int tmpid, M, N, numthreads;
40 double omega_over_four, one_minus_omega;
42 int ilow, iupper, slice, tslice, ttslice, Mm1, Nm1;
47 omega_over_four = omega * 0.25;
48 one_minus_omega = 1.0 - omega;
49 numthreads = nthreads;
51 numiterations = num_iterations;
55 ttslice = (tslice + numthreads-1)/numthreads;
58 iupper = ((tmpid+1)*slice)+1;
59 if (iupper > Mm1) iupper = Mm1+1;
60 if (tmpid == (numthreads-1)) iupper = Mm1+1;
64 Random rand=new Random(RANDOM_SEED);
67 R[j]=rand.nextDouble() * 1e-6;
68 for(int i=ilow;i<iupper;i++) {
71 R[j]=rand.nextDouble() * 1e-6;
74 System.out.println("Starting computation!");
76 // update interior points
81 for (int p=0; p<2*numiterations; p++) {
82 for (int q=0;q<=2;q+=2) {//new line
84 for (int i=ilow+(p%2)+q; i<iupper; i=i+4) {//changed 2->4 and added q
87 double [] Gim1 = G[i-1];
90 double [] Gip1 = G[i+1];
93 for (int j=1; j<Nm1; j=j+2){
94 Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j-1]
95 + Gi[j+1]) + one_minus_omega * Gi[j];
99 } else if (i == Mm1) {
103 double [] Gip1 = G[i+1];
105 for (int j=1; j<Nm1; j=j+2){
106 Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j-1]
107 + Gi[j+1]) + one_minus_omega * Gi[j];
116 for (int q=0;q<=2;q+=2) {//new line
117 for (int i=ilow+(p%2)+q; i<iupper; i=i+4) { //added q, changed 2->4
120 double [] Gim1 = G[i-1];
123 } else if (i == Mm1) {
125 double [] Gim2 = G[i-2];
128 for (int j=1; j<Nm1; j=j+2){
130 Gim1[j+1]=omega_over_four * (Gim2[j+1] + Gi[j+1] + Gim1[j]
131 + Gim1[j+2]) + one_minus_omega * Gim1[j+1];
138 double [] Gim2 = G[i-2];
141 for (int j=1; j<Nm1; j=j+2){
143 Gim1[j+1]=omega_over_four * (Gim2[j+1] + Gi[j+1] + Gim1[j]
144 + Gim1[j+2]) + one_minus_omega * Gim1[j+1];