[MPI3 Fortran] ASYNC attribute / SYNC_POINT

Craig Rasmussen crasmussen at newmexicoconsortium.org
Wed May 6 19:03:54 CDT 2009


I think the only thing we can't do is turn the ASYNC attribute on a  
variable OFF.  It will last throughout the entire scope where the  
attribute is given.

I'm attaching the actual paper that the HPC committee has submitted  
for the entire committee to look at.

-craig

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 09-231.txt
URL: <http://lists.mpi-forum.org/pipermail/mpiwg-fortran/attachments/20090506/7c02822b/attachment-0001.txt>
-------------- next part --------------




On May 6, 2009, at 9:28 AM, Rolf Rabenseifner wrote:

> I try to write my ASYNC/SYNC proposal in a similar way as
> Craigs proposal.
>
> ASYNC implies that a variable or a portion of it (e.g., a subarray)  
> is potentially active in asynchronous operations outside of Fortran.
> Whether it is used asynchronously or which portion is used  
> asynchronously, can be changed at each synchronization point.
> A synchronization point is either a routine call to a routine with  
> the ASYNC variable as an actual argument, or a call to a routine  
> that has an explicit interface with the SYNC_POINT option.
>
> If a variable is declare as ASYNC within a block, then within this  
> block
> - motion of code involving this ASYNC variable would be suppressed  
> across any synchronization point,
> - between two synchronization points, only those portions of the  
> ASYNC variable can be written to the memory that are explicitly  
> modified by the application program (i.e., caching of other  
> portions, overwriting and restoring them for, e.g., loop fusion is  
> prohibited),
> - if it is an actual argument in a call to a function or subroutine  
> with a explicit interface then copyin/out of this argument is  
> prohibited.
>
> If a dummy argument is declared as ASYNC in an explicit interface,  
> then copyin/out of actual arguments is prohibited.
>
> Comments:
> - This is less restrictive than VOLATILE. For numerical operations,  
> registers can be used as usual. Same data that is used in several  
> iterations of a loop can be efficiently cached in registers  
> independent of whether ASYNC is set or not.
>
> - All MPI WAIT, TEST and communication routines (because of usage of  
> MPI_BOTTOM and absolute addresses in MPI derived datatypes) must be  
> declared with SYNC_POINT option.
>
> Usage:
>
> ----------------
>
> real, ASYNC :: 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?
>
> ----------------
>
> interface
>
> SUBROUTINE UPDATE_INTERIOR(buf)
>   TYPE(*), DIMENSION(..), ASYNC :: buf
>   ! ASYNC is necessary to guarantee that
>   ! only those portions of buf are written to
>   ! the memory that are explicitly modified
>   ! by UPDATE_INTERIOR
> END SUBROUTINE UPDATE_INTERIOR
>
> SUBROUTINE UPDATE_BOUNDARIES(buf)
>   TYPE(*), DIMENSION(..) :: buf
> END SUBROUTINE UPDATE_BOUNDARIES
>
>
> SUBROUTINE MPI_Irecv(buf, count, datatype, source, tag, comm,  
> request, err) SYNC_POINT 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) SYNC_POINT 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) SYNC_POINT 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
>
> --------------
>
> Any comments?
>
> 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)
> _______________________________________________
> mpi3-fortran mailing list
> mpi3-fortran at lists.mpi-forum.org
> http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran



More information about the mpiwg-fortran mailing list