2014-01-30 75 views
0

我是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(); 
} 
+1

MPI_Sendrecv是你最好的朋友。 –

回答

1

(我打算写这个答案,如果你有两个以上的过程中要为子孙后代更普遍的,但你可以重新解释它的意思是只有两个。)

斯托伊奇和约翰是正确的。问题在于你的所有进程在任何人收到消息之前都会发送消息。这意味着发送可能永远不会返回。不知何故,你需要确保收件人也可用。为此,您可以通过以下两种方法之一:如果您转换

转换阻塞调用非阻塞

您阻塞(MPI_SEND/MPI_RECV)调用非阻塞的呼叫,并在结尾处添加一个MPI_WAITALL的代码,这将允许所有进程同时发送和接收消息。然后在等待之后,您可以对您收到的数据做任何事情。

转换MPI_SEND/MPI_RECVMPI_SENDRECV

这个选项本质上具有了相同的结果,你会做的发送和同时接收,但你仍然需要小心,以确保每个人都进入与交流相同的过程。例如,如果每个人都试图在一个环中进行沟通,则需要确保他们都发送到右侧并从左侧接收(反之亦然),而不是同时发送和接收正确的(这仍然是一个僵局)。

2

您正在使对话的两个参与者都说话,然后听。你需要做到这一点,所以一个人说话,另一个听,然后是相反的。

+0

即使在编辑并独立发送和接收之后,dint帮助 – Ankit

+0

您是否能够运行一个简单的MPI程序?一个在一个进程中只发送一次并在另一个进程中接收? –