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 **************************************************************************/
22 class SORRunner extends Thread {
24 int id,num_iterations;
29 public SORRunner(int id, double omega, double G[][], int num_iterations,long[][] sync, int nthreads) {
33 this.num_iterations=num_iterations;
35 this.nthreads = nthreads;
43 double omega_over_four = omega * 0.25;
44 double one_minus_omega = 1.0 - omega;
46 // update interior points
52 int ilow, iupper, slice, tslice, ttslice;
55 ttslice = (tslice + nthreads-1)/nthreads;
59 iupper = ((id+1)*slice)+1;
60 if (iupper > Mm1) iupper = Mm1+1;
61 if (id == (nthreads-1)) iupper = Mm1+1;
63 for (int p=0; p<2*num_iterations; p++) {
64 for (int i=ilow+(p%2); i<iupper; i=i+2) {
67 double [] Gim1 = G[i-1];
70 double [] Gip1 = G[i+1];
72 for (int j=1; j<Nm1; j=j+2){
73 Gi[j] = omega_over_four * (Gim1[j] + Gip1[j] + Gi[j-1]
74 + Gi[j+1]) + one_minus_omega * Gi[j];
77 } else if (i == Mm1) {
79 double [] Gim2 = G[i-2];
81 for (int j=1; j<Nm1; j=j+2){
83 Gim1[j+1]=omega_over_four * (Gim2[j+1] + Gi[j+1] + Gim1[j]
84 + Gim1[j+2]) + one_minus_omega * Gim1[j+1];
90 double [] Gip1 = G[i+1];
91 double [] Gim2 = G[i-2];
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];
98 Gim1[j+1]=omega_over_four * (Gim2[j+1] + Gi[j+1] + Gim1[j]
99 + Gim1[j+2]) + one_minus_omega * Gim1[j+1];
106 // Signal this thread has done iteration
109 // Wait for neighbours;
111 while (sync[id-1][0] < sync[id][0]) ;
113 if (id < nthreads -1) {
114 while (sync[id+1][0] < sync[id][0]) ;