[mpich2-dev] [PATCH 1/1] Issue 4120: Fix mpid_type_debug alignment problem.

Rob Ross rross at mcs.anl.gov
Wed Mar 19 09:23:16 CDT 2008


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
>




More information about the mpich2-dev mailing list