(* David Kotz, from Peter Su and Mark Valence, 1991 *) SYSTEM scan; CONST d = 4; n = 16; CONFIGURATION hyper [2], [2], [2], [2]; CONNECTION go(3) : hyper[i,j,k,l] -> hyper [(i+1) mod 2,j,k,l].go(3); go(2) : hyper[i,j,k,l] -> hyper [i,(j+1) mod 2,k,l].go(2); go(1) : hyper[i,j,k,l] -> hyper [i,j,(k+1) mod 2,l].go(1); go(0) : hyper[i,j,k,l] -> hyper [i,j,k,(l+1) mod 2].go(0); SCALAR k: integer; a: ARRAY[1..n] OF integer; VECTOR val: integer; dim : ARRAY[d] OF integer; PROCEDURE prefix_sum (VECTOR VAR x: integer); SCALAR i : integer; m : integer; VECTOR val : integer; temp : integer; sum : integer; BEGIN PARALLEL dim[3] := dim1; dim[2] := dim2; dim[1] := dim3; dim[0] := dim4; sum := x; val := x; i := 0; WHILE (2**i < n) DO PROPAGATE.go(i) (val,temp); val := val + temp; IF dim[i] = 1 THEN sum := sum + temp; END; i := i + 1; END; x := sum; ENDPARALLEL; END prefix_sum; BEGIN WriteString("Enter "); WriteInt(n,3); WriteString(" numbers."); WriteLn; FOR k:=1 TO n DO readint(a[k]) END; load(val,a); prefix_sum(val); WriteInt(val,4); END scan.