2012-03-06 83 views
0

我正在做一個使用C和MPI的應用程序,通過矩陣乘法產生一個向量,但是我一直有錯誤發佈readv等錯誤,並且現有連接被強制關閉遠程主機(10054) 下面是代碼:一個現有的連接被遠程主機強制關閉 - MPI

#include "stdio.h" 
#include "mpi.h" 

#define W 5 
#define H 5 

void make_matrix(int[]); 
void make_vector(int []); 

void main(int argc, char* argv[]) 
{ 

    int myrank,size,k; 
    int matrix[H*W]; 
    int vec[W]; 
    int res[W]; 
    static int col_count = 0; 

    MPI_Init(&argc,&argv); 
    MPI_Comm_rank(MPI_COMM_WORLD,&myrank); 
    MPI_Comm_rank(MPI_COMM_WORLD,&size); 

    MPI_Bcast(vec,W,MPI_INT,0,MPI_COMM_WORLD); 

    if(myrank != 0) 
    { 
    for(k=0; k<W; k++) 
    { 
     vec[k]+= matrix[k*W+col_count]; 
    } 
    col_count++; 
    printf("%d ",vec[col_count]); 
    } 

    MPI_Finalize(); 
} 

void make_matrix(int a[]) 
{ 
    int i; 
    for(i=0; i<H*W; i+=1) 
    { 
    a[i] = i; 
    } 
}; 

void make_vector(int v[]) 
{ 
    int i; 
    for(i=0; i<H; i++) 
    v[i] = i*2; 
}; 

回答

1

MPI_Bcast()集體功能,這意味着,在每一個通信進程必須調用它。換句話說,不要撥打MPI_Recv()。所以擺脫你的if(myrank == 0)條件,並有所有進程調用:

MPI_Bcast(vec,W,MPI_INT,0,MPI_COMM_WORLD); 

請注意,我有vec以上,不&vec;由於vec已經是一個數組,它是MPI需要的指針。此外,您的結果將出現在非root用戶進程上的vec;不需要單獨的arr陣列。

我建議你閱讀一些MPI的例子,並試着讓你的代碼看起來更像他們。

+0

謝謝你的回答,我做了你告訴我的,但我沒有錯誤,但答案是不正確的。我刪除了MPI_Bcast有條件的myrank,但是在計算值時我使用了...是否正確?我將編輯上面的代碼.... – mahmoud 2012-03-06 20:11:10

+0

@mahmoud我不確定你想要完成什麼。我的答案解決了您的溝通錯誤。你的代碼中可能有很多其他問題,但我不知道你的目標是什麼;這是一個完全不同的問題。 – chrisaycock 2012-03-06 20:22:14

+0

還有一個關於溝通的問題,是否正確地處理了除了根之外的所有處理單元所做的任何計算,還是應該涉及到根? – mahmoud 2012-03-06 20:38:08

相關問題