<div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Darius.</div><div>Thank you for your&#39;s response.</div>
<div>I changed code according to your&#39;s proposition.</div><div>Results:</div><div>Sometimes I get fail process as expected, and one more process fails unexpectedly.</div>
<div>I attach code &amp; logs.</div><div>Execution command:</div><div>mpiexec.hydra -genvall -disable-auto-cleanup -f machines_student.txt -n 24 -launcher=rsh mpi_rcv_waitany 100000 1000000 3 5 1 logs/mpi_rcv_waitany_1_</div>

<div><br></div><div><ul><li>I run 24 processes on 3 computers.</li><li>100000 iterations</li><li>Expected fail of process 3 on iteration 5.</li><li>In addition I got fail of <b>process 18</b>. It&#39;s logs with it&#39;s errors is mpi_rcv_waitany_1__r18.log</li>

</ul></div><div>Can you please review again my code, and give me some tips to fix application.</div><span class="HOEnZb"><font color="#888888"><div><br></div><div>Anatoly.</div></font></span><div><div class="h5"><br><br>
<div class="gmail_quote">On Tue, Jan 10, 2012 at 9:32 PM, Anatoly G <span dir="ltr">&lt;<a href="mailto:anatolyrishon@gmail.com" target="_blank">anatolyrishon@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><div dir="ltr"><br><br><div class="gmail_quote">---------- Forwarded message ----------<br>
From: <b class="gmail_sendername">Darius Buntinas</b> <span dir="ltr">&lt;<a href="mailto:buntinas@mcs.anl.gov" target="_blank">buntinas@mcs.anl.gov</a>&gt;</span><br>
Date: Tue, Jan 10, 2012 at 8:11 PM<br>Subject: Re: [mpich-discuss] Fault tolerance - not stable.<br>To: <a href="mailto:mpich-discuss@mcs.anl.gov" target="_blank">mpich-discuss@mcs.anl.gov</a><br><br><br><br>
I took a look at mpi_rcv_waitany.cpp, and I found a couple of issues.  I&#39;m not sure if this is the problem, but we should fix these first.<br>
<br>
In Rcv_WaitAny(), in the while(true) loop, you do a waitany, but then you iterate over the requests and do a test.  I don&#39;t think this is what you want to do.  When waitany returns, mRcvRequests[slaveIdx] will be set to MPI_REQUEST_NULL, so the subsequent test will return MPI_SUCCESS, and you may not register a failure.<br>



<br>
Also, if all requests have previously completed, and you call waitany, then it will return and set slaveIdx to MPI_UNDEFINED, so we need to consider that case.<br>
<br>
Another issue is that you post a receive for the slave after it completes, but never wait on that request.  This is not allowed in MPI (but you can probably get away with this most of the time).<br>
<br>
I _think_ what you want to do is this:<br>
<br>
  while(mSlavesFinished &lt; mSlaves) {<br>
        retErr = MPI_Waitany(mRcvRequests.size(), &amp;*mRcvRequests.begin(), &amp;slaveIdx, &amp;status);<br>
        slaveRank = slaveIdx + 1;<br>
<br>
        if  (retErr != MPI_SUCCESS) {<br>
            char Msg[256];<br>
            sprintf(Msg, &quot;From rank %d, fail - request deallocated&quot;, slaveRank);<br>
            handleMPIerror(mFpLog, Msg, retErr, &amp;status);<br>
            mRcvRequests[slaveIdx] = MPI_REQUEST_NULL;<br>
            mIsSlaveLives[slaveIdx] = 0;<br>
            ++mSlavesFinished;<br>
            continue;<br>
        }<br>
<br>
        /* if all requests have been completed, we should have exited the loop already */<br>
        assert(slaveIdx != MPI_UNDEFINED);<br>
        /* if the slave is dead, we should not be able to receive a message from it */<br>
        assert(mIsSlaveLives[slaveIdx});<br>
<br>
        ++mSlavesRcvIters[slaveIdx];<br>
        if(mSlavesRcvIters[slaveIdx] == nIters) {<br>
            ++mSlavesFinished;<br>
            fprintf(mFpLog, &quot;\n\nFrom rank %d, Got number = %d\n &quot;, slaveRank, mRcvNumsBuf[slaveIdx]);<br>
            fprintf(mFpLog, &quot;Slave %d finished\n\n&quot;, slaveIdx+1);<br>
        } else {<br>
            MPI_Irecv(&amp;(mRcvNumsBuf[slaveIdx]), 1, MPI::INT, slaveRank, MPI::ANY_TAG, MPI_COMM_WORLD, &amp;(mRcvRequests[slaveIdx]));<br>
        }<br>
    }<br>
<br>
Give this a try and see how it works.<br>
<br>
-d<br>
<div><div><br>
<br>
<br>
On Jan 10, 2012, at 12:50 AM, Anatoly G wrote:<br>
<br>
&gt; Dear mpich-discuss,<br>
&gt; I have a problem while using fault tolerance feature, in MPICH2 hydra process manager.<br>
&gt; The results are not consistent, sometimes tests pass, sometimes stall.<br>
&gt; If you executes command line written below in loop, after number of iterations, test stall.<br>
&gt; Can you please help me with this problem?<br>
&gt;<br>
&gt; There are 3 tests. All 3 tests have same model master with number of slaves. Communication operations are point to point.<br>
&gt;<br>
&gt; Slave algorithm is same for all 3 tests.<br>
&gt; for N times:<br>
&gt;     MPI_Send integer to master.<br>
&gt;     if IterI (parameter) &amp;&amp; rank= fail_rank<br>
&gt;         cause divide by zero exception. (A = 5.0; B = 0.0;  C = A / B;)<br>
&gt; MPI_Recv(master)<br>
&gt;<br>
&gt; Master algorithm Test1 (mpi_send_rcv_waitany.cpp) :<br>
&gt;       • For each slave call MPI_Irecv<br>
&gt;       • while not got N messages from each slave continue<br>
&gt;       •       MPI_Waitany(slaveIdx)<br>
&gt;       •       if slaveIdx alive<br>
&gt;       •          MPI_Irecv(slaveIdx)<br>
&gt;       •       else<br>
&gt;       •          Mark it as finished.<br>
&gt;       • MPI_Send to all slaves .<br>
&gt;<br>
&gt; Master algorithm Test2 (mpi_send_sync.cpp) :<br>
&gt;       • slave = first slave<br>
&gt;       • while not got N messages from each slave continue<br>
&gt;       •       MPI_Recv(slave)<br>
&gt;       •       if slaveIdx alive<br>
&gt;       •          pass to next live slave<br>
&gt;       •       else<br>
&gt;       •          Mark it as finished.<br>
&gt;       • MPI_Send to all slaves .<br>
&gt;<br>
&gt; Master algorithm Test3 (mpi_send_async.cpp) :<br>
&gt; Same as test2, but instead of MPI_Recv, I use MPI_Irecv + MPI_Wait<br>
&gt;<br>
&gt; When test stall, I connect debugger to master process.<br>
&gt; Process stall in MPI_recv, or MPI_Irecv.<br>
&gt; I think, stall caused by following sequence:<br>
&gt;       • Master receives integer from slave.<br>
&gt;       • Tests slave - it&#39;s Ok.<br>
&gt;       • Slave failes<br>
&gt;       • master try to perform MPI_Irecv or MPI_Recv on failed slave.<br>
&gt; Problem happens on cluster (student_machines.txt) &amp; on single machine (machine_student1.txt)<br>
&gt;<br>
&gt; Execution lines:<br>
&gt;       • /space/local/hydra/bin/mpiexec.hydra  -genvall  -disable-auto-cleanup  -f machine_student1.txt  -n 8  -launcher=rsh mpi_rcv_waitany 100000 1000000 3 10 1 logs/mpi_rcv_waitany_it_9/res_<br>
&gt;       • /space/local/hydra/bin/mpiexec.hydra  -genvall  -disable-auto-cleanup  -f student_machines.txt  -n 12  -launcher=rsh mpi_rcv_waitany 100000 1000000 3 10 1 logs/mpi_rcv_waitany_it_9/res_<br>
&gt; Test performs 100000 iterations master with each slave.<br>
&gt; 1000000 scale number to distinguish between sequences if integers with master &amp; each slave.<br>
&gt; 3 - rank of process to cause fail (fail_rank)<br>
&gt; 10 - fail iteration. On iteration 10 process with rank 3 will cause divide by zero exception.<br>
&gt; 1 logs/mpi_rcv_waitany_it_9/res_     defines log file.<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div>&gt; &lt;machine_student1.txt&gt;&lt;machines_student.txt&gt;&lt;mpi_rcv_waitany.cpp&gt;&lt;mpi_send_async.cpp&gt;&lt;mpi_send_sync.cpp&gt;&lt;mpi_test_incl.h&gt;_______________________________________________<br>



&gt; mpich-discuss mailing list     <a href="mailto:mpich-discuss@mcs.anl.gov" target="_blank">mpich-discuss@mcs.anl.gov</a><br>
&gt; To manage subscription options or unsubscribe:<br>
&gt; <a href="https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss" target="_blank">https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss</a><br>
<br>
_______________________________________________<br>
mpich-discuss mailing list     <a href="mailto:mpich-discuss@mcs.anl.gov" target="_blank">mpich-discuss@mcs.anl.gov</a><br>
To manage subscription options or unsubscribe:<br>
<a href="https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss" target="_blank">https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss</a><br>
</div><br></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div>