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

时间:2011-10-31 03:48:27

标签: mpi

我正在尝试做一个程序,其中进程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;
    }

1 个答案:

答案 0 :(得分:1)

您应确保具有相同数量的send和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);
    }