Open MPI logo

Open MPI User's Mailing List Archives

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

Subject: Re: [OMPI users] data types and alignment to word boundary
From: Gus Correa (gus_at_[hidden])
Date: 2011-06-29 12:18:24


jody wrote:
> Hi
>
> I have noticed on my machine that a struct which i have defined as
>
> typedef struct {
> short iSpeciesID;
> char sCapacityFile[SHORT_INPUT];
> double adGParams[NUM_GPARAMS];
> } tVStruct;
>
> (where SHORT_INPUT=64 and NUM_GPARAMS=4)
>
> has size 104 (instead of 98) whereas the corresponding MPI Datatype i created
>
> int aiLengthsT5[3] = {1, SHORT_INPUT, NUM_GPARAMS};
> MPI_Aint aiDispsT5[3] = {0, iShortSize, iShortSize+SHORT_INPUT};
> MPI_Datatype aTypesT5[3] = {MPI_UNSIGNED_SHORT, MPI_CHAR, MPI_DOUBLE};
> MPI_Type_create_struct(3, aiLengthsT5, aiDispsT5, aTypesT5,
> &m_dtVegetationData3);
> MPI_Type_commit(&m_dtVegetationData3);
>
> only has length 98 (as expected). The size differences resulted in an
> error when doing
>
> tVegetationData3 VD;
> MPI_Send(&VD, 1, m_dtVegetationData3, 1, TAG_STEP_CMD, MPI_COMM_WORLD);
>
> and the corresponding
>
> tVegetationData3 VD;
> MPI_Recv(&VD, 1, m_dtVegetationData3, MPI_ANY_SOURCE,
> TAG_STEP_CMD, MPI_COMM_WORLD, &st);
>
> (in fact, the last double in my array was not transmitted correctly)
>
> It seems that on my machine the struct was padded to a multiple of 8.
> By manually adding some padding bytes to my MPI Datatype in order
> to fill it up to the next multiple of 8 i could work around this problem.
> (not very nice, and very probably not portable)
>
>
> My question: is there a way to tell MPI to automatically use the
> required padding?
>
>
> Thank You
> Jody
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users

Hi Jody

My naive guesses:

I think when you create the MPI structure you can pass the
byte displacement of each structure component.
You would need to modify your aiDispsT5[3], to match the
actual memory alignment, I guess.
Yes, indeed portability may be sacrificed.

There is some clarification in "MPI, The Complete Reference, Vol 1,
2nd Ed, Marc Snir et al.".
Section 3.2 and 3.3 (general on type map & type signature).
Section 3.4.8 MPI_Type_create_struct (examples, specially 3.13).
Section 3.10, on portability, doesn't seem to guarantee portability of
MPI_Type_Struct.

I hope this helps,
Gus Correa