I want to send multiple columns of a matrix stored as in STL vector form
vector < vector < double > > A ( 10, vector <double> (10));
without copying the content to some buffer (because computation time is crucial here) with Boost MPI.
I found out, how this could be done with MPI. Here is the example Code how to send the 4th, 5th and 6th column of a 10 by 10 matrix from one process (rank==0) to another (rank==1). (Even though I do not know why I have to add the ‘2’ in the third argument of MPI_Typ_vector. Does anyone know why?).
int rank, size;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */
// fill matrices
vector< vector <float> >A(10, vector <float> (10));
vector< vector <float> >A_copy(10, vector <float> (10));
for (int i=0; i!=10; i++)
{
for (int j=0; j!=10; j++)
{
A[i][j]=j+ i*10;
A_copy[i][j]=0.0;
}
}
int dest=1;
int tag=1;
// define new type = two columns
MPI_Datatype newtype;
MPI_Type_vector(10, /* # column elements */
3, /* 3 column only */
10+2, /* skip 10 elements */
MPI_FLOAT, /* elements are float */
&newtype); /* MPI derived datatype */
MPI_Type_commit(&newtype);
if (rank==0)
{
MPI_Send(&A[0][4], 1, newtype, dest, tag, MPI_COMM_WORLD);
}
if (rank==1)
MPI_Status status;
MPI_Recv(&A_copy[0][4], 1, newtype, 0, tag, MPI_COMM_WORLD, &status);
}
MPI_Finalize();
On the Boost webpage, they claim that MPI_Type_vector is “used automatically in Boost.MPI” (http://www.boost.org/doc/libs/1_47_0/doc/html/mpi/tutorial.html#mpi.c_mapping).
But I can not find an example how to do this in detail. In only know how to send the whole matrix or each element after another with Boost.
Thank you in advance,
Tobias
I solved the problem by writing my own class ‘columns’ and serialize it. Here is an example code:
Explanation: The ‘columns’-class contains a pointer to the matrix and two numbers indicating where the columns start and end.
With the following code one tells boost-serialization how to serialize this ‘columns’-class:
Then one fill the matrix ‘input’
and initialize a columns-class object (which now contains a pointer to the matrix ‘input’):
and send it to another (sub)process by
In the end it is received by