ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/Fib.java
Revision: 1.7
Committed: Thu Jan 15 18:34:19 2015 UTC (9 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.6: +0 -2 lines
Log Message:
delete extraneous blank lines

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/publicdomain/zero/1.0/
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 * fibonacci(0) = 0;
14 * fibonacci(1) = 1.
15 * </pre>
16 */
17 public final class Fib extends RecursiveAction {
18
19 // Performance-tuning constant:
20 static int sequentialThreshold;
21
22 static long lastStealCount;
23
24 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 if (args.length > 2)
34 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 ForkJoinPool g = (procs == 0) ? new ForkJoinPool() :
43 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 /** for time conversion */
60 static final long NPS = (1000L * 1000 * 1000);
61
62 static void test(ForkJoinPool g, int num) throws Exception {
63 int ps = g.getParallelism();
64 // g.setParallelism(ps);
65 long start = System.nanoTime();
66 Fib f = new Fib(num);
67 g.invoke(f);
68 long time = System.nanoTime() - start;
69 double secs = ((double)time) / NPS;
70 long result = f.getAnswer();
71 System.out.print("Fib " + num + " = " + result);
72 System.out.printf("\tTime: %7.3f", secs);
73
74 long sc = g.getStealCount();
75 long ns = sc - lastStealCount;
76 lastStealCount = sc;
77 System.out.printf(" Steals/t: %5d", ns/ps);
78 System.out.printf(" Workers: %5d", g.getPoolSize());
79 System.out.println();
80 }
81
82 // Initialized with argument; replaced with result
83 int number;
84
85 Fib(int n) { number = n; }
86
87 int getAnswer() {
88 return number;
89 }
90
91 public final void compute() {
92 int n = number;
93 if (n > 1) {
94 if (n <= sequentialThreshold)
95 number = seqFib(n);
96 else {
97 Fib f1 = new Fib(n - 1);
98 Fib f2 = new Fib(n - 2);
99 // forkJoin(f1, f2);
100 invokeAll(f1, f2);
101 number = f1.number + f2.number;
102 }
103 }
104 }
105
106 // Sequential version for arguments less than threshold
107 static final int seqFib(int n) { // unroll left only
108 int r = 1;
109 do {
110 int m = n - 2;
111 r += m <= 1 ? m : seqFib(m);
112 } while (--n > 1);
113 return r;
114 }
115
116 }