[mpich2-dev] [PATCH 1/1] Issue 4120: Fix mpid_type_debug alignment problem.
Bob Cernohous
bobc at us.ibm.com
Wed Mar 19 10:55:33 CDT 2008
I was trying to dump out some datatypes with mpid_type_debug routines and
got garbage.
It looks like it can't just calculate pointer offsets like it was doing.
There's 8 byte padding
on the datatype structure and the arrays of types/ints/aints. That's not
something
I added or changed. I just fixed debug by calling
MPIDI_Datatype_get_contents_xxxx
which calculates the correct offsets (with alignment padding) using code
like:
int align_sz = 8, epsilon;
struct_sz = sizeof(MPID_Datatype_contents);
types_sz = cp->nr_types * sizeof(MPI_Datatype);
/* pad the struct, types, and ints before we allocate.
*
* note: it's not necessary that we pad the aints,
* because they are last in the region.
*/
if ((epsilon = struct_sz % align_sz)) {
struct_sz += align_sz - epsilon;
}
if ((epsilon = types_sz % align_sz)) {
types_sz += align_sz - epsilon;
}
ptr = ((char *) cp) + struct_sz + types_sz;
rather than simply doing:
> > - ints = (int *) (((char *) types) +
> > - cp->nr_types * sizeof(MPI_Datatype));
owner-mpich2-dev at mcs.anl.gov wrote on 03/19/2008 09:23:16 AM:
> Hi Bob,
>
> You're saying that we can't just point at the values because they
> aren't aligned, that they would need to be aligned if we were going to
> use them in this way?
>
> Thanks,
>
> Rob
>
> On Mar 19, 2008, at 9:11 AM, Bob Cernohous wrote:
>
> > Can't just point to ints/aints in the datatype. Have to figure out
> > the
> > alignment. Easiest way is to call MPIDI_Datatype_get_contents_xxxx().
> >
> > Signed-off-by: Bob Cernohous <bobc at us.ibm.com>
> > ---
> > .../src/mpid/common/datatype/mpid_type_debug.c | 46 +++++++++++
> > ++------
> > 1 files changed, 31 insertions(+), 15 deletions(-)
> >
> > diff --git a/lib/mpi/mpich2/src/mpid/common/datatype/
> > mpid_type_debug.c b/lib/mpi/mpich2/src/mpid/common/datatype/
> > mpid_type_debug.c
> > index 1e3c761..71fafb7 100644
> > --- a/lib/mpi/mpich2/src/mpid/common/datatype/mpid_type_debug.c
> > +++ b/lib/mpi/mpich2/src/mpid/common/datatype/mpid_type_debug.c
> > @@ -494,6 +494,12 @@ static char *MPIDI_Datatype_depth_spacing(int
> > depth)
> > default: return d5;
> > }
> > }
> > +
> > +#define __mpidi_datatype_free_and_return { \
> > + if (cp->nr_ints > 0) MPIU_Free(ints ); \
> > + if (cp->nr_aints > 0) MPIU_Free(aints); \
> > + if (cp->nr_types > 0) MPIU_Free(types); \
> > + return; }
> >
> > void MPIDI_Datatype_contents_printf(MPI_Datatype type,
> > int depth,
> > @@ -522,12 +528,22 @@ void
> > MPIDI_Datatype_contents_printf(MPI_Datatype type,
> > return;
> > }
> >
> > - types = (MPI_Datatype *) (((char *) cp) +
> > - sizeof(MPID_Datatype_contents));
> > - ints = (int *) (((char *) types) +
> > - cp->nr_types * sizeof(MPI_Datatype));
> > - aints = (MPI_Aint *) (((char *) ints) +
> > - cp->nr_ints * sizeof(int));
> > + if (cp->nr_ints > 0)
> > + {
> > + ints = (int*) MPIU_Malloc(cp->nr_ints * sizeof(int));
> > + MPIDI_Datatype_get_contents_ints(cp, ints);
> > + }
> > +
> > + if (cp->nr_aints > 0) {
> > + aints = (MPI_Aint*) MPIU_Malloc(cp->nr_aints *
> > sizeof(MPI_Aint));
> > + MPIDI_Datatype_get_contents_aints(cp, aints);
> > + }
> > +
> > + if (cp->nr_types > 0) {
> > + types = (MPI_Datatype*) MPIU_Malloc(cp->nr_types *
> > sizeof(MPI_Datatype));
> > + MPIDI_Datatype_get_contents_types(cp, types);
> > + }
> > +
> >
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %scombiner: %s",
> > MPIDI_Datatype_depth_spacing(depth),
> > @@ -536,10 +552,10 @@ void
> > MPIDI_Datatype_contents_printf(MPI_Datatype type,
> > switch (cp->combiner) {
> > case MPI_COMBINER_NAMED:
> > case MPI_COMBINER_DUP:
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_RESIZED:
> > /* not done */
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_CONTIGUOUS:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %scontig ct =
%d\n",
> > MPIDI_Datatype_depth_spacing(depth),
> > @@ -547,7 +563,7 @@ void MPIDI_Datatype_contents_printf(MPI_Datatype
> > type,
> > MPIDI_Datatype_contents_printf(*types,
> > depth + 1,
> > acount);
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_VECTOR:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,
> > "# %svector ct = %d, blk = %d, str = %d\n",
> > @@ -558,7 +574,7 @@ void MPIDI_Datatype_contents_printf(MPI_Datatype
> > type,
> > MPIDI_Datatype_contents_printf(*types,
> > depth + 1,
> > acount);
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_HVECTOR:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,
> > "# %shvector ct = %d, blk = %d, str = "
> > MPI_AINT_FMT_DEC_SPEC "\n",
> > @@ -569,7 +585,7 @@ void MPIDI_Datatype_contents_printf(MPI_Datatype
> > type,
> > MPIDI_Datatype_contents_printf(*types,
> > depth + 1,
> > acount);
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_INDEXED:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %sindexed ct =
%d:",
> > MPIDI_Datatype_depth_spacing(depth),
> > @@ -585,7 +601,7 @@ void MPIDI_Datatype_contents_printf(MPI_Datatype
> > type,
> > depth + 1,
> > acount);
> > }
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_HINDEXED:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %shindexed ct =
> > %d:",
> > MPIDI_Datatype_depth_spacing(depth),
> > @@ -601,7 +617,7 @@ void MPIDI_Datatype_contents_printf(MPI_Datatype
> > type,
> > depth + 1,
> > acount);
> > }
> > - return;
> > + __mpidi_datatype_free_and_return;
> > case MPI_COMBINER_STRUCT:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %sstruct ct =
%d:",
> > MPIDI_Datatype_depth_spacing(depth),
> > @@ -617,11 +633,11 @@ void
> > MPIDI_Datatype_contents_printf(MPI_Datatype type,
> > depth + 1,
> > acount);
> > }
> > - return;
> > + __mpidi_datatype_free_and_return;
> > default:
> > MPIU_DBG_OUT_FMT(DATATYPE,(MPIU_DBG_FDEST,"# %sunhandled
> > combiner",
> > MPIDI_Datatype_depth_spacing(depth)));
> > - return;
> > + __mpidi_datatype_free_and_return;
> > }
> > }
> > /* --END ERROR HANDLING-- */
> > --
> > 1.5.3.7
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.mcs.anl.gov/mailman/private/mpich2-dev/attachments/20080319/0ff4456d/attachment.htm>
More information about the mpich2-dev
mailing list