2013-07-08 55 views
0
//#define SIZE 3 
void master(int n,int size) 
{ 
for(int j=1;j<size;j++){ 
    MPI_Send(&n,1,MPI_INT,j,1,MPI_COMM_WORLD); 
    printf("\n Sent %d to process %d",n,j); 
    fflush(stdout); 
    } 
} 

void slave(int size) 
{ 
for(int j=1;j<size;j++){ 
    int k=0; 
    MPI_Status status; 
    MPI_Recv(&k,1,MPI_INT,0,1,MPI_COMM_WORLD,&status); 
    printf("\n Process %d has received %d",j,k); 
    fflush(stdout); 
    } 
} 

int main(int argc,char** argv) 
{ 

MPI_Init(&argc,&argv); 
int la_size; 
int rank; 
MPI_Comm_size(MPI_COMM_WORLD,&la_size); 

MPI_Comm_rank(MPI_COMM_WORLD,&rank); 

for(int i=0;i<3;i++){ 
    if(rank==0) 
     master(i,la_size); 
    else 
     slave(la_size); 

} 
MPI_Finalize(); 
printf("\nprogram finished..."); 
fflush(stdout); 
return 0; 

} 

上面的程序似乎很簡單,但它的拖延。這是一個僵局嗎? 的輸出是:爲什麼這個MPI程序失速

 Sent 0 to process 1 
Sent 0 to process 2 
Sent 1 to process 1 
Sent 1 to process 2 
Process 1 has received 0 
Process 2 has received 1 
Process 1 has received 2 
Sent 2 to process 1 
Sent 2 to process 2 
Process 1 has received 0 
Process 2 has received 1 
Process 1 has received 2 
+1

爲什麼大家發佈他們的代碼,並希望人們調試? – banarun

+0

因爲我們不明白髮生了什麼事情......工作如何。有沒有更好的方式來提出這些問題? –

回答

2

main該循環的每次迭代,秩0是做在單個發送到每個許多從站的行列,但每個從站正在發佈許多接收作爲有從屬總排名。由於沒有發送發送以匹配後來的接收,所以接收器無限期地阻塞,並且程序掛起。

+0

是的,我也曾認爲這可能是問題。但我該如何重新組織代碼?我想保留代碼的功能 –

+1

這不是關於功能。在通過外部循環的每次運行中,主機只與每個從機進行一次交互,但每個從機都嘗試與主機進行多次交互。看看你的循環結構。 – Novelocrat

+0

所以我想我應該擺脫奴隸的for循環。 –

0

由於Novelocrat的答案,正確的代碼實際上是這樣的:

#include <stdio.h> 
#include <mpi.h> 
#include <stdlib.h> 
//#define SIZE 3 

void master(int n,int size) 
{ 
    for(int j=1;j<size;j++){ 
    MPI_Send(&n,1,MPI_INT,j,1,MPI_COMM_WORLD); 
    printf("\n Sent %d to process %d",n,j); 
    fflush(stdout); 
    } 
} 

void slave(int size) 
{ 
    int k=0,rank=0; 
    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
    MPI_Status status; 
    MPI_Recv(&k,1,MPI_INT,0,1,MPI_COMM_WORLD,&status); 
    printf("\n Process %d has received %d",rank,k); 
    fflush(stdout); 

} 

int main(int argc,char** argv) 
{ 

    MPI_Init(&argc,&argv); 
    int la_size; 
    int rank; 
    MPI_Comm_size(MPI_COMM_WORLD,&la_size); 

    MPI_Comm_rank(MPI_COMM_WORLD,&rank); 

    for(int i=0;i<3;i++){ 
    if(rank==0) 
     master(i,la_size); 
    else 
     slave(la_size); 

    } 
    MPI_Finalize(); 
    printf("\nprogram finished..."); 
    fflush(stdout); 
    return 0; 

} 
+1

另外,如果你真的要給所有的從屬隊列發送一個單獨的值'n',它作爲'MPI_Bcast'而不是'MPI_Send'上的循環。 – Novelocrat

+0

是的。我目前只是編寫玩具程序來幫助我掌握MPI。 –

+0

Linux上有沒有調試環境可以發送任何有用的信息?我目前正在這裏與終端合作。如果程序掛起,我不知道它爲什麼發生。 –