ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/LeftSpineFib.java
Revision: 1.5
Committed: Sat Feb 16 21:37:44 2013 UTC (11 years, 3 months ago) by jsr166
Branch: MAIN
Changes since 1.4: +6 -0 lines
Log Message:
add missing public domain notices

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