MODULE matrixarraymult2; (*--------------------------------------------------------- File name: matrixarraymult2pm Author: AG Date: 9/30/05 Problem: Multiplies one big matrix n x n with a vector n x 1. Both are store in lines. Final Result is stored on an array. Example of Execution: Initial Matrix and array: ArrLine[0]: 0 0 0 0 0 ArrLine[1]: 1 1 1 1 1 ArrLine[2]: 2 2 2 2 2 ArrLine[3]: 3 3 3 3 3 ArrLine[4]: 4 4 4 4 4 L1arr: 1 1 1 1 1 Result: Ares[0]: 0 Ares[1]: 5 Ares[2]: 10 Ares[3]: 15 Ares[4]: 20 Cycles: N Mult + N REDUCE.SUM = N * constant Observation REDUCE.SUM is done in constant time. *) (*---------------------------------------------------------- CONFIGURATION ----------------------------------------------------------*) CONST MAXCELLS=1024; (* MAXCELLS cells in one line *) CONST N=5; CONFIGURATION chain[0..(MAXCELLS - 1)]; CONNECTION left: chain [i] -> chain[(i-1) MOD MAXCELLS]; right: chain[i] -> chain[(i+1) MOD MAXCELLS]; (*---------------------------------------------------------- VARIABLES ----------------------------------------------------------*) VAR ArrLine: ARRAY[0..(N-1)] OF chain OF INTEGER; L0id, L1arr, L2temp: chain OF INTEGER; Ares: ARRAY[0..(N-1)] OF INTEGER; i: INTEGER; (*---------------------------------------------------------- MAIN ----------------------------------------------------------*) BEGIN L0id:= ID(chain); (* L0id is the index line= 1 2 3 4 5... *) (*Initialize data *) ArrLine[0]:= 0; (* ArrLine[0]:= 0 0 0 0 0 *) ArrLine[1]:= 1; (* ArrLine[1]:= 1 1 1 1 1 *) ArrLine[2]:= 2; (* ArrLine[2]:= 2 2 2 2 2 *) ArrLine[3]:= 3; ArrLine[4]:= 4; L1arr:= 1; (* L1arr:= 1 1 1 1 1 *) (* print initial matrices *) WriteString("Initial Matrix and array: "); WriteLn; WriteLn; IF L0id <= N THEN FOR i:=0 TO (N-1) DO WriteString("ArrLine["); WriteInt(i,0); WriteString("]: "); WriteInt(ArrLine[i], 2); WriteLn; END; (* FOR *) WriteString("L1arr: "); WriteInt(L1arr,0); WriteLn; END; (*end print*) (************** start algorithm ********************) IF L0id <= N THEN (* select only from 1 to N *) FOR i:= 0 TO (N-1) DO L2temp:= ArrLine[i] * L1arr; Ares[i]:= REDUCE.SUM(L2temp); (* calculate sum of all multiplications *) END; (* for *) END; (*************** end algorithm ********************) (* print *) WriteString("Result: "); WriteLn; WriteLn; IF L0id <= N THEN FOR i:=0 TO (N-1) DO WriteString("Ares["); WriteInt(i,0); WriteString("]: "); WriteInt(Ares[i], 2); WriteLn; END; (* FOR *) END; (*end print*) END matrixarraymult2.