<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><div dir="ltr"><div>Yanfei,<br><br></div>Thank you. If I change usleep to 2000 or 10000000, 2 MPI_Test's are called. <br><br>This is quoted from Junchao's reply:<br>"My understanding is that:  In eager mode, sender does not need a Ack message from receiver (to know recv buf is ready), but in <span style="font-family:arial,sans-serif;font-size:13px">rendezvous mode, it does.</span><div><font face="arial, sans-serif">In your case, if it is in rendezvous mode, Isend() issues the request. But since it is a nonblocking call, before </font>sender<font face="arial, sans-serif"> gets
 the Ack message, it goes into sleep. The asynchronous progress engine 
does not progress until MPI_Wait() is called. At that time, the Ack 
message is got, and message passing happens. Therefore, MPI_Recv() 
finishes after MPI_Wait()."<br><br></font></div><div><font face="arial, sans-serif">So my understanding is there's a handshake in rendezvous mode, and the handshake is performed by MPI_Test and MPI_Recv (or in the case above, MPI_Wait gets the Ack message). Please correct me if I'm wrong. Thanks.<br></font></div><br></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr">Best regards,<div>Zhen</div></div></div></div>
<br><div class="gmail_quote">On Mon, Apr 25, 2016 at 6:45 PM, Guo, Yanfei <span dir="ltr"><<a href="mailto:yguo@anl.gov" target="_blank">yguo@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
The MPI_Test call has nothing to do with “let P1 receive the data”. Even without calling MPI_Test, the communication should eventually complete. MPI_Test in your code is only for the sender to check whether the communication is actually done. The 2 MPI_Test calls in your test is because the completion of the communication takes longer time than the usleep. If you reduce the time in usleep, you might get even more MPI_Test calls. I don’t think it is relevant to performance.<br>
<span class="HOEnZb"><font color="#888888"><br>
Yanfei Guo<br>
Postdoctoral Researcher<br>
MCS Division, ANL<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<br>
<br>
<br>
<br>
On 4/25/16, 3:25 PM, "Zhen Wang" <<a href="mailto:toddwz@gmail.com">toddwz@gmail.com</a>> wrote:<br>
<br>
>Rob,<br>
><br>
><br>
>Thanks for your reply. Let me rephrase my question. I'm simulating what I do in a complicate code. P0 Isends data to P1, and does computations. P1 needs data to do computation, so it calls Recv. As you said, P0 is calling MPI_Test periodically. What puzzles<br>
> me is why 2 calls of MPI_Test are needed to let P1 receive the data. (With Intel MPI, the number jumps to around 6.) The number of MPI_Test calls has influence on performance. Thanks.<br>
><br>
><br>
>Best regards,<br>
>Zhen<br>
><br>
><br>
><br>
><br>
>On Mon, Apr 25, 2016 at 4:13 PM, Rob Latham<br>
><<a href="mailto:robl@mcs.anl.gov">robl@mcs.anl.gov</a>> wrote:<br>
><br>
><br>
><br>
>On 04/25/2016 02:57 PM, Zhen Wang wrote:<br>
><br>
>Hi,<br>
><br>
>I have questions regarding MPI_Isend and MPI_Test. A sample code is<br>
>attached, output is as follows.<br>
><br>
>For instance, both Isend and Recv of 0 start at 15:46:14, but 2 MPI_Test<br>
>are called before Recv of 0 finishes. My understanding is first Test<br>
>receives the signal that receiver is ready, and data transfer follows.<br>
>Then the second Test will see the transfer is complete, and free<br>
>MPI_Request. Is my understanding correct? Thanks.<br>
><br>
><br>
><br>
>MPI_Test() is non-blocking.  MPI_Test() is not going to wait for anything to happen -- that's what MPI_Wait() will do.<br>
><br>
>under the hood, MPI_Test "kicks the progress engine", which means everything that can execute right now will happen.  If there is anything that requires code to wait (to receive a signal, in your case), then test will return.<br>
><br>
>A data transfer might take several calls to MPI_Test to complete.  Or, there's a background progress thread that's churning along and you only need to make one call to MPI_Test.  It's implementation-dependent.<br>
><br>
>You are asking the wrong question, though.  At this level, it doesn't matter what MPI_Test does.  If your code has something it can do while the isend progresses, then go do that and call MPI_Test periodically. If you have nothing productive you can do, call<br>
> MPI_Wait() (or one of the variants).<br>
><br>
>==rob<br>
><br>
><br>
><br>
>Best regards,<br>
>Zhen<br>
><br>
>MPI 1: Recv of 0 started at 15:46:14.<br>
>MPI 0: Isend of 0 started at 15:46:14.<br>
>MPI 0: Isend of 1 started at 15:46:14.<br>
>MPI 0: Isend of 2 started at 15:46:14.<br>
>MPI 0: Isend of 3 started at 15:46:14.<br>
>MPI 0: Isend of 4 started at 15:46:14.<br>
>MPI 0: MPI_Test of 0 at 15:46:16.<br>
>MPI 0: MPI_Test of 0 at 15:46:18.<br>
>MPI 0: Isend of 0 finished at 15:46:18.<br>
>MPI 1: Recv of 0 finished at 15:46:18.<br>
>MPI 1: Recv of 1 started at 15:46:18.<br>
>MPI 0: MPI_Test of 1 at 15:46:20.<br>
>MPI 0: MPI_Test of 1 at 15:46:22.<br>
>MPI 0: Isend of 1 finished at 15:46:22.<br>
>MPI 1: Recv of 1 finished at 15:46:22.<br>
>MPI 1: Recv of 2 started at 15:46:22.<br>
>MPI 0: MPI_Test of 2 at 15:46:24.<br>
>MPI 0: MPI_Test of 2 at 15:46:26.<br>
>MPI 0: Isend of 2 finished at 15:46:26.<br>
>MPI 1: Recv of 2 finished at 15:46:26.<br>
>MPI 1: Recv of 3 started at 15:46:26.<br>
>MPI 0: MPI_Test of 3 at 15:46:28.<br>
>MPI 0: MPI_Test of 3 at 15:46:30.<br>
>MPI 0: Isend of 3 finished at 15:46:30.<br>
>MPI 1: Recv of 3 finished at 15:46:30.<br>
>MPI 1: Recv of 4 started at 15:46:30.<br>
>MPI 0: MPI_Test of 4 at 15:46:32.<br>
>MPI 0: MPI_Test of 4 at 15:46:34.<br>
>MPI 0: Isend of 4 finished at 15:46:34.<br>
>MPI 1: Recv of 4 finished at 15:46:34.<br>
><br>
><br>
><br>
><br>
><br>
>_______________________________________________<br>
>discuss mailing list     <a href="mailto:discuss@mpich.org">discuss@mpich.org</a><br>
>To manage subscription options or unsubscribe:<br>
><a href="https://lists.mpich.org/mailman/listinfo/discuss" rel="noreferrer" target="_blank">https://lists.mpich.org/mailman/listinfo/discuss</a><br>
><br>
><br>
><br>
>_______________________________________________<br>
>discuss mailing list     <a href="mailto:discuss@mpich.org">discuss@mpich.org</a><br>
>To manage subscription options or unsubscribe:<br>
><a href="https://lists.mpich.org/mailman/listinfo/discuss" rel="noreferrer" target="_blank">https://lists.mpich.org/mailman/listinfo/discuss</a><br>
><br>
><br>
><br>
><br>
><br>
_______________________________________________<br>
discuss mailing list     <a href="mailto:discuss@mpich.org">discuss@mpich.org</a><br>
To manage subscription options or unsubscribe:<br>
<a href="https://lists.mpich.org/mailman/listinfo/discuss" rel="noreferrer" target="_blank">https://lists.mpich.org/mailman/listinfo/discuss</a></div></div></blockquote></div><br></div>