ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/Fib.java
Revision: 1.3
Committed: Sat Oct 16 16:22:56 2010 UTC (13 years, 6 months ago) by jsr166
Branch: MAIN
Changes since 1.2: +1 -2 lines
Log Message:
coding style

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     * http://creativecommons.org/licenses/publicdomain
5     */
6    
7     import java.util.concurrent.*;
8    
9     /**
10     * Recursive task-based version of Fibonacci. Computes:
11     * <pre>
12     * Computes fibonacci(n) = fibonacci(n-1) + fibonacci(n-2); for n> 1
13 jsr166 1.2 * fibonacci(0) = 0;
14     * fibonacci(1) = 1.
15 dl 1.1 * </pre>
16 jsr166 1.3 */
17 dl 1.1 public final class Fib extends RecursiveAction {
18    
19     // Performance-tuning constant:
20     static int sequentialThreshold;
21    
22     static long lastStealCount;
23 jsr166 1.2
24 dl 1.1 public static void main(String[] args) throws Exception {
25     int procs = 0;
26     int num = 45;
27     sequentialThreshold = 2;
28     try {
29     if (args.length > 0)
30     procs = Integer.parseInt(args[0]);
31     if (args.length > 1)
32     num = Integer.parseInt(args[1]);
33 jsr166 1.2 if (args.length > 2)
34 dl 1.1 sequentialThreshold = Integer.parseInt(args[2]);
35     }
36     catch (Exception e) {
37     System.out.println("Usage: java Fib <threads> <number> [<sequentialThreshold>]");
38     return;
39     }
40    
41     for (int reps = 0; reps < 2; ++reps) {
42 jsr166 1.2 ForkJoinPool g = procs == 0? new ForkJoinPool() :
43 dl 1.1 new ForkJoinPool(procs);
44     lastStealCount = g.getStealCount();
45     for (int i = 0; i < 20; ++i) {
46     test(g, num);
47     // if (i == 0)
48     // Thread.sleep(100);
49     }
50     System.out.println(g);
51     g.shutdown();
52     if (!g.awaitTermination(10, TimeUnit.SECONDS))
53     throw new Error();
54     g = null;
55     Thread.sleep(500);
56     }
57     }
58    
59    
60     /** for time conversion */
61     static final long NPS = (1000L * 1000 * 1000);
62    
63     static void test(ForkJoinPool g, int num) throws Exception {
64     int ps = g.getParallelism();
65     // g.setParallelism(ps);
66     long start = System.nanoTime();
67     Fib f = new Fib(num);
68     g.invoke(f);
69     long time = System.nanoTime() - start;
70     double secs = ((double)time) / NPS;
71     long result = f.getAnswer();
72     System.out.print("Fib " + num + " = " + result);
73     System.out.printf("\tTime: %7.3f", secs);
74 jsr166 1.2
75 dl 1.1 long sc = g.getStealCount();
76     long ns = sc - lastStealCount;
77     lastStealCount = sc;
78     System.out.printf(" Steals/t: %5d", ns/ps);
79     System.out.printf(" Workers: %5d", g.getPoolSize());
80     System.out.println();
81     }
82    
83    
84     // Initialized with argument; replaced with result
85     int number;
86    
87     Fib(int n) { number = n; }
88    
89     int getAnswer() {
90     return number;
91     }
92    
93     public final void compute() {
94     int n = number;
95     if (n > 1) {
96     if (n <= sequentialThreshold)
97     number = seqFib(n);
98     else {
99     Fib f1 = new Fib(n - 1);
100     Fib f2 = new Fib(n - 2);
101 jsr166 1.2 // forkJoin(f1, f2);
102     invokeAll(f1, f2);
103 dl 1.1 number = f1.number + f2.number;
104     }
105     }
106     }
107    
108     // Sequential version for arguments less than threshold
109     static final int seqFib(int n) { // unroll left only
110     int r = 1;
111     do {
112     int m = n - 2;
113     r += m <= 1 ? m : seqFib(m);
114     } while (--n > 1);
115     return r;
116     }
117    
118     }
119