[mpich-discuss] mpich2 and sending message from a task to itself

Bryan Putnam bfp at purdue.edu
Fri May 30 10:24:23 CDT 2008


On Fri, 30 May 2008, Rajeev Thakur wrote:

> See the semantics of point-to-point communication in
> http://www.mpi-forum.org/docs/mpi-11-html/node40.html. An MPI_Send is
> allowed to block until the matching receive is posted. In your example, the
> matching receive never gets posted. It would work if the receive was called
> from a separate thread. The other options are the post the receive earlier
> as an Irecv or do the send as an Isend.
> 
> In the send-to-yourself case, MPICH2 simply does a memcpy from source to
> receive buffers, hence it wants the receive to be posted. We could have
> implemented some buffering, but we haven't. We probably should because we
> periodically get such bug reports.

Rajeev,

OK I see, thanks.

Bryan
> 
> 
> Rajeev
> 
> 
> > -----Original Message-----
> > From: owner-mpich-discuss at mcs.anl.gov 
> > [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Bryan Putnam
> > Sent: Friday, May 30, 2008 7:13 AM
> > To: mpich-discuss at mcs.anl.gov
> > Cc: Dave Seaman
> > Subject: RE: [mpich-discuss] mpich2 and sending message from 
> > a task to itself
> > 
> > On Thu, 29 May 2008, Rajeev Thakur wrote:
> > 
> > > The send-to-yourself needs to be either a nonblocking send or the 
> > > receive must be posted before the send. MPI_Send will block for the 
> > > receive to be posted.
> > > 
> > > Rajeev
> > 
> > Rajeev,
> > 
> > One of my co-workers makes the following comment:
> > 
> > That contradicts Section 2.2 in MPI: The Complete Reference 
> > (Blocking Send and Receive Operations), which specifically 
> > says on page I-37 that a process may use MPI_SEND to send a 
> > message to itself. I see nothing there about a need to post a 
> > receive before the send, and at any rate, nonblocking sends 
> > and receives are not discussed until section 2.8.
> > 
> > Thanks,
> > Bryan
> > 
> > > 
> > > 
> > > > -----Original Message-----
> > > > From: owner-mpich-discuss at mcs.anl.gov 
> > > > [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Bryan Putnam
> > > > Sent: Thursday, May 29, 2008 3:26 PM
> > > > To: mpich-discuss at mcs.anl.gov
> > > > Subject: [mpich-discuss] mpich2 and sending message from 
> > a task to 
> > > > itself
> > > > 
> > > > Hi,
> > > > 
> > > > I've found that if I take a standard "hello, world" 
> > program (where 
> > > > master sends "hello" to all tasks except itself), and 
> > modify it so 
> > > > that master sends "hello" to all tasks including itself, I get a 
> > > > "MPI_Send" error when using mpich2-1.0.7, of the form
> > > > 
> > > > Fatal error in MPI_Send: Error message texts are not
> > > > available[cli_0]: 
> > > > aborting job:
> > > > 
> > > > From what we can tell, sending a message to yourself is 
> > allowed by 
> > > > the MPI
> > > > standard:
> > > > 
> > > > From MPI: The Complete Reference (I-37):
> > > > 
> > > > +++++++++++++++
> > > > The range of valid values for [the destination argument] 
> > is 0..n-1, 
> > > > where n is the number of processes in the group. This 
> > range includes 
> > > > the rank of the sender: if [the communicator] is an 
> > > > intracommunicator, then a process may send a message to itself.
> > > > 
> > > > MPI::COMM_WORLD is indeed an intracommunicator.
> > > > +++++++++++++++
> > > > 
> > > > For your enjoyment, I've included my original code, and 
> > followed it 
> > > > by the modified code.
> > > > 
> > > > Thanks!
> > > > Bryan
> > > > 
> > > > 
> > > >       program hellof
> > > >       include 'mpif.h'
> > > >       integer me, nt, mpierr, status(MPI_STATUS_SIZE)
> > > >       integer tag
> > > >       character*12  message, inmsg
> > > >   
> > > >       call MPI_INIT(mpierr)
> > > >       call MPI_COMM_SIZE(MPI_COMM_WORLD, nt, mpierr)
> > > >       call MPI_COMM_RANK(MPI_COMM_WORLD, me, mpierr)
> > > >       tag = 1
> > > >   
> > > >       if(me .eq. 0) then
> > > >         message = 'Hello world!'
> > > >         do i=1,nt-1
> > > >            call MPI_SEND(message, 12, MPI_CHARACTER, i, tag,
> > > >      &                   MPI_COMM_WORLD, mpierr)
> > > >         enddo
> > > >         write(6,*) 'node', me, ': ', message
> > > >       else
> > > >         call MPI_RECV(inmsg, 12, MPI_CHARACTER, 0, tag,
> > > >      &                MPI_COMM_WORLD, status, mpierr)
> > > >         write(6,*) 'node', me, ': ', inmsg
> > > >       endif
> > > >       call MPI_FINALIZE(mpierr)
> > > >       end
> > > > 
> > > > 
> > > > Modified code:
> > > > 
> > > > 
> > > >       program hellof
> > > >       include 'mpif.h'
> > > >       integer me, nt, mpierr, status(MPI_STATUS_SIZE)
> > > >       integer tag
> > > >       character*12  message, inmsg
> > > >   
> > > >       call MPI_INIT(mpierr)
> > > >       call MPI_COMM_SIZE(MPI_COMM_WORLD, nt, mpierr)
> > > >       call MPI_COMM_RANK(MPI_COMM_WORLD, me, mpierr)
> > > >       tag = 1
> > > >   
> > > >       if(me .eq. 0) then
> > > >         message = 'Hello world!'
> > > >         do i=0,nt-1
> > > >            call MPI_SEND(message, 12, MPI_CHARACTER, i, tag,
> > > >      &                   MPI_COMM_WORLD, mpierr)
> > > >         enddo
> > > >         write(6,*) 'node', me, ': ', message
> > > >       endif
> > > >       call MPI_RECV(inmsg, 12, MPI_CHARACTER, 0, tag,
> > > >      &              MPI_COMM_WORLD, status, mpierr)
> > > >         write(6,*) 'node', me, ': ', inmsg
> > > >       call MPI_FINALIZE(mpierr)
> > > >       end
> > > > 
> > > > 
> > > > 
> > > 
> > > 
> > 
> > 
> > 
> > 
> 
> 





More information about the mpich-discuss mailing list