#include "mult.hh"
// does the job of calculating the row
void
DoJob (const TransmitMatrices &Matrices, int Row, DoubleVector &Result)
{
Result = DoubleVector (Matrices.ColumnsB);
for (int Column = 0; Column < Matrices.ColumnsB; ++Column)
{
for (int i = 0; i < Matrices.ColumnsA_RowsB; ++i)
{
Result[Column] += Matrices.MatrixA[Row][i] *
Matrices.MatrixB[i][Column];
}
}
}
int
main ()
{
TransmitMatrices Matrices;
Pvm::Task Parent = Pvm::Pvm ().I ().Parent ();
Matrices.ReceiveFrom (Parent);
TransmitCoords Coords;
// waiting for new job or for request of end.
Pvm::StructSet Awaited;
Awaited.insert (Coords);
Awaited.insert (JobCompleted);
while (1)
{
Pvm::StructId Id = Awaited.ReceiveFrom (Parent);
if (Id == CompletedId)
// leave the infinite loop, if the job is completed
break;
// Id == CoordsId --> do the job for the given coordinates
TransmitResult Result;
Result.Row = Coords.Row;
DoJob (Matrices, Result.Row, Result.Result);
Result.Send (Parent);
}
}
syntax highlighted by Code2HTML, v. 0.9.1