MPI死锁(消息传递接口)

时间:2014-01-30 09:56:57

标签: mpi

我是MPI编码的初学者,我尝试使用简单的二维数组传递消息,将过程分为两个过程元素......但代码卡在消息传递中...代码如下...我编辑为发送和接收订单

#include<stdio.h>
#include<mpi.h>

double a[15][15];

int main(int argc, char **argv)
{
    int process_id,nprocess;
    int i,j;
    int Nxl=5,Nx=10,Ny=10;
    MPI_Status status;
    MPI_Datatype line;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&nprocess);
    MPI_Comm_rank(MPI_COMM_WORLD,&process_id);
    //Nxl=((Nx-2)/nprocess)+2;
    //printf("NXL=%d\n",Nxl);
    //  printf("process_id=%d\n",process_id);
    if(process_id==0)
    {
        for(i=1;i<=5;i++)
        {
            for(j=1;j<=Ny;j++)
            {
                a[i][j]=3*2*i;
                MPI_Send(&a[Nxl-1][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD);
            }
        }
        for(i=1;i<=5;i++)
        {
            for(j=1;j<=Ny;j++)
            {
                printf("matrices=%f\n",a[i][j]);
                MPI_Recv(&a[1][j],1,MPI_DOUBLE,1,1,MPI_COMM_WORLD,&status);
                printf("PROCESS_ID=%d\n",process_id);
            }
        }
    }
    if(process_id==1)
    {
        for(i=6;i<=10;i++)
        {
            for(j=1;j<Ny;j++)
            {
                a[i][j]=4*2;
                MPI_Send(&a[2][j],1,MPI_DOUBLE,1,2,MPI_COMM_WORLD);
            }
        }
        for(i=6;i<=10;i++)
        {
            for(j=1;j<Ny;j++)
            {
                MPI_Recv(&a[Nxl][j],1,MPI_DOUBLE,0,1,MPI_COMM_WORLD,&status);
                printf("PROCESS_ID=%d\n",process_id);
            }
        }
    }
    MPI_Finalize();
}

2 个答案:

答案 0 :(得分:2)

你正在让对话中的两个参与者说话,然后听。你需要做到这一点,所以一个人说话,另一个人听,然后反过来。

答案 1 :(得分:1)

(我打算写下这个答案,就好像你有两个以上的过程对后代更为一般,但你可以把它重新解释为仅仅两个。)

Hristo和John是对的。问题是所有进程都在收到任何人之前发送消息。这意味着发送可能永远不会返回。不知何故,你需要确保接收也可用。您可以通过以下两种方式之一完成此操作:

将阻止调用转换为非阻止

如果您将阻止(MPI_SEND / MPI_RECV)调用转换为非阻塞调用,并在代码末尾添加MPI_WAITALL,那么所有进程都可以同时发送和接收消息。然后在waitall之后,你可以对你收到的数据做任何你想做的事情。

MPI_SEND / MPI_RECV转换为MPI_SENDRECV

此选项与您同时执行发送和接收的结果基本相同,但您仍需要小心确保每个人都使用相同的进程进入交换。例如,如果你让每个人都试图在一个环中进行通信,你需要确保它们都发送到右边并从左边接收(反之亦然)而不是同时发送和接收到对(这仍然是一个僵局)。