Archives


- Beowulf
- Beowulf Announce
- Scyld-users
- Beowulf on Debian

[Beowulf] MPI synchronization problem

Many of your questions may have already been answered in earlier discussions or in the FAQ. The search results page will indicate current discussions as well as past list serves, articles, and papers.

Search

Michel Dierks m.dierks at skynet.be
Sun Nov 12 17:35:57 PST 2006


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_Wait(&request_recvd,&status);
> 		/*
>                 some calculation
>                */
>             
>             /* send  buffer_sendi  to master */
>         
>             MPI_ISend(buffer_sendi,MAX_INT,MPI_INT,0,tag,MPI_COMM_WORLD);
> 	    MPI_Wait(&request_recvd,&status);
>             }
>            
>         }while(buffer_recvd[0]!=-99.00);
> Thanks for your help.
>
>   




More information about the Beowulf mailing list