Thanks Eugene!

My case, after simplified, is to speed up the time-consuming computation in the 
loop below by assigning iterations to several nodes in a cluster by MPI. Each 
iteration of the loop computes each element of an array. The computation of 
each element is independent of others in the array.

     int main(int argc, char ** argv)   
     {   
     // some operations           
     f(size);           
     // some operations         
     return 0;   
     }   

     void f(int size)   
     {   
     // some operations         
     int i;           
     double * array =  new double [size];           
     for (i = 0; i < size; i++) // need to speed up by MPI.
     {   
     array[i] = complicated_computation(); // time consuming    
     }           
     // some operations using all elements in array           
     delete [] array; 
     }

--- On Thu, 1/28/10, Eugene Loh <eugene....@sun.com> wrote:

> From: Eugene Loh <eugene....@sun.com>
> Subject: Re: [OMPI users] speed up this problem by MPI
> To: "Open MPI Users" <us...@open-mpi.org>
> Date: Thursday, January 28, 2010, 8:31 PM
> Tim wrote:
> 
> > Thanks, Eugene.
> > 
> > I admit I am not that smart to understand well how to
> use MPI, but I did read some basic materials about it and
> understand how some simple problems are solved by MPI. 
> > But dealing with an array in my case, I am not certain
> about how to apply MPI to it. Are you saying to use send and
> recieve to transfer the value computed for each element from
> child process to parent process?
> > 
> You can, but typically that would entail too much
> communication overhead for each element.
> 
> > Do you allocate a copy of the array for each process?
> >  
> You can, but typically that would entail excessive memory
> consumption.
> 
> Typically, one allocates only a portion of the array on
> each process.  E.g., if the array has 10,000 elements
> and you have four processes, the first gets the first 2,500
> elements, the second the next 2,500, and so on.
> 
> > Also I only need the loop that computes every element
> of the array to be parallelized.
> > 
> If you only need the initial computation of array elements
> to be parallelized, perhaps any of the above strategies
> could work.  It depends on how expensive the
> computation of each element is.
> 
> > Someone said that the parallel part begins with
> MPI_Init and ends with MPI_Finilize,
> > 
> Well, usually all processes are launched in parallel. 
> So, the parallel begins "immediately."  Inter-process
> communications using MPI, however, must take place between
> the MPI_Init and MPI_Finalize calls.
> 
> > and one can do any serial computations before and/or
> after these calls. But I have wrote some MPI programs, and
> found that the parallel part is not restricted between
> MPI_Init and MPI_Finilize, but instead the whole program. If
> the rest part of the code has to be wrapped for process with
> ID 0, I have little idea about how to apply that to my case
> since the rest part would be the parts before and after the
> loop in the function and the whole in main().
> > 
> I don't understand your case very clearly.  I will
> take a guess.  You could have all processes start and
> call MPI_Init.  Then, slave processes can go to sleep,
> waking occasionally to check if the master has sent a signal
> to begin computation.  The master does what it has to
> do and then sends wake signals.  Each slave computes
> its portion and sends that portion back to the master. 
> Each slave exits.  The master gathers all the pieces
> and resumes its computation.  Does that sound right?
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 




Reply via email to