/**
* Parallel sum reduction
* @author Robert L. Bocchino Jr.
* October 2008
*/
import DPJRuntime.*;
public class SumReduce extends Harness {
public SumReduce(String[] args) {
super("SumReduce", args, 2, 3);
if (args.length == 3)
seqLength = Integer.parseInt(args[2]);
}
public <region R>int reduce(ArraySliceInt<R> A,
int seqLength)
reads R
{
if (A.length == 0) return 0;
if (A.length == 1) return A.get(0);
int result = 0;
if (A.length > seqLength) {
int tmp1, tmp2;
cobegin {
tmp1 = reduce(A.subslice(0, A.length/2),
seqLength);
tmp2 = reduce(A.subslice(A.length/2,
A.length - A.length/2),
seqLength);
}
result = tmp1 + tmp2;
} else {
for (int i = 0; i < A.length; ++i)
result += A.get(i);
}
return result;
}
@Override
public void initialize() {
A = new ArrayInt(size);
for (int i = 0; i < A.length; ++i) {
A[i] = i;
}
}
@Override
public void runTest() {
int myResult = 0;
for (int i = 0; i < A.length; ++i)
myResult += A[i];
assert(result == myResult);
}
@Override
public void runWork() {
result = reduce(new ArraySliceInt<*>(A),
seqLength);
}
@Override
public void usage() {
System.err.println("Usage: java " + progName + ".java [mode] [size] [seqsize]");
System.err.println("mode = TEST, IDEAL, TIME");
System.err.println("size = problem size (int)");
System.err.println("seqsize = sequential problem size (int)");
}
private int seqLength = 1;
private ArrayInt A;
private int result = 0;
public static void main(String[] args) {
SumReduce sr = new SumReduce(args);
sr.run();
}
}