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

Rajeev Thakur thakur at mcs.anl.gov
Fri May 30 09:30:49 CDT 2008


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


> -----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