Ups, I edited the code to make it easier to understand but I forgot to change two p2, sorry ^^' .
I hope this one is completely right:

1: for(int p1=0; p1<np; ++p1) {
2: for(int p2=0; p2<np; ++p2) {
3: if(me==p1) {
4: if(sendSize(p2)) MPI_Ssend(sendBuffer[p2],sendSize(p2),MPI_FLOAT,p2,0,myw);  //processor p1 sends data to processor p2
5: if(recvSize(p2)) MPI_Recv(recvBuffer[p2],recvSize(p2),MPI_FLOAT,p2,0,myw,&status);  //processor p1 receives data to processor p2
6: } else if(me==p2) {
7: if(recvSize(p1)) MPI_Recv(recvBuffer[p1],recvSize(p1),MPI_FLOAT,p1,0,myw,&status); //processor p2 receives data to processor p1
8: if(sendSize(p1)) MPI_Ssend(sendBuffer[p1],sendSize(p1),MPI_FLOAT,p1,0,myw); //processor p2 sends data to processor p1
9: }
10: MPI_Barrier(myw);
11: }
12: }

This is the real code:

for(int p1=0; p1<mpiS; ++p1) {
for(int p2=0; p2<mpiS; ++p2) {
if(mpiR==p1) {
sento=p2;
if(s.getMem(sento)){
if(ite>25) cout<<"p1("<<p1<<") enviar "<<sento<<" "<<s.getMem(sento)<<" FLOATS "<<endl;
ok=MPI_Ssend(s.extractBuffer(sento),s.getMem(sento),MPI_FLOAT,sento,0,myw);
if (ok!=MPI_SUCCESS)  cout<<"p1("<<p1<<") enviar "<<sento<<" "<<s.getMem(sento)<<" PROBLEMS "<<ok<<endl;
}
if(r.getMem(sento)) {
if(ite>25) cout<<"p1("<<p1<<") recibir "<<sento<<" "<<r.getMem(sento)<<" FLOATS "<<endl;
ok=MPI_Recv(r.extractBuffer(sento),r.getMem(sento),MPI_FLOAT,sento,0,myw,&status);
if (ok!=MPI_SUCCESS) cout<<"p1("<<p1<<") recibir "<<sento<<" "<<r.getMem(sento)<<" PROBLEMS "<<ok<<endl;
}
} else if(mpiR==p2) {
sento=p1;
if(r.getMem(sento)) {
if(ite>25) cout<<"p2("<<p2<<") recibir "<<sento<<" "<<r.getMem(sento)<<" FLOATS "<<endl;
ok=MPI_Recv(r.extractBuffer(sento),r.getMem(sento),MPI_FLOAT,sento,0,myw,&status);
if (ok!=MPI_SUCCESS) cout<<"p2("<<p2<<") recibir "<<sento<<" "<<r.getMem(sento)<<" PROBLEMS "<<ok<<endl;
}
if(s.getMem(sento)){
if(ite>25) cout<<"p2("<<p2<<") enviar "<<sento<<" "<<s.getMem(sento)<<" FLOATS "<<endl;
ok=MPI_Ssend(s.extractBuffer(sento),s.getMem(sento),MPI_FLOAT,sento,0,myw);
if (ok!=MPI_SUCCESS)  cout<<"p2("<<p2<<") enviar "<<sento<<" "<<s.getMem(sento)<<" PROBLEMS "<<ok<<endl;
}
}
MPI_Barrier(myw);
}
}

Thanks Eduardo

On Fri, 2012-05-04 at 14:58 +0200, Eduardo Morras wrote:
At 11:52 04/05/2012, you wrote:
>Hi all,
>
>I have a program that executes a communication loop similar to this one:
>
>1:    for(int p1=0; p1<np; ++p1) {
>2:        for(int p2=0; p2<np; ++p2) {
>3:            if(me==p1) {
>4:                if(sendSize(p2)) 
>MPI_Ssend(sendBuffer[p2],sendSize(p2),MPI_FLOAT,p2,0,myw);
>5:                if(recvSize(p2)) 
>MPI_Recv(recvBuffer[p2],recvSize(p2),MPI_FLOAT,p2,0,myw,&status);
>6:            } else if(yo==p2) {
>7:                if(recvSize(p1)) 
>MPI_Recv(recvBuffer[p1],recvSize(p1),MPI_FLOAT,p2,0,myw,&status);
>8:                if(sendSize(p1)) 
>MPI_Ssend(sendBuffer[p1],sendSize(p1),MPI_FLOAT,p2,0,myw);
>9:            }
>10:          MPI_Barrier(myw);
>11:     }
>12:   }
>
>The program is an iterative process that makes some calculations, 
>communicates and then continues with the next iteration. The problem 
>is that after making 30 successful iterations the program hangs. 
>With padb I have seen that one of the processors waits at line 5 for 
>the reception of data that was already sent and the rest of the 
>processors are waiting at the barrier in line 10. The size of the 
>messages and buffers is the same for all the iterations.
>
>My real program makes use of asynchronous communications for obvious 
>performance reasons and it worked without problems when the case to 
>solve was smaller (lower number of processors and memory), but I 
>found that for this case the program hanged and that is why a 
>changed the communication routine using synchronous communications 
>to see where is the problem. Now I know where the program hangs, but 
>I don't understand what I am doing wrong.
>
>Any suggestions?

All messages has p2 as destination. So, p1 is waiting for a message 
that hasn't been sended for him. He shouldn't be waiting any 
messages. Don't know the logic of your program, so can't tell more 
suggestions or clues.


_______________________________________________
users mailing list
users@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users



--
Aquest missatge ha estat analitzat per MailScanner
a la cerca de virus i d'altres continguts perillosos,
i es considera que está net.