import DPJRuntime.*;
public class IntegerSumReduction {
private region AccumRgn;
private static int sum in AccumRgn;
public static <region R | R:* # AccumRgn> int
reduce(DPJArrayInt<R> arr, int tileSize)
reads R:* writes AccumRgn {
sum = 0;
DPJPartitionInt<R> segs =
DPJPartitionInt.<region R>
stridedPartition(arr, tileSize);
foreach(int i in 0, segs.length) {
int partialSum = 0;
DPJArrayInt<R:*> seg = segs.get(i);
for (int j = 0; j < seg.length; ++j)
partialSum += seg.get(j);
updateSum(partialSum);
}
return sum;
}
private static commutative synchronized
void updateSum(int partialSum) writes AccumRgn {
sum += partialSum;
}
public static void main(String[] args) {
region MainRgn;
int SIZE = 1000000;
int TILESIZE = 1000;
DPJArrayInt<MainRgn> arr =
new DPJArrayInt<MainRgn>(SIZE);
arr.put(42, 42);
int sum = reduce(arr, TILESIZE);
System.out.println("sum="+sum);
}
}