Newsgroups: comp.parallel.mpi
From: David Mallarme <dmallarm@cs.ruu.nl>
Subject: calculation of a matrix in parallel
Organization: Utrecht University, Dept. of Computer Science
Date: Fri, 9 Dec 1994 15:25:39 GMT
Mime-Version: 1.0
Content-Type: TEXT/PLAIN; charset=US-ASCII
Message-ID: <Pine.HPP.3.91.941209161519.3379A-100000@lampo.cs.ruu.nl>

Hello,

I have a problem to implement in Modulaiii with the use of channel (home 
mades...) the calculation of a multiplication of 2 matrix n*n with the 
method of network. Here is the incomplete program :

MODULE MatrixMul;
FROM Ppc IMPORT Process, StartProcess, WriteText, WaitFor, WriteInt,
		ReadAndWrite;
FROM Chan IMPORT Channel, InitChan, ReadFromChan, SendToChan;
TYPE 
	MatrixRow = ARRAY [1..size] OF INTEGER;
	Matrix = ARRAY [1..size] OF MatrixRow;
	ChanMatrix = ARRAY [0..size] OF ARRAY [0..(2*size)] OF Channel;
	
CONST size = 3
	A = Matrix;
	B = Matrix;

VAR Source, Sink, Zero, Result, Element : Process;
	AllChannels : ChanMatrix;

PROCEDURE SourceProc()=
VAR South:Channel;

BEGIN


	FOR counter := 1 TO size DO
		SendToChan(South, B[..][counter])
	END
END SourceProc;

PROCEDURE SinkProc()=
VAR North :Channel;

BEGIN


	LOOP
		dummy := ReadFromChan(North)
	END
END SinkProc;

PROCEDURE ZeroProc()=
VAR East: Channel;

BEGIN



	FOR counter :=1 TO size DO 
		SendToChan(East, 0)
	END
END ZeroProc;


PROCEDURE ResultProc()=
VAR West: Channel;

BEGIN



	FOR counter :=1 TO size DO 
		C[..][counter] := ReadFromChan(West)
	END;
	LOCK ReadAndWrite DO 
		FOR counter :=1 TO size DO
			WriteInt(C[..][counter]);
			WriteText(" ")
		END;
	WriteText("\n")
	END;
END ResultProc;

PROCEDURE ElementProc()=
VAR North, South, East, West : Channel;

BEGIN
	a:= A[..][..];
	
	
	
	LOOP
		b:=ReadFromChan(North);
		SendToChan(South, b);
		sum:=sum+a*b;
		SendToChan(East, sum)
	END
END ElementProc;

BEGIN
	WriteText("Matrix Multiplication\n");
	
	WriteText("Please, Enter the contents of the matrix ");
	WriteText("Matrix A");
	FOR y:= 1 TO size DO
		FOR x:= 1 TO size DO
			ReadInt(A[x][y]);WriteText(" ");
		END;
		WriteText("\n");
	END;
	WriteText("Matrix B");
	FOR y:= 1 TO size DO
		FOR x:= 1 TO size DO
			ReadInt(B[x][y]);WriteText(" ");
		END;
		WriteText("\n");
	END;

	FOR x:= 1 TO size DO
		FOR y:=1 TO 2*size DO
			InitChan(AllChannels);
		END;
	END;




	WaitFor(Result)
END MatrixMul.

Thanks for all reply.

David dmallarm@cs.ruu.nl

