Newsgroups: comp.parallel.mpi
From: Bruce Allen <ballen@dirac.phys.uwm.edu>
Subject: Re: env-variables & mpich
Organization: University of Wisconsin - Milwaukee, Physics Department
Date: Mon, 08 Jun 1998 21:58:03 -0500
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="------------1C217264529A2DC939D71A09"
Message-ID: <357CA4BA.F4E175BC@dirac.phys.uwm.edu>


--------------1C217264529A2DC939D71A09
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Manfred Krafczyk wrote:

> I wonder if there is a way that an executable started via
> mpirun -np n executablename
> can read the same environment variables that were present
> in the shell were mpirun was started.

 Here's what I use. This is called from every process, right after
startup, ie


        export_environment(node_number,"FIRST_VARIABLE");
        export_environment(node_number,"SECOND_VARIABLE");
           ...
        export_environment(node_number,"LAST_VARIABLE");

Cheers,
    Bruce Allen

/* This routine exports environment variables to the nodes */
void export_environment(int node_number,const char *name) {
  char *environment,*var;
  int length;

  /* if this is the master, get enviroment variable */
  if (node_number==0) {
    if (name==NULL) {
      fprintf(stderr,"Argument to export_environment() can't be
null!\n");
      fflush(stderr);
      MPI_Finalize();
      exit(1);

    }
    if (NULL==(var=getenv(name))) {
      fprintf(stderr,"Environment variable %s MUST be set!\n",name);
      fflush(stderr);
      MPI_Finalize();
      exit(1);
    }
    /* calculate the length of the string to pass */
    length=strlen(name)+strlen(var)+2;
  }

  /* broadcast the length of the string */
  MPI_Bcast(&length,1,MPI_INT,0,MPI_COMM_WORLD);

  /* allocate storage for the string */
  if (NULL==(environment=(char *)malloc(length))) {
    fprintf(stderr,"Export_environment() node %d couldn't allocate
memory!\n",
     node_number);
    fflush(stderr);
    exit(1);
  }

  /*  print environment variable into string */
  if (node_number==0) {
    sprintf(environment,"%s=%s",name,var);
    fprintf(stderr,"Exporting environment variable %s\n",environment);
    fflush(stderr);
  }

  /* then broadcast it to the other processes */
  MPI_Bcast(environment,length,MPI_CHAR,0,MPI_COMM_WORLD);

  /* and put it into the local environment */
  if (node_number) {
    putenv(environment);
    fprintf(stderr,"Node %d receiving environment variable %s\n",
     node_number,environment);
    fflush(stderr);
  }
  return;
}


--------------1C217264529A2DC939D71A09
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<HTML>
Manfred Krafczyk wrote:
<BLOCKQUOTE TYPE=CITE>

<P>I wonder if there is a way that an executable started via
<BR>mpirun -np n executablename
<BR>can read the same environment variables that were present
<BR>in the shell were mpirun was started.</BLOCKQUOTE>
&nbsp;Here's what I use. This is called from every process, right after
startup, ie<TT></TT>

<P><TT>&nbsp;</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export_environment(node_number,"FIRST_VARIABLE");</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export_environment(node_number,"SECOND_VARIABLE");</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; export_environment(node_number,"LAST_VARIABLE");</TT><TT></TT>

<P>Cheers,
<BR>&nbsp;&nbsp;&nbsp; Bruce Allen<TT></TT>

<P><TT>/* This routine exports environment variables to the nodes */</TT>
<BR><TT>void export_environment(int node_number,const char *name) {</TT>
<BR><TT>&nbsp; char *environment,*var;</TT>
<BR><TT>&nbsp; int length;</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /* if this is the master, get enviroment variable */</TT>
<BR><TT>&nbsp; if (node_number==0) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; if (name==NULL) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Argument to export_environment()
can't be null!\n");</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fflush(stderr);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Finalize();</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; }</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; if (NULL==(var=getenv(name))) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Environment variable
%s MUST be set!\n",name);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fflush(stderr);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPI_Finalize();</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; }</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; /* calculate the length of the string to pass
*/</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; length=strlen(name)+strlen(var)+2;</TT>
<BR><TT>&nbsp; }</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /* broadcast the length of the string */</TT>
<BR><TT>&nbsp; MPI_Bcast(&amp;length,1,MPI_INT,0,MPI_COMM_WORLD);</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /* allocate storage for the string */</TT>
<BR><TT>&nbsp; if (NULL==(environment=(char *)malloc(length))) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fprintf(stderr,"Export_environment() node %d
couldn't allocate memory!\n",</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp; node_number);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fflush(stderr);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; exit(1);</TT>
<BR><TT>&nbsp; }</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /*&nbsp; print environment variable into string */</TT>
<BR><TT>&nbsp; if (node_number==0) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; sprintf(environment,"%s=%s",name,var);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fprintf(stderr,"Exporting environment variable
%s\n",environment);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fflush(stderr);</TT>
<BR><TT>&nbsp; }</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /* then broadcast it to the other processes */</TT>
<BR><TT>&nbsp; MPI_Bcast(environment,length,MPI_CHAR,0,MPI_COMM_WORLD);</TT>
<BR><TT>&nbsp;</TT>
<BR><TT>&nbsp; /* and put it into the local environment */</TT>
<BR><TT>&nbsp; if (node_number) {</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; putenv(environment);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fprintf(stderr,"Node %d receiving environment
variable %s\n",</TT>
<BR><TT>&nbsp;&nbsp;&nbsp;&nbsp; node_number,environment);</TT>
<BR><TT>&nbsp;&nbsp;&nbsp; fflush(stderr);</TT>
<BR><TT>&nbsp; }</TT>
<BR><TT>&nbsp; return;</TT>
<BR><TT>}</TT>
<BR>&nbsp;</HTML>

--------------1C217264529A2DC939D71A09--


