(j3.2006) [MPI3 Fortran] Feedback from Fortran J3 meeting
Tue May 27 11:55:15 EDT 2008
I think we blundered with 08-185r1.
Specifically, VOLATILE is exactly the wrong attribute.
VOLATILE means "always go to memory" for this variable.
The MPI specification says "don't touch the buf memory" between
the MPI async send/recv and the MPI wait. (The other actual args
may be treated ordinarily.)
What Fortran should say is "between these two subroutine references,
don't read/write this actual argument" and I don't think we currently
have a way to say that. :-(
It's not so much that VOLATILE is too big a hammer,
it's that a hammer is exactly the wrong tool for this task.
So I think we talked ourselves into a blunder with this one.
Never design things quickly. :-)
On May 27, 2008, at 11:43 AM, Craig Rasmussen wrote:
> Two weeks ago I attended the Fortran J3 standards meeting where I
> discussed with them the issues surrounding new Fortran MPI
> bindings. They were very receptive to our needs and instructed me
> to write a J3 paper in response (attached). In summary, J3 will try
> to get changes made in the Fortran standard so that we won't need to
> use CLOC(buffer) for a void* buffer argument. J3 still hasn't
> decided the best way to do this but the likely favorite is a new
> type, TYPE(*), as an interoperable type with void*.
> J3 also decided that the way to limit copyin/copyout semantics and
> code motion in asynchronous MPI calls is to use the volatile
> attribute on both Fortran actual and dummy arguments. The
> performance effects of volatile could be limited with the use of the
> new F2008 block construct. For example,
> real, dimension(100) :: buffer
> BEGIN BLOCK
> VOLATILE :: buf
> err = MPI_Irecv(buf, ..., req)
> err = MPI_Wait(req, ...)
> END BLOCK
> The interface for MPI_Irecv would have something like
> TYPE(*), volatile :: buf
> mpi3-fortran mailing list
> mpi3-fortran at lists.mpi-forum.org
More information about the J3