ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/Integrate.java
Revision: 1.15
Committed: Sun Oct 21 06:14:12 2012 UTC (11 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.14: +0 -1 lines
Log Message:
delete trailing empty lines of javadoc

File Contents

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