[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