2011-10-31 77 views
1

以及我正在尝试执行一个程序,其中进程0应该开始将消息发送到除本身之外的随机进程的初始化,那么选择的随机进程应该接收消息并发送到另一个随机过程。这应该发生,直到请求发送的消息数量完成,这是用户输入的。我看到我的程序要么发送消息在最大2或甚至没有,并给我以下错误MPI连续发送和接收循环中的消息

**其中一个过程停止:清理 终止的应用程序退出字符串:终止(信号15 )

**

这里是我的代码,还是让我知道什么是其中的漏洞。不包括随机生成部分,这是工作正常

if(rank==0) 
{ 
rnum=rgenerator(rank,size); 
string++; 
MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
printf("\n process %d sends message to process %d",rank, rnum); 

//MPI_Recv(&flag, 100, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 

} 

    while(flag!=1) 
    { 

    if(MPI_Recv(&string, 50, MPI_INT, MPI_ANY_SOURCE, rank, MPI_COMM_WORLD, &status)==MPI_SUCCESS) 
    { 

     printf("\n process %d receives message from process %d count : %d",rank, status.MPI_SOURCE, string); 
     rnum=rgenerator(rank,size); 
     printf("\n Random num generated is %d",rnum); 
     string=string+1; 
     MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
     count++; 

     printf("\n process %d sends message to process %d", rank, rnum); 

     //MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD); 
     if(string==n) 
     { 
      printf("\n\n Messages reached"); 
      flag=1; 

     } 

    } 
    else 
     flag=0; 
    } 

回答

1

你应该确保你有相同数量的发送和recv操作。在你的代码中,你需要一个发送操作比你有recv操作。因此一个进程会崩溃。

为了避免这种情况,你只需要发送,如果你的标志不等于1:

//MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
    count++; 

    printf("\n process %d sends message to process %d", rank, rnum); 

    //MPI_Bcast(&count, 40, MPI_INT, rank, MPI_COMM_WORLD); 
    if(string==n) 
    { 
     printf("\n\n Messages reached"); 
     flag=1; 

    } 
    if(flag!=1){//make sure that you need to send one message. 
     MPI_Send(&string, 50, MPI_INT, rnum, rnum, MPI_COMM_WORLD); 
    }