#include "MPQueue.h" using namespace std; enum { NONE, DATA, MULTIPLY, RESULT }; typedef vector < int > Trow; vector < Trow > matrix, square; typedef struct { int pos; // row index Trow result; // output row } Tdata; template < class Archive > void // needed to serialize Tdata serialize (Archive & ar, Tdata & data, const unsigned int version) { ar & data.pos; ar & data.result; } void MPQswitch (Tjob & job) { Tdata data; switch (job.type) { case DATA: // receive the input matrix from_string (matrix, job.data); break; case MULTIPLY: from_string (data.pos, job.data); // get the row position data.result = Trow (matrix.size (), 0); for (int j = 0; j < matrix.size (); j++) // calutate one row for (int k = 0; k < matrix.size (); k++) data.result[j] += matrix[data.pos][k] * matrix[k][j]; job = Tjob(RESULT, data); // prepare the result MPQtask (job); // send result to boss break; case RESULT: // receive one output row from_string (data, job.data); square[data.pos] = data.result; job.data = ""; // nothing to return } } int main (int argc, char *argv[]) { MPQinit (argc, argv); MPQstart (); Trow row (10, 1); // input matrix containing vector < Trow > mat (row.size (), row); // 1 at every entry square.resize (row.size ()); // container for the output MPQsharedata (Tjob(DATA, mat)); // input matrix sent to workers Tjobqueue inqueue, outqueue; for (int i = 0; i < mat.size (); i++) // every row is a separate job inqueue.push (Tjob(MULTIPLY, i)); MPQrunjobs (inqueue, outqueue); // run the jobs for (int i = 0; i < row.size (); i++) { // print the output matrix for (int j = 0; j < row.size (); j++) cout << square[i][j] << " "; cout << "\n"; } MPQstop (); }