[prev in list] [next in list] [prev in thread] [next in thread] 

List:       beowulf
Subject:    Re: [Beowulf] MPI synchronization problem
From:       Michel Dierks <m.dierks () skynet ! be>
Date:       2006-11-13 22:53:31
Message-ID: 4558F76B.3060404 () skynet ! be
[Download RAW message or body]

Geoff Jacobs wrote:
> Michel Dierks wrote:
> 
> > Geoff Jacobs wrote:
> > 
> > > Michel Dierks wrote:
> > > 
> > > 
> > > > Hello,
> > > > 
> > > > I'm developing an application to calculate the Mandelbrot fractal.
> > > > 
> > > > 
> > > Hmm... I never did this when I was learning the ropes. There is a pretty
> > > example included with the mpich source code to do Mandelbrot fractals if
> > > you need something to crib from.
> > > 
> > > 
> > > 
> > > > My problem is:
> > > > 
> > > > from the master I will send to each free node for computation a message
> > > > containing the values of one screen line.
> > > > 
> > > > 
> > > I would think you can get away with transmitting just the boundaries of
> > > the section of complex plane which you will be plotting, as well as the
> > > iterative limit, color interpretation, etc. Slaves can determine what
> > > portion they must calculate from their ranks.
> > > 
> > > 
> > > 
> > > > After a time the nodes will send back the results.
> > > > 
> > > > I have see that I can use MPI_Isend and MPI_Irecv for non-blocking
> > > > communication. This give me no problem if we are talking about of one
> > > > send and one receive. But how can I handle the sending from each node to
> > > > the master without  data corruption.
> > > > Must I implement a send and a receive buffer for each node (16 nodes
> > > > means 16 buffer in and 16 out) ?
> > > > 
> > > > 
> > > The software I've implemented has tended to be rather dynamic, so it
> > > seemed easier to use discrete sends and receives. In your case, you will
> > > be calculating a vector of fixed size on each slave (one row for your
> > > resultant image per). It would be logical to use a collective
> > > communicator like MPI_Gather to automatically populate the array
> > > representing your raster image.
> > > http://csit1cwe.fsu.edu/extra_link/pe/d3a64mst07.html#HDRIGATH
> > > 
> > > 
> > > 
> > > > Can someone help me? Please
> > > > _______________________________________________
> > > > Beowulf mailing list, Beowulf@beowulf.org
> > > > To change your subscription (digest mode or unsubscribe) visit
> > > > http://www.beowulf.org/mailman/listinfo/beowulf
> > > > 
> > > > 
> > > > 
> > > Hello,
> > > it is now 2 days that I'm facing with the following problem.
> > > The master send messages to nodes (about 200 separate messages for
> > > each node).
> > > I cannot group them, I must send messages after messages to each
> > > nodes and to response to Geoff Jacobs I cannot use MPI_Gather because
> > > I must determined on which node I will send the next message ( based
> > > on list of free nodes).
> > > My send is running correctly and my receive too for the first message
> > > but not for the second. I can see that the master send the second
> > > message and that MPI_Iprobe  on the node see that a message is arrived.
> > > But after this MPI_Iprobe , MPI_IRecv doesn't work this time. Why ?? I
> > > have made some research on the mpi forum and on some other places but I
> > > cannot found a correct explanation. All example given are more talking
> > > about one send and one receive but not on multiple send and receive on
> > > more than one node. I have found the routine MPI_Request_free and test
> > > it but this one give error telling me that I have an invalid handler. 
> > > After some research again, I have found this at
> > > http://www.pdc.kth.se/training/Talks/MPI/Persistent/more.html Point 2
> > > on the page:
> > > 
> > > "When a program calls a non-blocking message-passing routine such as
> > > > MPI_Isend|, a request object is created, and then the
> > > communication is started.  These steps are equivalent to two other MPI
> > > calls, |MPI_Send_init| and |MPI_Start|.  When
> > > the program calls |MPI_Wait|, it waits until all necessary
> > > local operations have completed, and then frees the memory used to
> > > store the request object.  This second step equals a call to
> > > > MPI_Request_free|."
> > > 
> > > 
> > > > So I don't understand anymore what to do.
> > > > Can someone of you tell me clearly what I'm doing wrong? Here below
> > > > the part of my code who run on the nodes:
> > > > /*****************************
> > > > *  Parts running on node     *
> > > > *****************************/                /* Memory
> > > > Allocation to buffer_sendi and buffer_recvd */               if
> > > > ((buffer_sendi=(int *)malloc(MAX_INT * sizeof(int)))==NULL)
> > > > {
> > > > exit(1);
> > > > }
> > > > if ((buffer_recvd=(double *)malloc(MAX_DOUBLE *
> > > > sizeof(double)))==NULL)
> > > > {
> > > > exit(1);
> > > > }
> > > > /* Until receive tag with value -99 loop */
> > > > do         {               
> > > > MPI_Iprobe(0,MPI_ANY_TAG,MPI_COMM_WORLD,&flag,&status_recvd);
> > > > if (flag==1)
> > > > {
> > > > /* Reception from master */
> > > > 
> > > > MPI_IRecv(buffer_recvd,MAX_DOUBLE,MPI_DOUBLE,0,tag,MPI_COMM_WORLD,&status_recvd);
> > > >  
> MPI_IRecv(buffer_recvd,MAX_DOUBLE,MPI_DOUBLE,0,status_recvd.MPI_TAG,MPI_COMM_WORLD,&request);
>  
> 
> > > > MPI_Wait(&request_recvd,&status);
> > > > 
> MPI_ISend and MPI_IRecv both take a request argument, and both do not
> take a status argument. The arguments for async comms are different than
> for sync.
> http://www.mpi-forum.org/docs/mpi-11-html/node46.html
> 
> Tag, in the case of the MPI_IRecv should be status_recvd.MPI_TAG, not tag.
> 
> 
> > > /*
> > > some calculation
> > > */
> > > /* send  buffer_sendi  to master */
> > > 
> > > MPI_ISend(buffer_sendi,MAX_INT,MPI_INT,0,tag,MPI_COMM_WORLD);
> > > 
> Here, tag can be anything. You do need a request variable, as noted above.
> 
> 
> > > MPI_Wait(&request_recvd,&status);
> > > }
> > > }while(buffer_recvd[0]!=-99.00);
> > > Thanks for your help.
> > > 
> > > 
> 
> 
Hello,

Geoff , many thanks, my communications are working "picco bello"!

Have a nice day
_______________________________________________
Beowulf mailing list, Beowulf@beowulf.org
To change your subscription (digest mode or unsubscribe) visit \
http://www.beowulf.org/mailman/listinfo/beowulf


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic