[Beowulf] MPI synchronization problem

Michel Dierks m.dierks at skynet.be
Mon Nov 13 14:53:31 PST 2006


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 at 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



More information about the Beowulf mailing list