<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">Sorry, the last message scrambled the code, try again...<br><br></font><div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">#include &lt;sys/types.h&gt;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">#include &lt;unistd.h&gt;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">#include &lt;iostream&gt;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">#include &quot;mpi.h&quot;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">using namespace std;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">const int BUFSIZE = 1000;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">const int NWORKER = 2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">// -------------------------------------------------------------------------------------------------</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">static void mpi_send(int dst, const string&amp; s, MPI_Comm comm)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">{</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  char buf[BUFSIZE];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  strcpy(buf, s.c_str());</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Send(buf, s.size(), MPI_CHAR, dst, 0, comm);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">// -------------------------------------------------------------------------------------------------</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">static string mpi_recv(int src, MPI_Comm comm)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">{</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  char buf[BUFSIZE];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Status status;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Recv(buf, BUFSIZE, MPI_CHAR, src, MPI_ANY_TAG, comm, &amp;status);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  int count;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Get_count(&amp;status, MPI_CHAR, &amp;count);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  buf[count] = 0;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  return buf;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">}</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">// -------------------------------------------------------------------------------------------------</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">main(int argc, char **argv)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">{</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Init(&amp;argc, &amp;argv);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Comm parent;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Comm_get_parent(&amp;parent);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  // Master</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  if (parent == MPI_COMM_NULL) {</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    MPI_Comm intercom = MPI_COMM_NULL;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    while (1) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      cout &lt;&lt; &quot;Enter: &quot;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      string s;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      cin &gt;&gt; s;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      if (s == &quot;start&quot;) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>if (intercom != MPI_COMM_NULL) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  cout &lt;&lt; &quot;already started&quot; &lt;&lt; endl;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  continue;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>cout &lt;&lt; &quot;spawn &quot; &lt;&lt; argv[0] &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, NWORKER, MPI_INFO_NULL, 0, MPI_COMM_SELF, &amp;intercom, MPI_ERRCODES_IGNORE);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>continue;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      if (s == &quot;stop&quot;) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>if (intercom == MPI_COMM_NULL) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  cout &lt;&lt; &quot;worker not running&quot; &lt;&lt; endl;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  continue;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>for (int w = 0; w &lt; NWORKER; w++) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  mpi_send(w, s, intercom);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"> <span class="Apple-tab-span" style="white-space:pre">        </span>MPI_Comm_disconnect(&amp;intercom);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>intercom = MPI_COMM_NULL;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>continue;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      if (s == &quot;exit&quot;) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>if (intercom != MPI_COMM_NULL) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  cout &lt;&lt; &quot;need to stop before exit&quot; &lt;&lt; endl;</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>  continue;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>}</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>break;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      if (intercom == MPI_COMM_NULL) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>cout &lt;&lt; &quot;need to start&quot; &lt;&lt; endl;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>continue;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      for (int w = 0; w &lt; NWORKER; w++) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>mpi_send(w, s, intercom);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>string t = mpi_recv(w, intercom);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>cout &lt;&lt; &quot;worker &quot; &lt;&lt; w &lt;&lt; &quot; returned &quot; &lt;&lt; t &lt;&lt; endl;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    }</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  // Worker</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  if (parent != MPI_COMM_NULL) {</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    while (1) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      string s = mpi_recv(0, parent);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      if (s == &quot;stop&quot;) {</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>MPI_Comm_disconnect(&amp;parent);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>break;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">      mpi_send(0, s, parent);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">    }</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  }</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  MPI_Finalize();</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">}</font></div>
</div><div><br></div>