<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>RE: [mpich-discuss] Suggestions solicited</TITLE>

<META content="MSHTML 6.00.2800.1615" name=GENERATOR></HEAD>
<BODY>
<DIV><SPAN class=322385618-04122008><FONT face=Arial color=#0000ff 
size=2>Excellent, thank you!!</FONT></SPAN></DIV>
<BLOCKQUOTE dir=ltr style="MARGIN-RIGHT: 0px">
  <DIV class=OutlookMessageHeader dir=ltr align=left><FONT face=Tahoma 
  size=2>-----Original Message-----<BR><B>From:</B> Jayesh Krishna 
  [mailto:jayesh@mcs.anl.gov]<BR><B>Sent:</B> Thursday, December 04, 2008 11:34 
  AM<BR><B>To:</B> Hiatt, Dave M [GCG-RE1]<BR><B>Cc:</B> 
  mpich-discuss@mcs.anl.gov<BR><B>Subject:</B> RE: [mpich-discuss] Suggestions 
  solicited<BR><BR></FONT></DIV><!-- Converted from text/plain format -->
  <P><FONT size=2>Hi,<BR>&nbsp;What you need is the server to do a 
  MPI_Comm_accept() to accept connection from volatile clients. 
  MPI_Comm_accept() creates a new communicator which can be used for 
  communicating with the client. This communicator can be disconnected without 
  doing a MPI_Finalize().<BR>&nbsp;A simple example (serial server) of this type 
  of scenario is given below,<BR><BR>#################### server 
  ###################<BR><BR>#include "mpi.h"<BR>#include 
  &lt;stdio.h&gt;<BR><BR>#define NUM_CLIENTS 10<BR>int main(int argc, char 
  *argv[]){<BR>&nbsp;&nbsp;&nbsp; int i;<BR>&nbsp;&nbsp;&nbsp; char 
  portName[MPI_MAX_PORT_NAME];<BR>&nbsp;&nbsp;&nbsp; MPI_Init(&amp;argc, 
  &amp;argv);<BR>&nbsp;&nbsp;&nbsp; MPI_Open_port(MPI_INFO_NULL, 
  portName);<BR>&nbsp;&nbsp;&nbsp; printf("portName = %s\n", 
  portName);<BR>&nbsp;&nbsp;&nbsp; for(i = 0; i &lt; NUM_CLIENTS; 
  i++){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Comm 
  newcomm;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  MPI_Comm_accept(portName, MPI_INFO_NULL, 0, MPI_COMM_WORLD, 
  &amp;newcomm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Accepted 
  a connection\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  MPI_Comm_disconnect(&amp;newcomm);<BR>&nbsp;&nbsp;&nbsp; 
  }<BR>&nbsp;&nbsp;&nbsp; MPI_Close_port(portName);<BR>&nbsp;&nbsp;&nbsp; 
  MPI_Finalize();<BR>}<BR><BR>#################### server 
  ###################<BR>#################### client 
  ###################<BR><BR>#include "mpi.h"<BR>#include 
  &lt;stdio.h&gt;<BR><BR>#define NUM_CLIENTS 10<BR>int main(int argc, char 
  *argv[]){<BR>&nbsp;&nbsp;&nbsp; char 
  portName[MPI_MAX_PORT_NAME];<BR>&nbsp;&nbsp;&nbsp; MPI_Comm 
  newcomm;<BR><BR>&nbsp;&nbsp;&nbsp; MPI_Init(&amp;argc, 
  &amp;argv);<BR>&nbsp;&nbsp;&nbsp; printf("portname : ");<BR>&nbsp;&nbsp;&nbsp; 
  gets(portName);<BR>&nbsp;&nbsp;&nbsp; MPI_Comm_connect(portName, 
  MPI_INFO_NULL, 0, MPI_COMM_WORLD, &amp;newcomm);<BR>&nbsp;&nbsp;&nbsp; 
  printf("Connected to %s\n", portName);<BR>&nbsp;&nbsp;&nbsp; 
  MPI_Comm_disconnect(&amp;newcomm);<BR>&nbsp;&nbsp;&nbsp; 
  MPI_Finalize();<BR>}<BR><BR>#################### client 
  ###################<BR><BR>&nbsp;You can do more sophisticated stuff by 
  writing the port to a file etc (Unfortunately publishing and lookingup names 
  won't work with smpd for now).<BR>&nbsp;As long as you use SMPD as the process 
  manager (default on windows &amp; configure with "--with-pm=smpd" on unix) 
  &amp; make sure that all the machines have the same data model (eg: same 
  architecture) you should be 
  fine.<BR><BR>Regards,<BR>Jayesh<BR><BR>-----Original Message-----<BR>From: 
  mpich-discuss-bounces@mcs.anl.gov [<A 
  href="mailto:mpich-discuss-bounces@mcs.anl.gov">mailto:mpich-discuss-bounces@mcs.anl.gov</A>] 
  On Behalf Of Hiatt, Dave M<BR>Sent: Thursday, December 04, 2008 10:52 
  AM<BR>To: mpich-discuss@mcs.anl.gov<BR>Subject: [mpich-discuss] Suggestions 
  solicited<BR><BR>My topology is as follows; I have my MPI cluster on pile of 
  Linux workstations, I have network access from an AIX server and from a bunch 
  of Windows workstations.&nbsp; Right now to trigger a run, I have to Rlogin to 
  the node 0 Linux box and run mpiexec to start.&nbsp;<BR><BR>My plan is to 
  convert the parallel application into a "service" hanging blocking recv 
  message with the material calculation details for the next set of 
  calculations.&nbsp;<BR><BR>The idea would be to let the cluster receive 
  requests from any of the Windows work stations.&nbsp;<BR><BR>My first idea, 
  was to have a workstation become part of the cluster in a special 
  communicator, that is start a process, MPI::INIT, send a message to node 0 
  with the calculation data, and Finalize, and cease execution.&nbsp; Then later 
  return repeat the steps and retrieve results.&nbsp; But it was pointed out to 
  me that the only official method that can operate after MPI::Finalize is run 
  is MPI::Finalized, I wondered if the following is possible.<BR><BR>If the 
  process on the workstation that I propose to be volatile runs, and terminates 
  and a new process comes back to request the results, is that within the bounds 
  of the standard and a supported approach?<BR><BR>Also, as long as the hardware 
  the Linux and Windows workstations are running on are the same "Endian", would 
  this still be considered a homogenous MPI cluster, or is there any issue 
  between Windows and Linux?&nbsp;<BR><BR>How in general do others approach 
  this, that being, allowing workstations send in new requests for runs and 
  later come back and retrieve the results.<BR><BR><BR>If you lived here you'd 
  be home by now<BR>Dave Hiatt<BR>Manager, Market Risk Systems Integration 
  CitiMortgage, Inc.<BR>1000 Technology Dr.<BR>Third Floor East, M.S. 
  55<BR>O'Fallon, MO 63368-2240<BR><BR>Phone:&nbsp; 636-261-1408<BR>Mobile: 
  314-452-9165<BR>FAX:&nbsp;&nbsp;&nbsp; 
  636-261-1312<BR>Email:&nbsp;&nbsp;&nbsp;&nbsp; 
  Dave.M.Hiatt@citigroup.com<BR><BR><BR><BR></FONT></P></BLOCKQUOTE></BODY></HTML>