Thanks!<br><br><div class="gmail_quote">On Fri, Oct 28, 2011 at 11:17 AM, Darius Buntinas <span dir="ltr">&lt;<a href="mailto:buntinas@mcs.anl.gov">buntinas@mcs.anl.gov</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Jon,<br>
<br>
I had to pull out my copy of the standard for this one :-).  The standard says (Section 10.5.4 on pg 330) that MPI_Finalize is collective over &quot;connected&quot; processes.  By the definition of &quot;connected&quot; (in the same section), the master and worker processes in your application are still connected, so the worker process might wait until the master process calls MPI_Finalize (in the case of MPICH, it will wait if the two processes have ever communicated).  You can use MPI_Comm_disconnect to disconnect the master and worker before the worker calls MPI_Finalize.<br>

<br>
I added an MPI_Comm_disconnect on line 37 and line 80 of your program and it looks like it works as you intend.<br>
<br>
-d<br>
<div><div></div><div class="h5"><br>
<br>
On Oct 28, 2011, at 11:18 AM, Jonathan Bishop wrote:<br>
<br>
&gt; I am using MPI_Comm_spawn to dynamically run workers. However, when the workers exit they get hung up on MPI_Finalize. Here is a short program which shows the issue...<br>
&gt;<br>
&gt; It responds to several commands...<br>
&gt;<br>
&gt; Do<br>
&gt;<br>
&gt; start<br>
&gt; stop<br>
&gt;<br>
&gt; and then check how many processes are running - it should be 1, not 2.<br>
&gt;<br>
&gt; I am using MPICH2 1.4.1-p1.<br>
&gt;<br>
&gt; Thanks,<br>
&gt;<br>
&gt; Jon<br>
&gt;<br>
&gt; #include &lt;sys/types.h&gt;<br>
&gt; #include &lt;unistd.h&gt;<br>
&gt; #include &lt;iostream&gt;<br>
&gt; #include &quot;mpi.h&quot;<br>
&gt;<br>
&gt; using namespace std;<br>
&gt;<br>
&gt;<br>
&gt; main(int argc, char **argv)<br>
&gt; {<br>
&gt;   MPI_Init(&amp;argc, &amp;argv);<br>
&gt;   MPI_Comm parent;<br>
&gt;   MPI_Comm_get_parent(&amp;parent);<br>
&gt;<br>
&gt;   // Master<br>
&gt;   if (parent == MPI_COMM_NULL) {<br>
&gt;     cout &lt;&lt; getpid() &lt;&lt; endl;<br>
&gt;     MPI_Comm intercom = MPI_COMM_NULL;<br>
&gt;     while (1) {<br>
&gt;       cout &lt;&lt; &quot;Enter: &quot;;<br>
&gt;       string s;<br>
&gt;       cin &gt;&gt; s;<br>
&gt;       if (s == &quot;start&quot;) {<br>
&gt;       if (intercom != MPI_COMM_NULL) {<br>
&gt;         cout &lt;&lt; &quot;already started&quot; &lt;&lt; endl;<br>
&gt;         continue;<br>
&gt;       }<br>
&gt;       MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0, MPI_COMM_SELF, &amp;intercom,  MPI_ERRCODES_IGNORE);<br>
&gt;       continue;<br>
&gt;       }<br>
&gt;       if (s == &quot;stop&quot;) {<br>
&gt;       if (intercom == MPI_COMM_NULL) {<br>
&gt;         cout &lt;&lt; &quot;worker not running&quot; &lt;&lt; endl;<br>
&gt;         continue;<br>
&gt;       }<br>
&gt;       MPI_Send(const_cast&lt;char*&gt;(s.c_str()), s.size(), MPI_CHAR, 0, 0, intercom);<br>
&gt;       intercom = MPI_COMM_NULL;<br>
&gt; //    MPI_Finalize();  // This will allow the workers to die, but then I can not restart them.<br>
&gt;       continue;<br>
&gt;       }<br>
&gt;       if (s == &quot;exit&quot;) {<br>
&gt;       if (intercom != MPI_COMM_NULL) {<br>
&gt;         cout &lt;&lt; &quot;need to stop before exit&quot; &lt;&lt; endl;<br>
&gt;         continue;<br>
&gt;       }<br>
&gt;       break;<br>
&gt;       }<br>
&gt;       if (intercom == MPI_COMM_NULL) {<br>
&gt;       cout &lt;&lt; &quot;need to start&quot; &lt;&lt; endl;<br>
&gt;       continue;<br>
&gt;       }<br>
&gt;       MPI_Send(const_cast&lt;char*&gt;(s.c_str()), s.size(), MPI_CHAR, 0, 0, intercom);<br>
&gt;       char buf[1000];<br>
&gt;       MPI_Status status;<br>
&gt;       MPI_Recv(buf, 1000, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, intercom, &amp;status);<br>
&gt;       int count;<br>
&gt;       MPI_Get_count(&amp;status, MPI_CHAR, &amp;count);<br>
&gt;       buf[count] = 0;<br>
&gt;       string t = buf;<br>
&gt;       cout &lt;&lt; &quot;worker returned &quot; &lt;&lt; t &lt;&lt; endl;<br>
&gt;     }<br>
&gt;   }<br>
&gt;<br>
&gt;   // Worker<br>
&gt;   if (parent != MPI_COMM_NULL) {<br>
&gt;     while (1) {<br>
&gt;       char buf[1000];<br>
&gt;       MPI_Status status;<br>
&gt;       MPI_Recv(buf, 1000, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, parent, &amp;status);<br>
&gt;       int count;<br>
&gt;       MPI_Get_count(&amp;status, MPI_CHAR, &amp;count);<br>
&gt;       buf[count] = 0;<br>
&gt;       string s = buf;<br>
&gt;       if (s == &quot;stop&quot;) {<br>
&gt;       cout &lt;&lt; &quot;worker stopping&quot; &lt;&lt; endl;<br>
&gt;       break;<br>
&gt;       }<br>
&gt;       MPI_Send(const_cast&lt;char*&gt;(s.c_str()), s.size(), MPI_CHAR, 0, 0, parent);<br>
&gt;     }<br>
&gt;   }<br>
&gt;<br>
&gt;   MPI_Finalize();<br>
&gt; }<br>
&gt;<br>
</div></div>&gt; _______________________________________________<br>
&gt; mpich-discuss mailing list     <a href="mailto:mpich-discuss@mcs.anl.gov">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">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>
</blockquote></div><br>