Exemplo n.º 1
0
void MPIDI_Datatype_contents_printf(MPI_Datatype type,
				    int depth,
				    int acount)
{
    int i;
    MPIDU_Datatype *dtp;
    MPIDU_Datatype_contents *cp;

    MPI_Aint *aints = NULL;
    MPI_Datatype *types = NULL;
    int *ints = NULL;

    if (HANDLE_GET_KIND(type) == HANDLE_KIND_BUILTIN) {
	MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %stype: %s\n",
			MPIDI_Datatype_depth_spacing(depth),
			MPIDU_Datatype_builtin_to_string(type)));
	return;
    }

    MPIDU_Datatype_get_ptr(type, dtp);
    cp = dtp->contents;

    if (cp == NULL) {
	MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# <NULL>\n"));
	return;
    }

    if (cp->nr_ints > 0)
    {
      ints = (int *) MPL_malloc(cp->nr_ints * sizeof(int));
      MPIDI_Datatype_get_contents_ints(cp, ints);
    }

    if (cp->nr_aints > 0) {
      aints = (MPI_Aint *) MPL_malloc(cp->nr_aints * sizeof(MPI_Aint));
      MPIDI_Datatype_get_contents_aints(cp, aints);
    }

    if (cp->nr_types > 0) {
      types = (MPI_Datatype *) MPL_malloc(cp->nr_types * sizeof(MPI_Datatype));
      MPIDI_Datatype_get_contents_types(cp, types);
    }


    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %scombiner: %s",
		    MPIDI_Datatype_depth_spacing(depth),
		    MPIDU_Datatype_combiner_to_string(cp->combiner)));

    switch (cp->combiner) {
	case MPI_COMBINER_NAMED:
	case MPI_COMBINER_DUP:
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_RESIZED:
	    /* not done */
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_CONTIGUOUS:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %scontig ct = %d\n",
			    MPIDI_Datatype_depth_spacing(depth),
				       *ints));
	    MPIDI_Datatype_contents_printf(*types,
					   depth + 1,
					   acount);
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_VECTOR:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
	                "# %svector ct = %d, blk = %d, str = %d\n",
			MPIDI_Datatype_depth_spacing(depth),
			    ints[0],
			    ints[1],
			    ints[2]));
	    MPIDI_Datatype_contents_printf(*types,
					   depth + 1,
					   acount);
	    __mpidi_datatype_free_and_return;
        case MPI_COMBINER_HVECTOR:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
	                  "# %shvector ct = %d, blk = %d, str = " MPI_AINT_FMT_DEC_SPEC "\n",
			    MPIDI_Datatype_depth_spacing(depth),
			    ints[0],
			    ints[1],
			    (MPI_Aint) aints[0]));
	    MPIDI_Datatype_contents_printf(*types,
					   depth + 1,
					   acount);
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_INDEXED:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sindexed ct = %d:",
			    MPIDI_Datatype_depth_spacing(depth),
			    ints[0]));
	    for (i=0; i < acount && i < ints[0]; i++) {
		MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
		         "# %s  indexed [%d]: blk = %d, disp = %d\n",
				MPIDI_Datatype_depth_spacing(depth),
				i,
				ints[i+1],
				ints[i+(cp->nr_ints/2)+1]));
		MPIDI_Datatype_contents_printf(*types,
					       depth + 1,
					       acount);
	    }
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_HINDEXED:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %shindexed ct = %d:",
			    MPIDI_Datatype_depth_spacing(depth),
			    ints[0]));
	    for (i=0; i < acount && i < ints[0]; i++) {
		MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
		            "# %s  hindexed [%d]: blk = %d, disp = " MPI_AINT_FMT_DEC_SPEC "\n",
				MPIDI_Datatype_depth_spacing(depth),
				i,
				(int) ints[i+1],
				(MPI_Aint) aints[i]));
		MPIDI_Datatype_contents_printf(*types,
					       depth + 1,
					       acount);
	    }
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_STRUCT:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sstruct ct = %d:",
			    MPIDI_Datatype_depth_spacing(depth),
			    (int) ints[0]));
	    for (i=0; i < acount && i < ints[0]; i++) {
		MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
		           "# %s  struct[%d]: blk = %d, disp = " MPI_AINT_FMT_DEC_SPEC "\n",
				MPIDI_Datatype_depth_spacing(depth),
				i,
				(int) ints[i+1],
				(MPI_Aint) aints[i]));
		MPIDI_Datatype_contents_printf(types[i],
					       depth + 1,
					       acount);
	    }
	    __mpidi_datatype_free_and_return;
	case MPI_COMBINER_SUBARRAY:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE, (MPL_DBG_FDEST,"# %ssubarray ct = %d:",
			MPIDI_Datatype_depth_spacing(depth),
			(int) ints[0]));
	    for (i=0; i< acount && i < ints[0]; i++) {
		MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,
			    "# %s  sizes[%d] = %d subsizes[%d] = %d starts[%d] = %d\n",
			    MPIDI_Datatype_depth_spacing(depth),
			    i, (int)ints[i+1],
			    i, (int)ints[i+ ints[0]+1],
			    i, (int)ints[2*ints[0]+1]));
	    }
	    MPIDI_Datatype_contents_printf(*types,
		    depth + 1,
		    acount);
	    __mpidi_datatype_free_and_return;

	default:
	    MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sunhandled combiner",
			MPIDI_Datatype_depth_spacing(depth)));
	    __mpidi_datatype_free_and_return;
    }
}
Exemplo n.º 2
0
/*@
  MPID_Type_get_contents - get content information from datatype

Input Parameters:
+ datatype - MPI datatype
. max_integers - size of array_of_integers
. max_addresses - size of array_of_addresses
- max_datatypes - size of array_of_datatypes

Output Parameters:
+ array_of_integers - integers used in creating type
. array_of_addresses - MPI_Aints used in creating type
- array_of_datatypes - MPI_Datatypes used in creating type

@*/
int MPID_Type_get_contents(MPI_Datatype datatype, 
			   int max_integers, 
			   int max_addresses, 
			   int max_datatypes, 
			   int array_of_integers[], 
			   MPI_Aint array_of_addresses[], 
			   MPI_Datatype array_of_datatypes[])
{
    int i, mpi_errno;
    MPID_Datatype *dtp;
    MPID_Datatype_contents *cp;

    /* --BEGIN ERROR HANDLING-- */
    /* these are checked at the MPI layer, so I feel that asserts
     * are appropriate.
     */
    MPIU_Assert(HANDLE_GET_KIND(datatype) != HANDLE_KIND_BUILTIN);
    MPIU_Assert(datatype != MPI_FLOAT_INT &&
		datatype != MPI_DOUBLE_INT &&
		datatype != MPI_LONG_INT &&
		datatype != MPI_SHORT_INT &&
		datatype != MPI_LONG_DOUBLE_INT);
    /* --END ERROR HANDLING-- */

    MPID_Datatype_get_ptr(datatype, dtp);
    cp = dtp->contents;
    MPIU_Assert(cp != NULL);

    /* --BEGIN ERROR HANDLING-- */
    if (max_integers < cp->nr_ints ||
	max_addresses < cp->nr_aints ||
	max_datatypes < cp->nr_types)
    {
	mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
					 "MPID_Type_get_contents", __LINE__,
					 MPI_ERR_OTHER, "**dtype", 0);
	return mpi_errno;
    }
    /* --END ERROR HANDLING-- */

    if (cp->nr_ints > 0)
    {
	MPIDI_Datatype_get_contents_ints(cp, array_of_integers);
    }

    if (cp->nr_aints > 0) {
	MPIDI_Datatype_get_contents_aints(cp, array_of_addresses);
    }

    if (cp->nr_types > 0) {
	MPIDI_Datatype_get_contents_types(cp, array_of_datatypes);
    }

    for (i=0; i < cp->nr_types; i++)
    {
    	if (HANDLE_GET_KIND(array_of_datatypes[i]) != HANDLE_KIND_BUILTIN)
	{
	    MPID_Datatype_get_ptr(array_of_datatypes[i], dtp);
	    MPID_Datatype_add_ref(dtp);
	}
    }

    return MPI_SUCCESS;
}