Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] MPI_Bsend vs. MPI_Ibsend
From: Richard Treumann (treumann_at_[hidden])
Date: 2010-05-06 10:48:45


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

|------------>
| From: |
|------------>
>----------------------------------------------------------------------------------------------------------------------------------------|
  |Bill Rankin <Bill.Rankin_at_[hidden]> |
>----------------------------------------------------------------------------------------------------------------------------------------|
|------------>
| To: |
|------------>
>----------------------------------------------------------------------------------------------------------------------------------------|
  |Open MPI Users <users_at_[hidden]> |
>----------------------------------------------------------------------------------------------------------------------------------------|
|------------>
| Date: |
|------------>
>----------------------------------------------------------------------------------------------------------------------------------------|
  |05/06/2010 10:35 AM |
>----------------------------------------------------------------------------------------------------------------------------------------|
|------------>
| Subject: |
|------------>
>----------------------------------------------------------------------------------------------------------------------------------------|
  |Re: [OMPI users] MPI_Bsend vs. MPI_Ibsend |
>----------------------------------------------------------------------------------------------------------------------------------------|
|------------>
| Sent by: |
|------------>
>----------------------------------------------------------------------------------------------------------------------------------------|
  |users-bounces_at_[hidden] |
>----------------------------------------------------------------------------------------------------------------------------------------|

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.

-bill

-----Original Message-----
From: users-bounces_at_[hidden] [mailto:users-bounces_at_[hidden]] On
Behalf Of Jovana Knezevic
Sent: Thursday, May 06, 2010 4:44 AM
To: users_at_[hidden]
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);
MPI_Test(&request...)

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

Thank you a lot in advance.

Regards
Jovana
_______________________________________________
users mailing list
users_at_[hidden]
http://www.open-mpi.org/mailman/listinfo.cgi/users

_______________________________________________
users mailing list
users_at_[hidden]
http://www.open-mpi.org/mailman/listinfo.cgi/users




graycol.gif
ecblank.gif