MPI在循环中连续发送和接收消息

MPI在循环中连续发送和接收消息,mpi,Mpi,我试着做一个程序,进程0应该开始初始化发送消息到一个随机进程而不是它自己,然后所选的随机进程应该接收消息并发送到另一个随机进程。这应该一直发生,直到完成用户作为输入给出的要发送的请求消息数为止。我看到我的程序要么以最大值2发送消息,要么甚至没有发送消息,并给出以下错误 **其中一个进程终止得很糟糕:清理 应用程序使用退出字符串终止:终止(信号15) ** 这是我的代码,让我知道里面的漏洞是什么。随机生成部分不包括在内,工作正常 if(rank==0) { rnum=rgenerator(rank

我试着做一个程序,进程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;
    }

您应该确保发送和接收操作的数量相同。在代码中,发送操作比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);
    }

您应该确保发送和接收操作的数量相同。在代码中,发送操作比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);
    }