<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><div dir="ltr">Hello all,<div><br></div><div>I have recently begun working on a project that uses MPICH-3.2 and I am trying to resolve an issue where a server process busy waits at MPI_Finalize.</div><div><br></div><div>We are trying to create a server process that accepts incoming connections from a known number of clients (say, N clients), forms a new communicator amongst everyone (server and clients) and then splits itself from the group and terminates, so that the clients now only work with each other.</div><div><br></div><div>For very problem specific reasons, we cannot do</div><div>'mpiexec -np N (other args)'</div><div><br></div><div>So we have a server that publishes a service name to a nameserver and clients lookup the name to join the server. The server and client processes are started with separate calls to mpiexec, one to start the server and the rest N calls to start the clients.</div><div><br></div><div>The server process busy-waits at the MPI_Finalize call, after it splits from the communicator and only finishes when all other clients reach their MPI_Finalize too. </div><div><br></div><div>Consider a simplified case of only one server and one client. The simplified pseudocode is:</div><div><br></div><div><u>Server process:</u></div><div><font face="monospace, monospace">MPI_Init();</font></div><div><font face="monospace, monospace">MPI_Open_port(...);</font></div><div><font face="monospace, monospace">MPI_Publish_name(...); //publish service name to nameserver</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">MPI_accept(...); // accept incoming connections and store into intercomm</font></div><div><font face="monospace, monospace">MPI_Intercomm_merge(...);  // merge new client into intra-comm</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// now split the server from the client</font></div><div><font face="monospace, monospace">MPI_Comm_rank(intra comm, rank); // rank=0</font></div><div><font face="monospace, monospace">MPI_Comm_split(intra comm, (rank==0), rank, lone comm);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">MPI_Finalize(); // busy-waits here till client's sleep duration</font></div><div><br></div><div><u>Client process:</u> (simplified - assuming only one client is trying to connect)</div><div><font face="monospace, monospace">MPI_Init();</font></div><div><font face="monospace, monospace">MPI_Lookup_name(..);</font></div><div><font face="monospace, monospace">MPI_Connect(...)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// merge</font></div><div><font face="monospace, monospace">MPI_Intercomm_merge(...); // merge with server</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// get rank and split</font></div><div><font face="monospace, monospace">MPI_Comm_rank(intra comm, rank);  // rank=1</font></div><div><font face="monospace, monospace">MPI_Comm_split(intra comm, rank==0, rank, lone comm);</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">sleep(10); // sleep for 10 seconds - causes server to busy wait at MPI_Finalize for sleep duration</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">MPI_Finalize(); // server and client finish here</font></div><div><br></div><div>So my questions are:</div><div><br></div><div>1) Is busy-wait at MPI_Finalize the expected behaviour?</div><div><br></div><div>2) How to truly "disconnect" the server, so that it can end immediately at MPI_Finalize()? I had tried MPI_Comm_disconnect (also MPI_Comm_free) on both the server and client, but that didn't help.</div><div><br></div><div>3)  We don't want to see the server process consuming one core at 100% while it waits at MPI_Finalize. Are other alternatives apart from making the server process sleep, wakeup and keep polling a client, and then finally call MPI_Finalize?</div><div><br></div><div>Thank you for any inputs that you can give here.</div><div><br></div><div><br></div><div>Regards,<br><div class="gmail_signature"><div dir="ltr">K.N.Ramachandran</div></div>
</div></div>