import java.util.concurrent.ForkJoinPool; import java.util.concurrent.*; /** * Class to use parallelism to compute the sum of two vectors. Extends * RecursiveAction, which itself extends ForkJoinTask * * @author kim * @version 2/20/2011 */ public class VecAdd extends RecursiveAction { private static final int VECTOR_SIZE = 200; private static final ForkJoinPool fjPool = new ForkJoinPool(); private static final int SEQUENTIAL_CUTOFF = 50; int lo; int hi; int[] res; int[] arr1; int[] arr2; public VecAdd(int l, int h, int[] r, int[] a1, int[] a2) { lo = l; hi = h; res = r; arr1 = a1; arr2 = a2; } protected void compute() { if ((hi - lo) < SEQUENTIAL_CUTOFF) { for (int i = lo; i < hi; i++) { res[i] = arr1[i] + arr2[i]; } } else { int mid = (hi + lo) / 2; VecAdd left = new VecAdd(lo, mid, res, arr1, arr2); VecAdd right = new VecAdd(mid, hi, res, arr1, arr2); left.fork(); right.compute(); left.join(); } } public static int[] add(int[] arr1, int[] arr2) { assert (arr1.length == arr2.length); int[] ans = new int[arr1.length]; fjPool.invoke(new VecAdd(0, arr1.length, ans, arr1, arr2)); return ans; } public static void main(String[] args) { int[] first = new int[VECTOR_SIZE]; int[] second = new int[VECTOR_SIZE]; for(int count = 0; count < VECTOR_SIZE; count++) { first[count] = count; second[count] = 2*count; } int[] answer = add(first,second); for(int val:answer) { System.out.print(val+", "); } } }