check in latest versions
[IRC.git] / Robust / src / Benchmarks / Prefetch / Em3d / dsm / Em3d1.java
1 /** 
2  *
3  *
4  * Java implementation of the <tt>em3d</tt> Olden benchmark.  This Olden
5  * benchmark models the propagation of electromagnetic waves through
6  * objects in 3 dimensions. It is a simple computation on an irregular
7  * bipartite graph containing nodes representing electric and magnetic
8  * field values.
9  *
10  * <p><cite>
11  * D. Culler, A. Dusseau, S. Goldstein, A. Krishnamurthy, S. Lumetta, T. von 
12  * Eicken and K. Yelick. "Parallel Programming in Split-C".  Supercomputing
13  * 1993, pages 262-273.
14  * </cite>
15  **/
16 public class Em3d extends Thread
17 {
18
19   /**
20    * The number of nodes (E and H) 
21    **/
22   private int numNodes;
23   /**
24    * The out-degree of each node.
25    **/
26   private int numDegree;
27   /**
28    * The number of compute iterations 
29    **/
30   private int numIter;
31   /**
32    * Should we print the results and other runtime messages
33    **/
34   private boolean printResult;
35   /**
36    * Print information messages?
37    **/
38   private boolean printMsgs;
39
40   BiGraph bg;
41   int upperlimit;
42   int lowerlimit;
43   Barrier mybarr;
44
45   public Em3d() {
46     numNodes = 0;
47     numDegree = 0;
48     numIter = 1;
49     printResult = false;
50     printMsgs = false;
51   }
52
53   public Em3d(BiGraph bg, int lowerlimit, int upperlimit, int numIter, Barrier mybarr) {
54     this.bg = bg;
55     this.lowerlimit = lowerlimit;
56     this.upperlimit = upperlimit;
57     this.numIter = numIter;
58     this.mybarr = mybarr;
59   }
60
61   public void run() {
62     int iteration;
63     Barrier barr;
64     Node enodebase;
65     Node hnodebase;
66
67     atomic {
68       iteration = numIter;
69       barr=mybarr;
70     }
71     atomic {
72         enodebase=bg.eNodes;
73         hnodebase=bg.hNodes;
74         for(int j = 0; j<lowerlimit; j++){
75             enodebase = enodebase.next;
76             hnodebase = hnodebase.next;
77         }
78     }
79
80     for (int i = 0; i < iteration; i++) {
81       /* for  eNodes */
82         atomic {
83             Node n = enodebase;
84             for(int j = lowerlimit; j<upperlimit; j++) {
85                 for (int k = 0; k < n.fromCount; k++) {
86                     n.value -= n.coeffs[k] * n.fromNodes[k].value;
87                 }
88                 n = n.next;
89             }
90         }
91         
92         Barrier.enterBarrier(barr);
93         System.clearPrefetchCache();
94
95         /* for  hNodes */
96         atomic {
97             Node n = hnodebase;
98             for(int j = lowerlimit; j<upperlimit; j++) {
99                 for (int k = 0; k < n.fromCount; k++) {
100                     n.value -= n.coeffs[k] * n.fromNodes[k].value;
101                 }
102                 n=n.next;
103             }
104         }
105         Barrier.enterBarrier(barr);
106         System.clearPrefetchCache();
107     }
108   }
109
110   /**
111    * The main roitine that creates the irregular, linked data structure
112    * that represents the electric and magnetic fields and propagates the
113    * waves through the graph.
114    * @param args the command line arguments
115    **/
116   public static void main(String args[]) {
117     Em3d em = new Em3d();
118     Em3d.parseCmdLine(args, em);
119     if (em.printMsgs) 
120       System.printString("Initializing em3d random graph...\n");
121     long start0 = System.currentTimeMillis();
122     int numThreads = 1;
123     int[] mid = new int[numThreads];
124     mid[0] = (128<<24)|(195<<16)|(175<<8)|79;
125     System.printString("DEBUG -> numThreads = " + numThreads+"\n");
126     Barrier mybarr;
127     atomic {
128       mybarr = global new Barrier(numThreads);
129     }
130     BiGraph graph;
131     Random rand = new Random(783);
132     atomic {
133       graph =  BiGraph.create(em.numNodes, em.numDegree, em.printResult, rand);
134     }
135
136     long end0 = System.currentTimeMillis();
137
138     // compute a single iteration of electro-magnetic propagation
139     if (em.printMsgs) 
140       System.printString("Propagating field values for " + em.numIter + 
141           " iteration(s)...\n");
142     long start1 = System.currentTimeMillis();
143     Em3d[] em3d;
144     atomic {
145       em3d = global new Em3d[numThreads];
146       em3d[0] = global new Em3d(graph, 0, em.numNodes, em.numIter, mybarr);
147     }
148
149     Em3d tmp;
150     for(int i = 0; i<numThreads; i++) {
151       atomic {
152         tmp = em3d[i];
153       }
154       tmp.start(mid[i]);
155     }
156
157     for(int i = 0; i<numThreads; i++) {
158       atomic { 
159         tmp = em3d[i];
160       }
161       tmp.join();
162     }
163     long end1 = System.currentTimeMillis();
164
165     // print current field values
166     if (em.printResult) {
167       StringBuffer retval = new StringBuffer();
168       double dvalue;
169       atomic {
170         dvalue = graph.hNodes.value;
171       }
172       int intvalue = (int)dvalue;
173     }
174
175     if (em.printMsgs) {
176       System.printString("EM3D build time "+ (long)((end0 - start0)/1000.0) + "\n");
177       System.printString("EM3D compute time " + (long)((end1 - start1)/1000.0) + "\n");
178       System.printString("EM3D total time " + (long)((end1 - start0)/1000.0) + "\n");
179     }
180     System.printString("Done!"+ "\n");
181   }
182
183
184   /**
185    * Parse the command line options.
186    * @param args the command line options.
187    **/
188
189   public static void parseCmdLine(String args[], Em3d em)
190   {
191     int i = 0;
192     String arg;
193
194     while (i < args.length && args[i].startsWith("-")) {
195       arg = args[i++];
196
197       // check for options that require arguments
198       if (arg.equals("-N")) {
199         if (i < args.length) {
200                 em.numNodes = new Integer(args[i++]).intValue();
201         }
202       } else if (arg.equals("-d")) {
203         if (i < args.length) {
204                 em.numDegree = new Integer(args[i++]).intValue();
205         }
206       } else if (arg.equals("-i")) {
207         if (i < args.length) {
208             em.numIter = new Integer(args[i++]).intValue();
209         }
210       } else if (arg.equals("-p")) {
211               em.printResult = true;
212       } else if (arg.equals("-m")) {
213               em.printMsgs = true;
214       } else if (arg.equals("-h")) {
215         em.usage();
216       }
217     }
218
219     if (em.numNodes == 0 || em.numDegree == 0) 
220       em.usage();
221   }
222
223   /**
224    * The usage routine which describes the program options.
225    **/
226   public void usage()
227   {
228     System.printString("usage: java Em3d -N <nodes> -d <degree> [-p] [-m] [-h]\n");
229     System.printString("    -N the number of nodes\n");
230     System.printString("    -d the out-degree of each node\n");
231     System.printString("    -i the number of iterations\n");
232     System.printString("    -p (print detailed results\n)");
233     System.printString("    -m (print informative messages)\n");
234     System.printString("    -h (this message)\n");
235   }
236
237 }