[MPI3 Fortran] ASYNC attribute

Rolf Rabenseifner rabenseifner at hlrs.de
Wed May 6 09:42:18 CDT 2009


Craig,

Looks good.
I've a few questions:
- What is the difference between ASYNC_EXTERNAL and ASYNC?
- What are the rules of handing over
   1. an ASYNC_EXTERNAL real variable or ASYNC dummy argument
      handed over to a subroutine with a dummy argument
      defined ___with__ ASYNC
   2. same but
      defined _without_ ASYNC
   3. a __normal__ variable or normal dummy argument handed over
      to a subroutine with a dummy argument defined ___with__ ASYNC

   I would expect that all three cases should be allowed.

I would like to have the following detailed behavior:
  
- Copyin/out is prohibited in all 3 cases, i.e.,
   if MPI_Irecv declares buf as ASYNC then it should prohibit
   copyin/out when MPI_Irecv is called, and also if buf is
   declared outside as ASYNC_EXTERNAL then also coyin/out
   should be prohibited when buf is used as actual argument
   in a function or subroutine call.

- The scope of ASYNC or ASYNC_EXTERNAL is not inherited by
   called routines. The called routines must set ASYNC on dummy
   arguments.

- As long as ASYNC or ASYNC_EXTERNAL is valid within the scope
   of a block, all accesses to that variable must not be moved
   around any subroutine or function call.

- The fortran compiler is allowed to modify ASYNC or ASYNC_EXTERNAL
   variables or parts of them only if this is coded by the 
application.

- For accesses between two function or subroutine calls,
   the compiler can cache ASYNC or ASYNC_EXTERNAL variables in
   registers to optimize operations or repeated accesses.
   (This should be a significant difference to VOLATILE!!!)

Reason for my wishes:
- Each function or subroutine call can act as a synchronization point
   where the application is informed that some data is stored or used
   by asynchronously routing routines.

Implications:
- In your example, one needs
    SUBROUTINE UPDATE_INTERIOR(buf)
    TYPE(*), DIMENSION(..), ASYNC   :: buf
   This is needed to avoid, e.g., temporary aching, overwriting
   and restoring of parts of the data for loop fusion.

- In your example, buf cannot be transfered with copyin/out
   in the call to UPDATE_BOUNDARIES, because "ASYNC_EXTERNAL :: buf"
   is already defined in the calling block.

Open question:
- Do we want to have a method, to tell that a call acts as a
   synchronization for one or several buffers?
   And that other calls do not act as synchronization point.
   I.e., do we want a method to change the default:
     Default is, that any routine can act as synchronization point,
     i.e., any (register) caching must be done between such points.
     This means any BLAS or LAPACK routine is handled as a call
     to MPI_WAIT.
- I see two possibilities:
   A) To change this default by some special syntax
   B) Not to use this default at all.
      Proposal:
      Synchronizing routines must be declared as "SYNC_EXTERNAL"

      I.e.,
      SUBROUTINE MPI_Wait(request, status, err) SYNC_EXTERNAL, BIND(C, 
name="MPI_Wait")

      This means, that the portions of a variable, that are written
      asynchronously and the portions that are written localy
      of a ASYNC or ASYNC_EXTERNAL variable can be changed at
      any call where the variable is an actual argument
      or where the called routine has the SYNC_EXTERNAL flag.

      In the MPI API, we would give all WAIT, TEST and communication
      routines this SYNC_EXTERNAL flag.
      Reason:
       -- WAIT and TEST: obvious.
       -- communication routines can have invisible buffer arguments
          due to the use of absolut addresses in MPI derived
          datatypes and usage of MPI_BOTTOM

What do you think about this behavior?

Best regards
Rolf

On Tue, 5 May 2009 17:45:00 -0600
  Craig Rasmussen <crasmussen at newmexicoconsortium.org> wrote:
> I'm at the WG5 Fortran standards meeting and I think we've made 
> significant advances regarding the MPI-3 Fortran API.  We are 
> discussing adding a new variable attribute, ASYNC.  I'd like to get 
> feedback from the MPI-3 Fortran working group on these possible 
>changes.
> 
> ASYNC implies that a variable is potentially active in asynchronous 
> operations outside of Fortran.  The use of this new attribute should 
> give the compiler enough information to inhibit optimizations 
>similar  to inhibitions involved in Fortran asynchronous I/O, 
>specifically  copyin/copyout and code motion.  The compiler will 
>likely have to  inhibit code motion regarding any use of a variable 
>with the ASYNC  attribute and procedures other than intrinsics.  The 
>affect is similar  to the use of the volatile attribute (but not 
>regarding loads and  stores).
> 
> Usage is outlined below:
> 
> ----------------
> 
> real, ASYNC_EXTERNAL :: buf(100,100)
> type(MPI_Request) :: request
> 
> ! initiate data transfer of boundary
> CALL MPI_IRecv(buf(:,1),...,request,...)  ! no copyin/copyout will 
> happen
> 
> ! do work on interior of the buffer while transfer is in progress
> CALL UPDATE_INTERIOR(buf)  ! dummy arg should have ASYNC attribute
> 
> ! wait for the communication to finish
> CALL MPI_Wait(request,...)   ! no code motion allowed with respect 
>to  buf
> 
> ! finish work on buffer boundaries
> CALL UPDATE_BOUNDARIES(buf)  ! should copyin/copyout be allowed 
>here?
> 
> ----------------
> 
> So how does this look?  Anything we've left out?  I'm also including 
> the interface definition.
> 
> - craig
> 
> ----------------
> 
> interface
> 
> SUBROUTINE MPI_Irecv(buf, count, datatype, source, tag, comm, 
>request,  err) BIND(C, name="MPI_Irecv")
>    import MPI_Datatype, MPI_Comm, MPI_Request
>    TYPE(*), DIMENSION(..), ASYNC   :: buf
>    integer, value,     intent(in)  :: count
>    type(MPI_Datatype), intent(in)  :: datatype
>    integer, value,     intent(in)  :: source
>    integer, value,     intent(in)  :: tag
>    type(MPI_Comm),     intent(in)  :: comm
>    type(MPI_Request),  intent(out) :: request
>    integer,            intent(out) :: err
> END SUBROUTINE MPI_Irecv
> 
> SUBROUTINE MPI_Isend(buf, count, datatype, dest, tag, comm, request, 
> err) BIND(C, name="MPI_Isend")
>    import MPI_Datatype, MPI_Comm, MPI_Request
>    TYPE(*), DIMENSION(..), ASYNC   :: buf
>    integer, value,     intent(in)  :: count
>    type(MPI_Datatype), intent(in)  :: datatype
>    integer, value,     intent(in)  :: dest
>    integer, value,     intent(in)  :: tag
>    type(MPI_Comm),     intent(in)  :: comm
>    type(MPI_Request),  intent(out) :: request
>    integer,            intent(out) :: err
> END SUBROUTINE MPI_Isend
> 
> SUBROUTINE MPI_Wait(request, status, err) BIND(C, name="MPI_Wait")
>    import MPI_Request, MPI_Status
>    type(MPI_Request), intent(in)  :: request  !	inout?
>    type(MPI_Status),  intent(out) :: status
>    integer,           intent(out) :: err
> END SUBROUTINE MPI_Wait
> 
> end interface
> 
> 
> 
> 
> 
> _______________________________________________
> mpi3-fortran mailing list
> mpi3-fortran at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran

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)



More information about the mpiwg-fortran mailing list