2014-01-30 111 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程序?一個在一個進程中只發送一次並在另一個進程中接收? –