ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/extra166y/LongMapReduceDemo.java
Revision: 1.4
Committed: Tue Mar 15 19:47:04 2011 UTC (13 years, 1 month ago) by jsr166
Branch: MAIN
CVS Tags: release-1_7_0, HEAD
Changes since 1.3: +1 -1 lines
Log Message:
Update Creative Commons license URL in legal 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 jsr166y.*;
8 import extra166y.*;
9 import static extra166y.Ops.*;
10 import java.util.*;
11 import java.util.concurrent.*;
12
13 public class LongMapReduceDemo {
14 static final int NCPU = Runtime.getRuntime().availableProcessors();
15 static final Random rng = new Random();
16
17 /**
18 * Sequential version, for performance comparison
19 */
20 static long seqMapReduce(long[] array,
21 LongOp mapper,
22 LongReducer reducer,
23 long base) {
24 long n = array.length;
25 long x = base;
26 for (int i = 0; i < n; ++i)
27 x = reducer.op(x, mapper.op(array[i]));
28 return x;
29 }
30
31 // sample functions
32 static final class GetNext implements LongOp {
33 public long op(long seed) {
34 long x = seed;
35 x ^= x << 13;
36 x ^= x >>> 7;
37 x ^= (x << 17);
38 x ^= x << 13;
39 x ^= x >>> 7;
40 x ^= (x << 17);
41 x ^= x << 13;
42 x ^= x >>> 7;
43 x ^= (x << 17);
44 x ^= x << 13;
45 x ^= x >>> 7;
46 x ^= (x << 17);
47 return x;
48 }
49 }
50
51 static final class Accum implements LongReducer {
52 public long op(long x, long y) {
53 return x + y;
54 }
55 }
56
57 /** for time conversion */
58 static final long NPS = (1000L * 1000 * 1000);
59
60 public static void main(String[] args) throws Exception {
61 int n = 1 << 18;
62 int reps = 1 << 10;
63 long[] array = new long[n];
64 for (int i = 0; i < n; ++i)
65 array[i] = i + 1L;
66 ForkJoinPool fjp = new ForkJoinPool();
67 ParallelLongArray pa = ParallelLongArray.createUsingHandoff(array, fjp);
68 final GetNext getNext = new GetNext();
69 final Accum accum = new Accum();
70 final long zero = 0L;
71 long last, now;
72 double elapsed;
73 for (int j = 0; j < 2; ++j) {
74 long rseed = rng.nextLong();
75 resetSeeds(array, rseed);
76 long seqsum = 0;
77 last = System.nanoTime();
78 for (int k = 0; k < reps; ++k) {
79 seqsum += seqMapReduce(array, getNext, accum, zero);
80 long tmp = array[k];
81 array[k] = array[n - k - 1];
82 array[n - k - 1] = tmp;
83 }
84 now = System.nanoTime();
85 elapsed = (double)(now - last) / NPS;
86 last = now;
87 System.out.printf("sequential: %7.3f\n", elapsed);
88 for (int i = NCPU; i >= 1; i >>>= 1) {
89 resetSeeds(array, rseed);
90 long sum = 0;
91 last = System.nanoTime();
92 for (int k = 0; k < reps; ++k) {
93 sum += pa.withMapping(getNext).reduce(accum, zero);
94 long tmp = array[k];
95 array[k] = array[n - k - 1];
96 array[n - k - 1] = tmp;
97 }
98 now = System.nanoTime();
99 elapsed = (double)(now - last) / NPS;
100 last = now;
101 System.out.printf("poolSize %3d: %7.3f\n", fjp.getParallelism(), elapsed);
102 if (sum != seqsum) throw new Error("checksum");
103 }
104 for (int i = 2; i <= NCPU; i <<= 1) {
105 resetSeeds(array, rseed);
106 long sum = 0;
107 // fjp.setParallelism(i);
108 last = System.nanoTime();
109 for (int k = 0; k < reps; ++k) {
110 sum += pa.withMapping(getNext).reduce(accum, zero);
111 long tmp = array[k];
112 array[k] = array[n - k - 1];
113 array[n - k - 1] = tmp;
114 }
115 now = System.nanoTime();
116 elapsed = (double)(now - last) / NPS;
117 last = now;
118 System.out.printf("poolSize %3d: %7.3f\n", fjp.getParallelism(), elapsed);
119 if (sum != seqsum) throw new Error("checksum");
120 }
121 }
122 fjp.shutdownNow();
123 fjp.awaitTermination(1, TimeUnit.SECONDS);
124 Thread.sleep(100);
125 }
126
127 static void resetSeeds(long[] array, long s) {
128 for (int i = 0; i < array.length; ++i)
129 array[i] = s++;
130 }
131
132 }