2016-05-07 60 views
0

我在我的代碼中有一個錯誤。我有多個進程處理來自二叉樹的數據。最後,他們應該將結果發送到將要處理結果的主節點(節點0)。但是,由於某些原因,某些MPI_Sends沒有收到。MPI_Recv沒有收到所有的MPI_Send請求

int *output=(int*) malloc(sizeof(int)*(varNum+2)); //contains all variable values and maxSAT and assignNum 

if(proc_id!=0 && proc_id<nodeNums){ 
    output[0]=maxSAT; 
    output[1]=assignNum; 
    for(i=2;i<varNum+2;i++){ 
     output[i]=varValues[i-2]; 
    } 
    MPI_Send(output,varNum+2,MPI_INT,0,TAG,MPI_COMM_WORLD); 
    printf("proc %d sent data\n",proc_id); 
} 
else if(proc_id==0){ 
    for(i=1;i<nodeNums;i++){ 
     printf("receiving data from %d\n",i); 
     MPI_Recv(output,varNum+2,MPI_INT,i,TAG,MPI_COMM_WORLD,MPI_STATUS_IGNORE); 
     if(output[0]>maxSAT){ 
      maxSAT=output[0]; 
      assignNum=output[1]; 
      for(i=0;i<varNum;i++){ 
       varValues[i]=output[i+2]; 
      } 
     } 
     else if(output[0]==maxSAT){ 
      assignNum+=output[1]; 
     } 
    } 
} 

當我運行8個進程(nodeNums = 8)時,這是輸出。

proc 2 sent data 
receiving data from 1 
proc 5 sent data 
proc 6 sent data 
proc 3 sent data 
proc 7 sent data 
proc 1 sent data 
proc 4 sent data 

出於某種原因,所有進程都發送數據,但它是僅由1接收然而,如果我與4個的進程中運行它,一切被髮送/接收。任何人都知道爲什麼會發生這種情況

回答

2

該問題與MPI無關。你的錯誤是使用相同的變量在兩個不同但嵌套的循環:

else if(proc_id==0){ 
    for(i=1;i<nodeNums;i++){ <----------------- (1) 
     ... 
      for(i=0;i<varNum;i++){ <----------- (2) 
       varValues[i]=output[i+2]; 
      } 
     ... 
    } 
} 

內循環完成後,i的值等於varNum,如果它發生varNum大於或等於nodeNums,外環也終止。更改內部循環的循環變量的名稱。

+0

哇......這樣一個愚蠢的錯誤...謝謝:) –

1

這不是真的使用MPI的方式。你在這裏想要的是MPI_Gather(),這是所有進程(包括根)發送大量數據的地方,並且收集進程接收它們。像這樣:

rbuf = (int *)malloc(nodeNums*(varNum+2)*sizeof(int)); 
MPI_Gather(output, varNum+2, MPI_INT, rbuf, varNum+2, MPI_INT, 0, MPI_COMM_WORLD); 

所有的進程都應該在執行的同一部分執行上述操作。所有數據將以rbuf結尾。

在你的情況下,如果root不想發送任何東西,只要發送空數據,它可以簡單地忽略它(畢竟,它不需要物理地「發送」給自己,所以這是效率不高)。

+0

好的,謝謝你的提示,我會盡力的,謝謝 –