Suppose we implement gather (see also Section Gather ) as a spanning tree implemented on top of point-to-point routines. Since the receive buffer is only valid on the root process, one will need to allocate some temporary space for receiving data on intermediate nodes. However, the datatype extent cannot be used as an estimate of the amount of space that needs to be allocated, if the user has modified the extent, for example by using MPI_TYPE_CREATE_RESIZED. The functions MPI_TYPE_GET_TRUE_EXTENT and MPI_TYPE_GET_TRUE_EXTENT_X are provided which return the true extent of the datatype.
MPI_TYPE_GET_TRUE_EXTENT(datatype, true_lb, true_extent) | |
IN datatype | datatype to get information on (handle) |
OUT true_lb | true lower bound of datatype (integer) |
OUT true_extent | true size of datatype (integer) |
int MPI_Type_get_true_extent(MPI_Datatype datatype, MPI_Aint *true_lb, MPI_Aint *true_extent)
MPI_Type_get_true_extent(datatype, true_lb, true_extent, ierror)
TYPE(MPI_Datatype), INTENT(IN) :: datatype
INTEGER(KIND=MPI_ADDRESS_KIND), INTENT(OUT) :: true_lb, true_extent
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_TYPE_GET_TRUE_EXTENT(DATATYPE, TRUE_LB, TRUE_EXTENT, IERROR)
INTEGER DATATYPE, IERROR
INTEGER(KIND=MPI_ADDRESS_KIND) TRUE_LB, TRUE_EXTENT
MPI_TYPE_GET_TRUE_EXTENT_X(datatype, true_lb, true_extent) | |
IN datatype | datatype to get information on (handle) |
OUT true_lb | true lower bound of datatype (integer) |
OUT true_extent | true size of datatype (integer) |
int MPI_Type_get_true_extent_x(MPI_Datatype datatype, MPI_Count *true_lb, MPI_Count *true_extent)
MPI_Type_get_true_extent_x(datatype, true_lb, true_extent, ierror)
TYPE(MPI_Datatype), INTENT(IN) :: datatype
INTEGER(KIND=MPI_COUNT_KIND), INTENT(OUT) :: true_lb, true_extent
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
MPI_TYPE_GET_TRUE_EXTENT_X(DATATYPE, TRUE_LB, TRUE_EXTENT, IERROR)
INTEGER DATATYPE, IERROR
INTEGER(KIND=MPI_COUNT_KIND) TRUE_LB, TRUE_EXTENT
true_lb returns the offset of the lowest unit of store which is addressed by the datatype, i.e., the lower bound of the corresponding typemap, ignoring explicit lower bound markers. true_extent returns the true size of the datatype, i.e., the extent of the corresponding typemap, ignoring explicit lower bound and upper bound markers, and performing no rounding for alignment. If the typemap associated with datatype is
Typemap = { (type0, disp0), ... , (typen-1, dispn-1)}
Then
true_lb(Typemap) = minj { dispj ~:~ typej ne mpiublblb_marker, mpiublbub_marker },
true_ub (Typemap) = maxj {dispj + sizeof(typej) ~:~ typej ne mpiublblb_marker, mpiublbub_marker} ,
and
true_extent (Typemap) = true_ub(Typemap) - true_lb(typemap).
(Readers should compare this with the definitions in Section Lower-Bound and Upper-Bound Markers and Section Extent and Bounds of Datatypes , which describe the function MPI_TYPE_GET_EXTENT.)
The true_extent is the minimum number of bytes of memory necessary to hold a datatype, uncompressed.
For both functions, if either OUT parameter cannot express the value to be returned (e.g., if the parameter is too small to hold the output value), it is set to MPI_UNDEFINED.