[MPI3 Fortran] Serious problem/bug in MPI libraries with the alignment of MPI_DOUBLE_PRECISION
Jeff Squyres
jsquyres at cisco.com
Fri Oct 7 09:48:17 CDT 2011
I guess this looks ok -- there's some grammar changes I'd make, though.
One thing to be careful of:
> * Advice to users.
> * Structures combining different basic datatypes should be defined so that there will
> * be no gaps based on alignment rules, and if used as an array of structures, then
> * also without such an alignment-gap at the end of the structure.
> * In MPI communication, the content of such gaps would not be communicated.
^^^ This is not necessarily true. A smart enough MPI implementation may realize that it's faster to treat a small gap as a contiguous datatype and just ignore the extra data, especially if it's in a homogeneous environment, and copy-in/copy-out is used anyway.
On Oct 6, 2011, at 7:55 PM, Rolf Rabenseifner wrote:
> Dear all,
>
> here is my proposal to solve the alignment problems.
> Please check carefully.
>
> It is touching only the Fortran side.
> C problems with alignments are not really touched, but should be small.
>
> ----------------------------------------------------------------------
>
> (Lines with * are new, lines with : are modified, lines with x are removed)
>
> mpi-report-F2008-2011-09-08-changeonlyplustickets.pdf
> p86:45-47 (=MPI-2.2 p78:45-47) read
>
> If type_i requires alignment to a byte address that is a multiple of k_i, then epsilon
> is the least non-negative increment needed to round extent(Typemap) to the next multiple
> of max_i k_i.
> The complete definition of extent is given on page 107.
>
> but should read
>
> If type_i requires alignment to a byte address that is a multiple of k_i, then epsilon
> is the least non-negative increment needed to round extent(Typemap) to the next multiple
> of max_i k_i.
> * In Fortran, whether the alignments k_i are computed according to the alignments
> * used by the compiler in common blocks, SEQUENCE derived types, or BIND(C) derived types,
> * is implementation-dependent.
> : The complete definition of extent is given in Section 4.1.6 on page 106.
>
> ________
>
> mpi-report-F2008-2011-09-08-changeonlyplustickets.pdf
> p87:7-11 (=MPI-2.2 p79:7-11) read
>
> Rationale. The definition of extent is motivated by the assumption that the amount
> of padding added at the end of each structure in an array of structures is the least
> needed to fulfill alignment constraints. More explicit control of the extent is provided
> in Section 4.1.6. Such explicit control is needed in cases where the assumption does
> not hold, for example, where union types are used.
> (End of rationale.)
>
> but should read
>
> Rationale. The definition of extent is motivated by the assumption that the amount
> of padding added at the end of each structure in an array of structures is the least
> needed to fulfill alignment constraints. More explicit control of the extent is provided
> in Section 4.1.6. Such explicit control is needed in cases where the assumption does
> not hold, for example, where union types are used.
> * In Fortran, structures can be expressed with several language features, e.g.,
> * common blocks, SEQUENCE derived types, or BIND(C) derived types. The compiler may
> * use different alignments, and therefore, it is recommended to use MPI_TYPE_CREATE_RESIZED
> * for arrays of structures if an alignment may cause an alignment-gap at the end of
> * a structure as described in Section 4.1.6 on page 106 and in Section 16.2.15 on page 580.
> (End of rationale.)
>
>
> ________
>
> mpi-report-F2008-2011-09-08-changeonlyplustickets.pdf
> p107:13-17 (=MPI-2.2 p96:42-45) read
>
> If type_i requires alignment to a byte address that is a multiple of k_i, then epsilon
> is the least non-negative increment needed to round extent(Typemap) to the next multiple
> of max_i k_i.
> The formal definitions given for the various datatype constructors apply now,
> with the amended definition of extent.
>
> but should read
>
> If type_i requires alignment to a byte address that is a multiple of k_i, then epsilon
> is the least non-negative increment needed to round extent(Typemap) to the next multiple
> of max_i k_i.
> * In Fortran, whether the alignments k_i are computed according to the alignments
> * used by the compiler in common blocks, SEQUENCE derived types, or BIND(C) derived types,
> * is implementation-dependent.
> The formal definitions given for the various datatype constructors apply now,
> with the amended definition of extent.
>
> * Rationale.
> * Before Fortran 2003, MPI_TYPE_CREATE_STRUCT could be applied to Fortran common blocks and
> * SEQUENCE derived types. With Fortran 2003, this list was extended by BIND(C) derived types
> * and MPI implementors have implemented the alignments k_i different, i.e., some based on
> * the alignments used in SEQUENCE derived types, and others according to BIND(C) derived types.
> * End of rationale.
>
> * Advice to implementors.
> * In Fortran, it is generally recommended to use BIND(C) derived types instead of
> * common blocks or SEQUENCE derived types. Therefore it is recommended to calculate the
> * alignments k_i based on BIND(C) derived types.
> * End of advoice to implementors.
>
> * Advice to users.
> * Structures combining different basic datatypes should be defined so that there will
> * be no gaps based on alignment rules, and if used as an array of structures, then
> * also without such an alignment-gap at the end of the structure.
> * In MPI communication, the content of such gaps would not be communicated.
> * If alignment-gaps may occur, e.g., between an odd number of floats ore REAL before
> * a double or DOUBLE PRECISION data, then such gaps should be added explicitely in
> * the structure and also to the MPI derived datatype handle, because the communication
> * of a contiguous derived datatype may be significantly faster than the communication
> * of one that is non-contiguous due such alignment-gaps.
> *
> * Example:
> * Instead of
> *
> * TYPE, BIND(C) :: my_data
> * REAL, DIMENSION(3) :: x
> * ! there may be a gap of the size of one REAL
> * ! if the alignment of a DOUBLE PRECISION is
> * ! two times the size of a REAL
> * DOUBLE PRECISION: p
> * END TYPE
> *
> * one should define
> *
> * TYPE, BIND(C) :: my_data
> * REAL, DIMENSION(3) :: x
> * REAL :: gap1
> * DOUBLE PRECISION: p
> * END TYPE
> *
> * and also including gap1 in the matching MPI derived datatype.
> __________
>
> mpi-report-F2008-2011-09-08-changeonlyplustickets.pdf
> p580:12,21,26,30,34,36:
>
> Add a forth structure entry: logical l after the double precision d
> ________
>
> mpi-report-F2008-2011-09-08-changeonlyplustickets.pdf
> p581:11-29 read
>
> x TODO: The following text about the extent of derived types should be
> x strongly checked by specialist on derived types!!! The correct variant should
> x be chosen.
> To use a derived type in an array requires a correct extent of the datatype handle to
> take care of the alignment rules applied by the compiler. These alignment rules may imply
> that there are gaps between the elements of a derived type, and also between the array
> elements.
> x The alignment rules in Section 4.1 on page 85 and Section 4.1.6 on page 106
> x apply only to
> x VARIANT 1: SEQUENCE
> x VARIANT 2: BIND(C)
> x derived types.
> The extent of an iteroperable derived type (i.e., defined with BIND(C)) and
> a SEQUENCE derived type with the same content may be different because C and Fortran
> may apply different alignment rules.
> x VARIANT 1:
> x Using the SEQUENCE attribute instead of BIND(C) in the declararion on mytype, one can
> x directly use newtype to send the fooarr array.
> x VARIANT 2:
> x In the example, one can directly use newtype to send the fooarr array. The resized
> x newarrtype datatype is only needed, if mytype is a SEQUENCE derived type.
>
> but should read
>
> To use a derived type in an array requires a correct extent of the datatype handle to
> take care of the alignment rules applied by the compiler. These alignment rules may imply
> that there are gaps between the elements of a derived type, and also between the array
> elements.
> The extent of an iteroperable derived type (i.e., defined with BIND(C)) and
> a SEQUENCE derived type with the same content may be different because C and Fortran
> may apply different alignment rules.
> As mentioned in Section 4.1 on page 86 and Section 4.1.6 on page 106,
> one should resize the datatype before using it for an array of structures fooarr,
> if elements may have different alignments that may cause an alignment-gap
> at the end of the structure.
> _________________________
>
> Best regards
> Rolf
>
>
> --
> Dr. Rolf Rabenseifner . . . . . . . . . .. email rabenseifner at hlrs.de
> High Performance Computing Center (HLRS) . phone ++49(0)711/685-65530
> University of Stuttgart . . . . . . . . .. fax ++49(0)711 / 685-65832
> Head of Dpmt Parallel Computing . . . www.hlrs.de/people/rabenseifner
> Nobelstr. 19, D-70550 Stuttgart, Germany . (Office: Allmandring 30)
> _______________________________________________
> mpi3-fortran mailing list
> mpi3-fortran at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran
--
Jeff Squyres
jsquyres at cisco.com
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/
More information about the mpiwg-fortran
mailing list