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 **************************************************************************/
21 // This implements a simple tournament-based barrier, using entirely its
22 // own synchronisation. At present Yield() is called to stop busy-waiting
23 // processes hogging the processor(s)!
25 public class TournamentBarrier {
26 // Array of flags indicating whether the given process and all those
27 // for which it is responsible have finished. The "sense" of this
28 // array alternates with each barrier, to prevent having to
31 public int maxBusyIter;
34 public TournamentBarrier(int n) {
37 // Superclass constructor should record the number of threads
38 // and thread manager.
41 // Initialise the IsDone array. The choice of initial value is
42 // arbitrary, but must be consistent!
43 IsDone = global new boolean[numThreads];
44 for(int i = 0; i < n; i++) {
49 // Uses the manager's debug function, so this can only be used after
51 public void debug(String s) {
52 // System.err.println("Debug message");
55 public void setMaxBusyIter(int b) {
59 public void DoBarrier(int myid) {
61 // debug("Thread " + myid + " checking in");
64 boolean donevalue = !IsDone[myid];
66 while(((myid & roundmask) == 0) && (roundmask<(numThreads<<2))) {
67 int spacing = (roundmask+1) >> 2;
68 for(int i=1; i<=3 && myid+i*spacing < numThreads; i++) {
69 // debug("Thread " + myid + " waiting for thread " + (myid+i*spacing));
71 while(IsDone[myid+i*spacing] != donevalue) {
79 roundmask = (roundmask << 2) + 3;
81 // debug("Thread " + myid + " reporting done");
82 IsDone[myid] = donevalue;
84 while(IsDone[0] != donevalue) {
91 //debug("Thread " + myid + " checking out");