循环不断发送/接收消息

问题描述 投票:0回答:1

我正在尝试编写一个程序,其中进程0应该开始初始化向除自身之外的随机进程发送消息,然后选择的随机进程应该接收消息并发送到另一个随机进程。

这应该发生,直到完成所请求的消息数量(由用户作为输入给出)。

我发现我的程序要么最多发送 2 条消息,要么甚至不发送消息,并给出以下错误:

其中一个进程严重终止:清理 应用程序通过退出字符串终止:终止(信号 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;
    }
c mpi
1个回答
1
投票

您应该确保发送和接收操作的数量相同。

在您的代码中,发送操作比接收操作多。因此,一个进程将会崩溃。

为避免这种情况,仅当您的标志不等于 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.