99 lines
2.4 KiB
Text
99 lines
2.4 KiB
Text
|
|
/* Simulates nodes which perform a map job */
|
||
|
|
int[] map ((int) -> int f, int[] src, int len) {
|
||
|
|
var tgt = new int[len];
|
||
|
|
for (var i = 0; i < len; i = i + 1;) { tgt[i] = f(src[i]); }
|
||
|
|
return tgt;
|
||
|
|
}
|
||
|
|
|
||
|
|
struct MapJob {
|
||
|
|
(int) -> int f;
|
||
|
|
int[] arr;
|
||
|
|
int arrlen
|
||
|
|
}
|
||
|
|
|
||
|
|
int[] mapNode(MapJob j) { return map(j.f, j.arr, j.arrlen); }
|
||
|
|
|
||
|
|
/* Simulates nodes which perform a reduce job */
|
||
|
|
|
||
|
|
int reduce((int, int) -> int f, int[] arr, int len, int base) {
|
||
|
|
var acc = base;
|
||
|
|
for (var i = 0; i < len; i = i + 1;) { acc = f(acc, arr[i]); }
|
||
|
|
return acc;
|
||
|
|
}
|
||
|
|
|
||
|
|
struct ReduceJob {
|
||
|
|
int[] arr;
|
||
|
|
int arrlen;
|
||
|
|
(int, int) -> int f;
|
||
|
|
int base
|
||
|
|
}
|
||
|
|
|
||
|
|
int reduceNode(ReduceJob j) { return reduce(j.f, j.arr, j.arrlen, j.base); }
|
||
|
|
|
||
|
|
/* Generates an array of data, partitions it into map jobs and assigns
|
||
|
|
them to virtual map nodes. When all data is mapped, reduces it into
|
||
|
|
an answer and returns it */
|
||
|
|
|
||
|
|
int square(int elt) { return elt * elt; }
|
||
|
|
|
||
|
|
int sum(int acc, int elt) { return acc + elt; }
|
||
|
|
|
||
|
|
int sumOfSquares(int[] arr, int arrlen, int numPartitions, int partitionLen) {
|
||
|
|
/* Partition array into almost equal subarrays */
|
||
|
|
var src = new int[][numPartitions];
|
||
|
|
for (var i = 0; i < numPartitions; i = i + 1;) {
|
||
|
|
src[i] = new int[partitionLen];
|
||
|
|
}
|
||
|
|
var j = 0;
|
||
|
|
var k = 0;
|
||
|
|
for (var i = 0; i < arrlen; i = i + 1;) {
|
||
|
|
src[j][k] = arr[i];
|
||
|
|
if (j == numPartitions - 1) {
|
||
|
|
j = 0;
|
||
|
|
k = k + 1;
|
||
|
|
} else { j = j + 1; }
|
||
|
|
}
|
||
|
|
/* Build map-jobs */
|
||
|
|
var mapJobs = new MapJob[numPartitions];
|
||
|
|
for (var i = 0; i < numPartitions; i = i + 1;) {
|
||
|
|
mapJobs[i] = new MapJob {
|
||
|
|
f = square;
|
||
|
|
arr = src[i];
|
||
|
|
arrlen = partitionLen
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/* Map! */
|
||
|
|
var tgt = new int[][numPartitions];
|
||
|
|
for (var i = 0; i < numPartitions; i = i + 1;) {
|
||
|
|
tgt[i] = mapNode(mapJobs[i]);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Build reduce-jobs */
|
||
|
|
var reduceJobs = new ReduceJob[numPartitions];
|
||
|
|
for (var i = 0; i < numPartitions; i = i + 1;) {
|
||
|
|
reduceJobs[i] = new ReduceJob {
|
||
|
|
f = sum;
|
||
|
|
arr = tgt[i];
|
||
|
|
arrlen = partitionLen;
|
||
|
|
base = 0
|
||
|
|
};
|
||
|
|
}
|
||
|
|
/* Reduce! */
|
||
|
|
var acc = 0;
|
||
|
|
for (var i = 0; i < numPartitions; i = i + 1;) {
|
||
|
|
acc = acc + reduceNode(reduceJobs[i]);
|
||
|
|
}
|
||
|
|
return acc;
|
||
|
|
}
|
||
|
|
|
||
|
|
int program(int argc, string[] argv) {
|
||
|
|
/* Initialize array with first n positive ints */
|
||
|
|
var n = 30;
|
||
|
|
var arr = new int[n];
|
||
|
|
for (var i = 0; i < n; i = i + 1;) { arr[i] = i + 1; }
|
||
|
|
/* Need partitionLen * numPartitions >= arr.length */
|
||
|
|
var numPartitions = 5;
|
||
|
|
var partitionLen = 6;
|
||
|
|
return sumOfSquares(arr, n, numPartitions, partitionLen);
|
||
|
|
}
|