2017-02-06 5 views
1

を受けながら:上記の罰金numberCounterは(〜1000年)が小さいことを提供した作品MPI_RECVハング私はMPIコードの非常にシンプルな作品といくつかの奇妙な行動気づい大きな配列

#include <mpi.h> 

int main(int argc, char* argv[]) 
{ 
    // Initialize the MPI environment 
    MPI_Init(NULL, NULL); 

    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 

    // We are assuming at least 2 processes for this task 
    if (world_size != 2) 
    { 
     std::cout << "World size must be equal to 1" << std::endl; 
     MPI_Abort(MPI_COMM_WORLD, 1); 
    } 

    int numberCounter = 10000; 
    double number[numberCounter]; 

    if (world_rank == 0) 
    { 
     std::cout << world_rank << std::endl; 
     MPI_Send(number, numberCounter, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); 
    } 
    else if (world_rank == 1) 
    { 
     std::cout << world_rank << std::endl; 
     MPI_Recv(number, numberCounter, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    } 

    MPI_Finalize(); 
} 

を。ただし、値が大きい場合(> 10000)、コードがハングアップして終わりに達することはありません。 MPI_Iprobeを使用すると、ランク1がメッセージを受信したとフラグが立てられますが、MPI_Recvは常にハングします。

この原因は何ですか?他の誰かがこの動作を再現できますか?

答えて

0

私は2つのすぐに関わる問題を参照してください:あなたはかなり大規模な静的配列を使用している

1)。

int numberCounter = 10000; 
int number[numberCounter]; 

マシンによっては、スタックオーバーフローが発生することがあります。 Segmentation fault on large array sizes

この場合は、ダイナミックアレイを使用してください。 Cには、mallocfreeを使用してください。 C++では、私は100%ではないnewdeleteはMPI関数でうまくいくが、うまくいくはずだ。 C++では、STLコンテナ(std :: vectorなど)と連携して動作するBoost MPIライブラリの使用を検討することもできます。 MPI関数がMPI_DOUBLEタイプを使用するように指示されているのに対し、http://www.boost.org/doc/libs/1_62_0/doc/html/mpi.html

2)あなたの送信をし、受信バッファnumberは、int配列です。

MPI型は配列型と一致するので(double及びMPI_DOUBLE)又は(intMPI_INT)を使用しなければなりません。

+0

コードが不便なことは申し訳ありません。実行したコードではintでなくdouble配列を使用しています。コピー&ペーストするときに何かが見逃されました。私はvalgrindのメモリをチェックしました。 – Firefly09

関連する問題