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
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.
16 public class Em3d extends Thread
20 * The number of nodes (E and H)
24 * The out-degree of each node.
26 private int numDegree;
28 * The number of compute iterations
32 * Should we print the results and other runtime messages
34 private boolean printResult;
36 * Print information messages?
38 private boolean printMsgs;
55 public Em3d(BiGraph bg, int lowerlimit, int upperlimit, int numIter, Barrier mybarr) {
57 this.lowerlimit = lowerlimit;
58 this.upperlimit = upperlimit;
59 this.numIter = numIter;
72 for (int i = 0; i < iteration; i++) {
75 for(int j = lowerlimit; j<upperlimit; j++) {
76 Node n = bg.eNodes[j];
78 for (int k = 0; k < n.fromCount; k++) {
79 n.value -= n.coeffs[k] * n.fromNodes[k].value;
84 Barrier.enterBarrier(barr);
85 System.clearPrefetchCache();
89 for(int j = lowerlimit; j<upperlimit; j++) {
90 Node n = bg.hNodes[j];
91 for (int k = 0; k < n.fromCount; k++) {
92 n.value -= n.coeffs[k] * n.fromNodes[k].value;
96 Barrier.enterBarrier(barr);
97 System.clearPrefetchCache();
102 * The main roitine that creates the irregular, linked data structure
103 * that represents the electric and magnetic fields and propagates the
104 * waves through the graph.
105 * @param args the command line arguments
107 public static void main(String args[]) {
108 Em3d em = new Em3d();
109 Em3d.parseCmdLine(args, em);
111 System.printString("Initializing em3d random graph...\n");
112 long start0 = System.currentTimeMillis();
113 int numThreads = em.numThreads;
114 int[] mid = new int[4];
115 mid[0] = (128<<24)|(195<<16)|(175<<8)|69;
116 mid[1] = (128<<24)|(195<<16)|(175<<8)|80;
117 mid[2] = (128<<24)|(195<<16)|(175<<8)|73;
118 mid[3] = (128<<24)|(195<<16)|(175<<8)|78;
119 System.printString("DEBUG -> numThreads = " + numThreads+"\n");
122 Random rand = new Random(783);
125 mybarr = global new Barrier(numThreads);
126 graph = BiGraph.create(em.numNodes, em.numDegree, em.printResult, rand);
129 long end0 = System.currentTimeMillis();
131 // compute a single iteration of electro-magnetic propagation
133 System.printString("Propagating field values for " + em.numIter +
134 " iteration(s)...\n");
135 long start1 = System.currentTimeMillis();
139 em3d = global new Em3d[numThreads];
140 int increment=em.numNodes/numThreads;
142 for(int i=0;i<numThreads;i++) {
143 if ((i+1)==numThreads)
144 em3d[i] = global new Em3d(graph, base, em.numNodes, em.numIter, mybarr);
146 em3d[i] = global new Em3d(graph, base, base+increment, em.numIter, mybarr);
152 for(int i = 0; i<numThreads; i++) {
159 for(int i = 0; i<numThreads; i++) {
165 long end1 = System.currentTimeMillis();
167 // print current field values
168 if (em.printResult) {
169 StringBuffer retval = new StringBuffer();
172 dvalue = graph.hNodes[0].value;
174 int intvalue = (int)dvalue;
178 System.printString("EM3D build time "+ (long)((end0 - start0)/1000.0) + "\n");
179 System.printString("EM3D compute time " + (long)((end1 - start1)/1000.0) + "\n");
180 System.printString("EM3D total time " + (long)((end1 - start0)/1000.0) + "\n");
182 System.printString("Done!"+ "\n");
187 * Parse the command line options.
188 * @param args the command line options.
191 public static void parseCmdLine(String args[], Em3d em)
196 while (i < args.length && args[i].startsWith("-")) {
199 // check for options that require arguments
200 if (arg.equals("-N")) {
201 if (i < args.length) {
202 em.numNodes = new Integer(args[i++]).intValue();
204 } else if (arg.equals("-T")) {
205 if (i < args.length) {
206 em.numThreads = new Integer(args[i++]).intValue();
208 } else if (arg.equals("-d")) {
209 if (i < args.length) {
210 em.numDegree = new Integer(args[i++]).intValue();
212 } else if (arg.equals("-i")) {
213 if (i < args.length) {
214 em.numIter = new Integer(args[i++]).intValue();
216 } else if (arg.equals("-p")) {
217 em.printResult = true;
218 } else if (arg.equals("-m")) {
220 } else if (arg.equals("-h")) {
225 if (em.numNodes == 0 || em.numDegree == 0)
230 * The usage routine which describes the program options.
234 System.printString("usage: java Em3d -T <threads> -N <nodes> -d <degree> [-p] [-m] [-h]\n");
235 System.printString(" -N the number of nodes\n");
236 System.printString(" -T the number of threads\n");
237 System.printString(" -d the out-degree of each node\n");
238 System.printString(" -i the number of iterations\n");
239 System.printString(" -p (print detailed results\n)");
240 System.printString(" -m (print informative messages)\n");
241 System.printString(" -h (this message)\n");