2012-03-06 18 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)を取り除くと、すべてのプロセスが呼び出している:私は上記のvec、ない&vecを持って

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

注意。 vecは既に配列であるため、MPIに必要なポインタです。また、結果は非rootプロセスのvecに表示されます。個別のarr配列は必要ありません。

私は、MPIのいくつかの例を読んで、あなたのコードをそれらのように見せることをお勧めします。

+0

お返事ありがとうございます、私はあなたに私に言ったことをした、私はエラーがなかった、しかし、答えは正しくありません。私はMPI_Bcastのmyrank条件を削除しましたが、値を計算するときに使用しました...それは正しいですか?私は上記のコードを編集します.... – mahmoud

+0

@mahmoud私はあなたが達成しようとしているか分かりません。私の答えはあなたのコミュニケーションエラーを解決します。あなたのコードには他にも多くの問題があるかもしれませんが、あなたの目標が何であるか分かりません。それはまったく異なる質問です。 – chrisaycock

+0

ちょうど1つの質問、通信について、ルートを除いてすべての処理単位で何をしているのかを処理するのは正しいですか? – mahmoud

関連する問題