An MPI send (of any kind), is defined by "local completion semantics". When a send is complete, the send buffer may be reused. The only kind of send that gives any indication whether the receive is posted is the synchronous send. Neither standard send nor buffered send tell the sender if the recv was posted.

The difference between blocking and nonblocking is that a return from a blocking send call indicates the send buffer may be reused. A return from a nonblocking send does not allow the send buffer tpo be reused (but other things can be done). The send buffer becomes available to reuse after a wait or successful test.

Dick Treumann - MPI Team
IBM Systems & Technology Group
Dept X2ZA / MS P963 -- 2455 South Road -- Poughkeepsie, NY 12601
Tele (845) 433-7846 Fax (845) 433-8363

Inactive hide details for Bill Rankin ---05/06/2010 10:35:13 AM---Actually the 'B' in MPI_Bsend() specifies that it is a blockiBill Rankin ---05/06/2010 10:35:13 AM---Actually the 'B' in MPI_Bsend() specifies that it is a blocking *buffered* send. So if I remember m


Bill Rankin <>


Open MPI Users <>


05/06/2010 10:35 AM


Re: [OMPI users] MPI_Bsend vs. MPI_Ibsend

Sent by:

Actually the 'B' in MPI_Bsend() specifies that it is a blocking *buffered* send.  So if I remember my standards correctly, this call requires:

1) you will have to explicitly manage the send buffers via MPI_Buffer_[attach|detach](), and

2) the send will block until a corresponding receive is posted.

The MPI_Ibsend() is the immediate version of the above and will return w/o the requirement for the corresponding received.  Since it is a buffered send the local data copy should be completed before it returns, allowing you to change the contents of the local data buffer.  But there is no guaranty that the message has been send, so you should not reuse the send buffer until after verifying the completion of the send via MPI_Wait() or similar.

In your example, since MPI_Test() won't block, you can have a problem.  Use MPI_Wait() instead or change your send buffer to one that is not being used.


-----Original Message-----
From: [] On Behalf Of Jovana Knezevic
Sent: Thursday, May 06, 2010 4:44 AM
Subject: [OMPI users] MPI_Bsend vs. MPI_Ibsend

Dear all,

Could anyone please clarify me the difference between MPI_Bsend and
MPI_Ibsend? Or, in other words, what exactly is "blocking" in
MPI_Bsend, when the data is stored in the buffer and we "return"? :-)
Another, but similar, question:

What about the data-buffer - when can it be reused in each of the
cases - simple examples:

for (i=0; i<NUMBER_OF_SLAVES; i++) {

MPI_Bsend (&data_buffer[0], ..., slave_id1...);

}  // Can any problem occur here, since we send the data_buffer several times?

for (i=0; i<NUMBER_OF_SLAVES; i++) {

MPI_Ibsend (&data_buffer[0], ..., slave[i]..., &request);

}  // Any difference to previous example? Concerning the re-use of data_buffer?

Thank you a lot in advance.

users mailing list

users mailing list