Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

From: George Bosilca (bosilca_at_[hidden])
Date: 2005-08-25 11:41:14


First of all with your approach you're not sending all the structure.
You will just send the num_Rocs and the elements, missing the
num_Cols member off the structure. The problem come from the fact
that lena[0] is set to 1 not 2.

Another problem (which I don't think it can happens with this
particular structure) is that we don't know how the compiler will
create the structure in memory. For this particular structure, as you
just use ints I don't think that will be a problem as the alignment
will be correct and no padding should be inserted in order to have
all elements correctly aligned. Anyway, I'll give you a general
example who should work in all cases.

There is another bug in your code. When you create the
MPI_Type_struct you set the count to 1. This count is not the number
of data you plan to send, but the number of elements you describe in
the arrays used to create the type_struct.

   george.

PS: Here is a piece of code that do what you expect ... I think ...

struct {
     int num_Rows;
     int num_Cols;
     int element[NELEM];
} send_pack;

send_pack sp[2];
MPI_Datatype typa[3], temp_type, final_type;
MPI_Aint loca[3], origin, extent;
int lena[3];

/* Get the pointer to the sp structure */
MPI_Address( &(sp[0]), &origin );

/* Fill-up the arrays used to create the MPI_Struct */
type[0] = MPI_INT;
lena[0] = 1;
MPI_Address( &(sp[0].num_Rows), &(loca[0]) );

type[1] = MPI_INT;
lena[1] = 1;
MPI_Address( &(sp[0].num_Cols), &(loca[1]) );

type[2] = MPI_INT;
lena[2] = 1;
MPI_Address( &(sp[0].elements[0]), &(loca[2]) );

/* Now compute the correct displacement for the elements. Everything
depend on the origin */
loca[0] -= origin;
loca[1] -= origin;
loca[2] -= origin;

MPI_Type_struct( 3, lena, loca, typa, temp_type );

/* There is just one more thing left. Setting the correct bound for
one element of the structure
  * This can be achieved using different ways. The one I prefer is
not MPI 1 specific but MPI-2
  * but it's a lot more cleaner and user "friendly" (and I think it
make the code a lot more readable).
  * If you want to be MPI-1 specific, you should add one more element
to you array (with the type MPI_UB)
  * and the same displacement as in the following code.
  */
MPI_Address( &(sp[1]), &extent );
extent -= origin;
MPI_Type_create_resized( temp_type, (MPI_Aint)0, extent, &final_type );

/* A little bit of cleanup ... */
MPI_Type_free( &temp_type );

/* Here we are. The datatype is correctly set now we just have to
commit it in order to be allowed
  * to use it in MPI communications.
  */
MPI_Type_commit( &final_type );

if( my_rank == sender ) {
   MPI_Send( &(sp[0]), 1, final_type, receiver, tag, MPI_COMM_WORLD );
} else idd( my_rank == receiver ) {
   MPI_Recv( &sp[0]), 1, final_type, sender, tag, MPI_COMM_WORLD,
MPI_STATUS_IGNORE );
} else {
   /* blah blah */
}

On Aug 25, 2005, at 11:38 AM, Raul Mosquera wrote:

> Hi:
>
> I'm trying to pass an structure which is defined like this
>
> #include <stdio.h>
> #include <string.h>
> #include "mpi.h"
>
> #define NELEM 6
>
> struct{
> int num_Rows;
> int num_Cols;
> int element[NELEM];
>
> }send_pack;
>
> //num_Rows and num_Cols identify the matrix being passed in the
> array element.
>
> // Variable declaration
> int rank,size,tag=1,source=0,dest;
> MPI_Status status;
>
> int lena[2] ; // This is for the length of the elements holding
> MPI_Aint loca[2], extent; //localization
> MPI_Datatype typa[2];
> MPI_Datatype MY_TYPE;
> //MPI_Type_extent(MPI_INT,&extent);
>
> typa[0]=MPI_INT;
> typa[1]=MPI_INT;
> lena[0]=1;
> lena[1]=NELEM;
> loca[0]=0;
> loca[1]= 2 * extent;
>
>
> The structure is being created like this
>
> MPI_Type_struct(1,lena,loca,typa,&MY_TYPE);
> MPI_Type_commit(&MY_TYPE); //creates the structure
>
> When sending ...
>
> MPI_Send(&send_pack,1,MY_TYPE,1,tag,MPI_COMM_WORLD);
>
> When Receiving
>
> MPI_Recv(&send_pack,1,MY_TYPE,0,tag,MPI_COMM_WORLD,&status);
>
> The program sends the message but it shows errors on the other side.
>
> My guess is that the parameters in the MPI_Send are not declare in
> the proper way.
>
> Can you guys help me understandig what I'm doing wrong.
>
>
> Thanks
>
> __________________________________________________
> Do You Yahoo!?
> Tired of spam? Yahoo! Mail has the best spam protection around
> http://mail.yahoo.com
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users