2011-05-11 9 views
0

コードを使用してC++でコードをコンパイルしようとしています:https://stackoverflow.com/questions/5953979/sending-and-receiving-array-using-mpi-part-2MPIをコンパイル中にエラーが発生しました

私はコンパイルする次のコマンドを使用します。mpiicpc -o <filename> xxxx.cc -lmpi

私がコンパイルした後、すべての私のエラーが出力値を印刷し、MPI IsendとMPI Irecvを行うために、私は私のソースコードで定義された2つの関数を参照するように見えます。関数呼び出しの引数が少なすぎます:MPI_Isend/MPI_IrecvMPI Waitall(); 最後に、それがこのメッセージに存在します。コンパイルはXXXXのため中止されまし識別子「変数」は未定義

  • エラーです。具体的には、私は2種類のエラー

    1. エラーを取得します.cc(コード2)。

    変数を定義するときに間違っていなければならないことを指摘してください。ここで

    は私のソースコードの抜粋である(その全体のコードはhttps://stackoverflow.com/questions/5953979/sending-and-receiving-array-using-mpi-part-2で入手できます):

    int main (int argc, char *argv[]) 
    { 
    int my_rank; 
    int p; 
    int source; 
    int dest; 
    int tag = 0; 
    
    //Allocating Memory 
    double *A = new double[Rows*sizeof(double)]; 
    double *B = new double[Rows*sizeof(double)]; 
    .... 
    .... 
    .... 
    
    //MPI Commands 
    MPI_Status status; 
    MPI_Init (&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &p); 
    
    //For number of beats 
    
    for (ibeat=0;ibeat<beats;ibeat++) 
    { 
        for (i=0; i<Cols/2; i++) 
        { 
         for (y=0; y<Rows/2; y++) 
         { 
          if (my_rank == 0) 
           if (i < 48) 
            if (y<48) 
             V[i][y] = 0; 
    
          if (my_rank == 
           ..... 
           .... 
            ....   
         } 
        } 
    
        //Load the Array with the edge values 
        for (r=0; r<Rows/2; y++) 
        { 
         if ((my_rank == 0) || (my_rank == 1)) 
         { 
          A[r] = V[r][48]; 
          BB[r] = V[r][48]; 
         } 
    
         if ((my_rank 
          ... 
          ... 
        } 
    
        prttofile(); 
        outputpass(); 
        ibeat = ibeat+1; 
    } 
    
    MPI_Finalize(); 
    } 
    
    
    void prttofile() 
    { 
    for (i = 0; i<Cols/2; i++) 
        { 
        for (y = 0; y<Rows/2; y++) 
        { 
         if (my_rank == 0) 
          fout << V[i][y] << " " ; 
         .... 
          .... 
        } 
        } 
    
    if (my_rank == 0) 
        fout << endl; 
    .... 
    } 
    
    
    void outputpass() 
    { 
    int test = 2; 
    if ((my_rank%test) == 0) 
    { 
        MPI_Isend(C, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD); //Non blocking Send 
        MPI_Irecv(CC, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD, &status); //Non Blocking Recv 
    } 
    else if ((my_rank%test) == 1) 
    .... 
    .... 
    
    MPI_Waitall(); 
    } 
    
  • 答えて

    1

    MPI_Isend()は、あなたが提供したものよりも多くの引数を必要とします。あなたのラインは次のとおりです:

    MPI_Isend(C, Rows, MPI_DOUBLE, my_rank+1, MPI_COMM_WORLD); 
    

    タグはどこですか?リクエストはどこですか?

    同様に、MPI_Waitall()には引数がまったくありません。リクエストの配列、リクエストの数、ステータスの配列が必要です。

    私は、MPIで非ブロッキング通信の例を読むことをお勧めします。

    2
    1. は、あなたは多くの変数を宣言していない - 特にループカウンタ。あなたの機能の上にそれらをすべて宣言すれば、あなたは大丈夫でしょう。

    2. the documentationによると、MPI_Isend()のシグネチャは次のとおりです。

      int MPI_Isend(void *buf, int count, MPI_Datatype datatype, int dest, 
           int tag, MPI_Comm comm, MPI_Request *request) 
      

      それは7つのパラメータました - あなたが唯一の5つの引数を渡しています。それを修正する必要があります。 MPI_Irecv()も同様です。

    +1

    こんにちはCarlさん、ありがとうございます。 (1)関数内で宣言しなければならないのですか?私はメインの中にそれらを宣言することは、まだそれらをグローバル変数としてレンダリングすると思った。 (2)ありがとう! (3)prttofile()とoutputpass()を指定する2つの関数は、main()ルーチン内では定義されていません。私はちょうどmainの中からこれらの関数を呼び出します。エラーの行番号は、私がmainから参照する関数を指しているようです。私を訂正してください。ありがとう! – Ashmohan

    +1

    @Ashmohan変数は* all *関数の外で定義されたときのみグローバルです。 'main()'の変数は 'main()'に対してローカルです。 – chrisaycock

    +0

    @Ashmohan - 1:適切な範囲で宣言する必要があります。グローバル(「main」を含む*任意の関数の外)またはローカル(使用する関数内)。 3:私は何かを誤読していた - 心配しないで! –

    関連する問題