MODULE exo2; (* ---------------------------------------------------------------------- exo2.pm D. Thiebaut Computes the max of a vector variable using data movement in the chain of PEs. ---------------------------------------------------------------------- *) CONST N=8; (* # of PEs *) (* ---------------------------------------------------------------------- P A R A L L E L A R C H I T E C T U R E ---------------------------------------------------------------------- *) CONFIGURATION chain[0..N-1]; CONNECTION left: chain[i]->chain[i-1]; right: chain[i]->chain[i+1]; (* ---------------------------------------------------------------------- V A R I A B L E S ---------------------------------------------------------------------- *) VAR x : chain OF INTEGER; y : chain OF INTEGER; i : INTEGER; (* ---------------------------------------------------------------------- M A I N ---------------------------------------------------------------------- *) BEGIN (*--- initialize x with random #'s ---*) x := RandomInt( chain ) MOD 100; (*--- use y as a shift register ---*) y := x; WriteString( "x = " ); WriteInt( x, 2 ); WriteString( "y = " ); WriteInt( y, 2 ); WriteLn; (*--- move data to the left, and keep largest of x and y in y ---*) (*--- as it is moving from right to left... ---*) FOR i:=1 TO N-1 DO (*--- move y to the left ---*) y := RECEIVE.left( y ); WriteLn; WriteString( "x = " ); WriteInt( x, 2 ); WriteString( "y = " ); WriteInt( y, 2 ); (*--- keep largest of x and y in y ---*) IF x > y THEN y := x; END; (* IF *) END; (* FOR *) (*--- output ---*) WriteLn; WriteString( "largest = " ); WriteInt( y<<1>>, 2 ); END exo2.