The Fortran interface specification of each MPI routine specifies the routine name that must be called by the application program, and the names and types of the dummy arguments together with additional attributes. The Fortran standard allows a given Fortran interface to be implemented with several methods, e.g., within or outside of a module, with or without BIND(C), or the buffers with or without TS 29113. Such implementation decisions imply different binary interfaces and different specific procedure names. The requirements for several implementation schemes together with the rules for the specific procedure names and its implications for the profiling interface are specified within this section, but not the implementation details.
Rationale.
This section was introduced in MPI-3.0 on Sep. 21, 2012. The major goals for implementing the three Fortran support methods have been:
Therefore, this section was rewritten as an erratum to MPI-3.0.
( End of rationale.)
A Fortran call to an MPI routine shall result in a call to a procedure
with one of the specific procedure names and calling conventions, as described in
Table 20
.
Case is not significant in the names.
No. | Specific pro- | Calling convention |
cedure name | ||
1A | MPI_Isend_f08 | Fortran interface and arguments, as in Annex Fortran 2008 Bindings with the mpi_f08 Module , except that in routines with a choice buffer dummy argument, this dummy argument is implemented with non-standard extensions like !$PRAGMA IGNORE_TKR, which provides a call-by-reference argument without type, kind, and dimension checking. |
1B | MPI_Isend_f08ts | Fortran interface and arguments, as in Annex Fortran 2008 Bindings with the mpi_f08 Module , but only for routines with one or more choice buffer dummy arguments; these dummy arguments are implemented with TYPE(*), DIMENSION(..). |
2A | MPI_ISEND | Fortran interface and arguments, as in Annex Fortran Bindings with mpif.h or the mpi Module , except that in routines with a choice buffer dummy argument, this dummy argument is implemented with non-standard extensions like !$PRAGMA IGNORE_TKR, which provides a call-by-reference argument without type, kind, and dimension checking. |
2B | MPI_ISEND_FTS | Fortran interface and arguments, as in Annex Fortran Bindings with mpif.h or the mpi Module , but only for routines with one or more choice buffer dummy arguments; these dummy arguments are implemented with TYPE(*), DIMENSION(..). |
Specific Fortran procedure names and related calling conventions. MPI_ISEND is used as an example. For routines without choice buffers, only 1A and 2A apply. Note that for the deprecated routines in Section Deprecated since MPI-2.0 , which are reported only in Annex Fortran Bindings with mpif.h or the mpi Module , scheme 2A is utilized in the mpi module and mpif.h, and also in the mpi_f08 module.
To set MPI_SUBARRAYS_SUPPORTED to .TRUE. within a Fortran support method, it is required that all non-blocking and split-collective routines with buffer arguments are implemented according to 1B and 2B, i.e., with MPI_Xxxx_f08ts in the mpi_f08 module, and with MPI_XXXX_FTS in the mpi module and the mpif.h include file.
The mpi and mpi_f08 modules and the mpif.h
include file
will each correspond to exactly one implementation scheme from
Table 20
.
However, the MPI library may contain multiple implementation schemes from
Table 20
.
Advice
to implementors.
This may be desirable for backwards binary compatibility
in the scope of a single MPI implementation, for example.
( End of advice to implementors.)
Rationale.
After a compiler provides the facilities from TS 29113, i.e.,
TYPE(*), DIMENSION(..),
it is possible to change the bindings within a Fortran support method
to support subarrays
without recompiling the complete application
provided that the previous interfaces
with their specific procedure names are still included in the library.
Of course, only recompiled routines can benefit from the
added facilities.
There is no binary compatibility conflict
because each interface uses its own
specific procedure names and
all interfaces use the same constants
(except the value of MPI_SUBARRAYS_SUPPORTED and MPI_ASYNC_PROTECTS_NONBLOCKING)
and type definitions.
After a compiler also ensures that buffer arguments of nonblocking MPI operations
can be protected through the ASYNCHRONOUS attribute,
and the procedure declarations in the mpi_f08 and mpi module
and the mpif.h include file declare choice buffers
with the ASYNCHRONOUS attribute, then
the value of MPI_ASYNC_PROTECTS_NONBLOCKING can be switched to .TRUE.
in the module definition and include file.
( End of rationale.)
Advice to users.
Partial recompilation of user applications when upgrading MPI implementations
is a highly complex and subtle topic.
Users are strongly advised to consult their MPI implementation's documentation
to see exactly what is --- and what is not --- supported.
( End of advice to users.)
Within the mpi_f08 and mpi modules and mpif.h,
for all MPI procedures, a second
procedure with the same calling conventions shall be
supplied, except that the name is modified by prefixing with the
letter ``P'', e.g., PMPI_Isend.
The specific procedure names
for these PMPI_ Xxxx procedures must be different from the
specific procedure names for the MPI_Xxxx procedures
and are not specified by this standard.
A user-written or middleware profiling routine should provide the same specific Fortran procedure names and calling conventions, and therefore can interpose itself as the MPI library routine. The profiling routine can internally call the matching PMPI routine with any of its existing bindings, except for routines that have callback routine dummy arguments, choice buffer arguments, or that are attribute caching routines ( MPI_ {COMM|WIN|TYPE }_ {SET|GET }_ATTR). In this case, the profiling software should invoke the corresponding PMPI routine using the same Fortran support method as used in the calling application program, because the C, mpi_f08 and mpi callback prototypes are different or the meaning of the choice buffer or attribute_val arguments are different.
Advice to users.
Although for each support method and MPI routine
(e.g., MPI_ISEND in mpi_f08),
multiple routines may need to be provided to intercept the
specific procedures in the MPI library
(e.g., MPI_Isend_f08 and MPI_Isend_f08ts),
each profiling routine itself uses only one support method
(e.g., mpi_f08)
and calls the real MPI routine through the one
PMPI routine defined in this support method
(i.e., PMPI_Isend in this example).
( End of advice to users.)
Advice
to implementors.
If all of the following conditions are fulfilled:
In the Fortran support method mpif.h,
compile-time argument checking
can be also implemented for all routines.
For mpif.h, the argument names are not specified through the MPI standard,
i.e., only positional argument lists are defined, and not key-word based lists.
Due to the rule that mpif.h
must be valid for fixed and free source form,
the subroutine declaration is restricted to one line with 72 characters.
To keep the argument lists short, each argument name can be shortened
to a minimum of one character. With this, the two longest subroutine
declaration statements are
SUBROUTINE PMPI_Dist_graph_create_adjacent(a,b,c,d,e,f,g,h,i,j,k) SUBROUTINE PMPI_Rget_accumulate(a,b,c,d,e,f,g,h,i,j,k,l,m,n)with 71 and 66 characters. With buffers implemented with TS 29113, the specific procedure names have an additional postfix. The longest of such interface definitions is
INTERFACE PMPI_Rget_accumulate SUBROUTINE PMPI_Rget_accumulate_fts(a,b,c,d,e,f,g,h,i,j,k,l,m,n)with 70 characters. In principle, continuation lines would be possible in mpif.h (spaces in columns 73--131, & in column 132, and in column 6 of the continuation line) but this would not be valid if the source line length is extended with a compiler flag to 132 characters. Column 133 is also not available for the continuation character because lines longer than 132 characters are invalid with some compilers by default.
The longest specific procedure names are PMPI_Dist_graph_create_adjacent_f08 and PMPI_File_write_ordered_begin_f08ts both with 35 characters in the mpi_f08 module.
For example, the interface specifications together with the specific procedure names
can be implemented with
MODULE mpi_f08 TYPE, BIND(C) :: MPI_Comm INTEGER :: MPI_VAL END TYPE MPI_Comm ... INTERFACE MPI_Comm_rank ! (as defined in Chapter 6) SUBROUTINE MPI_Comm_rank_f08(comm, rank, ierror) IMPORT :: MPI_Comm TYPE(MPI_Comm), INTENT(IN) :: comm INTEGER, INTENT(OUT) :: rank INTEGER, OPTIONAL, INTENT(OUT) :: ierror END SUBROUTINE END INTERFACE END MODULE mpi_f08 MODULE mpi INTERFACE MPI_Comm_rank ! (as defined in Chapter 6) SUBROUTINE MPI_Comm_rank(comm, rank, ierror) INTEGER, INTENT(IN) :: comm ! The INTENT may be added although INTEGER, INTENT(OUT) :: rank ! it is not defined in the INTEGER, INTENT(OUT) :: ierror ! official routine definition. END SUBROUTINE END INTERFACE END MODULE mpiAnd if interfaces are provided in mpif.h, they might look like this (outside of any module and in fixed source format):
!23456789012345678901234567890123456789012345678901234567890123456789012 INTERFACE MPI_Comm_rank ! (as defined in Chapter 6) SUBROUTINE MPI_Comm_rank(comm, rank, ierror) INTEGER, INTENT(IN) :: comm ! The argument names may be INTEGER, INTENT(OUT) :: rank ! shortened so that the INTEGER, INTENT(OUT) :: ierror ! subroutine line fits to the END SUBROUTINE ! maximum of 72 characters. END INTERFACE( End of advice to implementors.)
The following is an example of how
a user-written or middleware profiling routine
can be implemented:
SUBROUTINE MPI_Isend_f08ts(buf,count,datatype,dest,tag,comm,request,ierror) USE :: mpi_f08, my_noname => MPI_Isend_f08ts TYPE(*), DIMENSION(..), ASYNCHRONOUS :: buf INTEGER, INTENT(IN) :: count, dest, tag TYPE(MPI_Datatype), INTENT(IN) :: datatype TYPE(MPI_Comm), INTENT(IN) :: comm TYPE(MPI_Request), INTENT(OUT) :: request INTEGER, OPTIONAL, INTENT(OUT) :: ierror ! ... some code for the begin of profiling call PMPI_Isend (buf, count, datatype, dest, tag, comm, request, ierror) ! ... some code for the end of profiling END SUBROUTINE MPI_Isend_f08tsNote that this routine is used to intercept the existing specific procedure name MPI_Isend_f08ts in the MPI library. This routine must not be part of a module. This routine itself calls PMPI_Isend. The USE of the mpi_f08 module is needed for definitions of handle types and the interface for PMPI_Isend. However, this module also contains an interface definition for the specific procedure name MPI_Isend_f08ts that conflicts with the definition of this profiling routine (i.e., the name is doubly defined). Therefore, the USE here specifically excludes the interface from the module by renaming the unused routine name in the mpi_f08 module into `` my_noname'' in the scope of this routine. ( End of advice to users.)
The PMPI interface allows intercepting MPI routines.
For example, an additional MPI_ISEND profiling wrapper
can be provided that is called by the
application and internally calls PMPI_ISEND.
There are two typical use cases: a profiling layer that is developed
independently from the application and the MPI library,
and profiling routines that are part of the application
and have access to the application data.
With MPI-3.0, new Fortran interfaces and implementation schemes
were introduced that have several implications on how Fortran
MPI routines are internally implemented and optimized.
For profiling layers, these schemes imply that several
internal interfaces with different specific procedure names
may need to be intercepted,
as shown in the example code above.
Therefore, for wrapper routines that
are part of a Fortran application,
it may be more convenient to make the name shift within
the application, i.e., to substitute the call to the
MPI routine (e.g., MPI_ISEND) by a call to a user-written
profiling wrapper with a new name (e.g., X_MPI_ISEND)
and to call the Fortran MPI_ISEND from this wrapper,
instead of using the PMPI interface.
( End of advice to users.)
Advice
to implementors.
An implementation that provides a Fortran interface must provide a
combination of MPI library and module or include file that uses
the specific procedure names as described in
Table 20
so that the MPI
Fortran routines are interceptable as described above.
( End of advice to implementors.)