ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/Integrate.java
Revision: 1.12
Committed: Mon Nov 29 20:58:06 2010 UTC (13 years, 5 months ago) by jsr166
Branch: MAIN
Changes since 1.11: +1 -1 lines
Log Message:
consistent ternary operator style

File Contents

# Content
1 /*
2 * Written by Doug Lea with assistance from members of JCP JSR-166
3 * Expert Group and released to the public domain, as explained at
4 * http://creativecommons.org/licenses/publicdomain
5 */
6
7 import java.util.concurrent.*;
8
9 /**
10 * Sample program using Guassian Quadrature for numerical integration.
11 * This version uses a simplified hardwired function. Inspired by a
12 * <A href="http://www.cs.uga.edu/~dkl/filaments/dist.html">
13 * Filaments</A> demo program.
14 *
15 */
16 public final class Integrate {
17
18 static final double errorTolerance = 1.0e-12;
19 /** for time conversion */
20 static final long NPS = (1000L * 1000 * 1000);
21
22 static final int SERIAL = -1;
23 static final int DYNAMIC = 0;
24 static final int FORK = 1;
25 static int forkPolicy = DYNAMIC;
26 static String forkArg = "dynamic";
27
28 // the function to integrate
29 static double computeFunction(double x) {
30 return (x * x + 1.0) * x;
31 }
32
33 static final double start = 0.0;
34 static final double end = 1536.0;
35 /*
36 * The number of recursive calls for
37 * integrate from start to end.
38 * (Empirically determined)
39 */
40 static final int calls = 263479047;
41
42 public static void main(String[] args) throws Exception {
43 int procs = 0;
44
45 try {
46 if (args.length > 0)
47 procs = Integer.parseInt(args[0]);
48 if (args.length > 1) {
49 forkArg = args[1];
50 if (forkArg.startsWith("s"))
51 forkPolicy = SERIAL;
52 else if (forkArg.startsWith("f"))
53 forkPolicy = FORK;
54 }
55 }
56 catch (Exception e) {
57 System.out.println("Usage: java Integrate3 threads <s[erial] | d[ynamic] | f[ork] - default d>");
58 return;
59 }
60 oneTest(procs);
61 oneTest(procs);
62 oneTest(procs);
63 }
64
65 static void oneTest(int procs) {
66 ForkJoinPool g = (procs == 0) ? new ForkJoinPool() :
67 new ForkJoinPool(procs);
68 System.out.println("Number of procs=" + g.getParallelism());
69 System.out.println("Integrating from " + start + " to " + end +
70 " forkPolicy = " + forkArg);
71 long lastTime = System.nanoTime();
72 for (int i = 0; i < 20; ++i) {
73 double a;
74 if (forkPolicy == SERIAL)
75 a = SQuad.computeArea(g, start, end);
76 else if (forkPolicy == FORK)
77 a = FQuad.computeArea(g, start, end);
78 else
79 a = DQuad.computeArea(g, start, end);
80 long now = System.nanoTime();
81 double s = ((double)(now - lastTime))/NPS;
82 lastTime = now;
83 System.out.printf("Calls/sec: %12d", (long) (calls / s));
84 System.out.printf(" Time: %7.3f", s);
85 System.out.printf(" Threads: %5d", g.getPoolSize());
86 // System.out.printf(" Area: %12.1f", a);
87 System.out.println();
88 }
89 System.out.println(g);
90 g.shutdown();
91 }
92
93
94 // Sequential version
95 static final class SQuad extends RecursiveAction {
96 static double computeArea(ForkJoinPool pool, double l, double r) {
97 SQuad q = new SQuad(l, r, 0);
98 pool.invoke(q);
99 return q.area;
100 }
101
102 final double left; // lower bound
103 final double right; // upper bound
104 double area;
105
106 SQuad(double l, double r, double a) {
107 this.left = l; this.right = r; this.area = a;
108 }
109
110 public final void compute() {
111 double l = left;
112 double r = right;
113 area = recEval(l, r, (l * l + 1.0) * l, (r * r + 1.0) * r, area);
114 }
115
116 static final double recEval(double l, double r, double fl,
117 double fr, double a) {
118 double h = (r - l) * 0.5;
119 double c = l + h;
120 double fc = (c * c + 1.0) * c;
121 double hh = h * 0.5;
122 double al = (fl + fc) * hh;
123 double ar = (fr + fc) * hh;
124 double alr = al + ar;
125 if (Math.abs(alr - a) <= errorTolerance)
126 return alr;
127 else
128 return recEval(c, r, fc, fr, ar) + recEval(l, c, fl, fc, al);
129 }
130
131 }
132
133 //....................................
134
135 // ForkJoin version
136 static final class FQuad extends RecursiveAction {
137 static double computeArea(ForkJoinPool pool, double l, double r) {
138 FQuad q = new FQuad(l, r, 0);
139 pool.invoke(q);
140 return q.area;
141 }
142
143 final double left; // lower bound
144 final double right; // upper bound
145 double area;
146
147 FQuad(double l, double r, double a) {
148 this.left = l; this.right = r; this.area = a;
149 }
150
151 public final void compute() {
152 double l = left;
153 double r = right;
154 area = recEval(l, r, (l * l + 1.0) * l, (r * r + 1.0) * r, area);
155 }
156
157 static final double recEval(double l, double r, double fl,
158 double fr, double a) {
159 double h = (r - l) * 0.5;
160 double c = l + h;
161 double fc = (c * c + 1.0) * c;
162 double hh = h * 0.5;
163 double al = (fl + fc) * hh;
164 double ar = (fr + fc) * hh;
165 double alr = al + ar;
166 if (Math.abs(alr - a) <= errorTolerance)
167 return alr;
168 FQuad q = new FQuad(l, c, al);
169 q.fork();
170 ar = recEval(c, r, fc, fr, ar);
171 if (!q.tryUnfork()) {
172 q.quietlyJoin();
173 return ar + q.area;
174 }
175 return ar + recEval(l, c, fl, fc, al);
176 }
177
178 }
179
180 // ...........................
181
182 // Version using on-demand Fork
183 static final class DQuad extends RecursiveAction {
184 static double computeArea(ForkJoinPool pool, double l, double r) {
185 DQuad q = new DQuad(l, r, 0);
186 pool.invoke(q);
187 return q.area;
188 }
189
190 final double left; // lower bound
191 final double right; // upper bound
192 double area;
193
194 DQuad(double l, double r, double a) {
195 this.left = l; this.right = r; this.area = a;
196 }
197
198 public final void compute() {
199 double l = left;
200 double r = right;
201 area = recEval(l, r, (l * l + 1.0) * l, (r * r + 1.0) * r, area);
202 }
203
204 static final double recEval(double l, double r, double fl,
205 double fr, double a) {
206 double h = (r - l) * 0.5;
207 double c = l + h;
208 double fc = (c * c + 1.0) * c;
209 double hh = h * 0.5;
210 double al = (fl + fc) * hh;
211 double ar = (fr + fc) * hh;
212 double alr = al + ar;
213 if (Math.abs(alr - a) <= errorTolerance)
214 return alr;
215 DQuad q = null;
216 if (getSurplusQueuedTaskCount() <= 3)
217 (q = new DQuad(l, c, al)).fork();
218 ar = recEval(c, r, fc, fr, ar);
219 if (q != null && !q.tryUnfork()) {
220 q.quietlyJoin();
221 return ar + q.area;
222 }
223 return ar + recEval(l, c, fl, fc, al);
224 }
225
226 }
227
228 }
229
230