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

File Contents

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