[MPI3 Fortran] ASYNC attribute
Jeff Squyres
jsquyres at cisco.com
Wed May 6 06:05:28 CDT 2009
1. How does the MPI_Wait know that it can have no code motion with
respect to buf?
2. Yes, the MPI_Request argument to MPI_Wait is inout.
On May 5, 2009, at 7:45 PM, Craig Rasmussen 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
--
Jeff Squyres
Cisco Systems
More information about the mpiwg-fortran
mailing list