2017-09-22 10 views
0

マスタスレーブアルゴリズムを実行するプログラムを実装しており、マスタスレーブジョブは実行パラメータによって決定されます。たとえば :複数の実行ファイルを実行するMPI通信

mpirun -oversubscribe -tag-output -np 1 BioNetFit2 -a load -c parabolaA_272002678.sconf : -oversubscribe -tag-output -np 4 BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf

この場合、マスターはこの部分を実行します:./BioNetFit2 -a load -c parabolaA_272002678.sconf

そして奴隷はこの部分を実行します:./BioNetFit2 -t particle -p 0 -a run -c parabolaA_272002678.sconf

そして、これは私が初期化しています方法ですコミュニケーションの世界:

cout << "Detected BNF2mpi in Pheromones init()" << endl; 
    MPI_Init(NULL, NULL); 
    // Get the number of processes 
    int world_size; 
    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
    cout << "Defined mpi environment" << endl; 
    // Get the rank of the process 
    int world_rank; 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    cout << "My rank is " << world_rank << "and I have just started." << endl; 

私の問題はマスターはメッセージを送信し、スレーブはそれを受信せず、逆も同様です。

すべてのソースコードはここに提供されています:https://github.com/raqueldias/testing_rep これは大規模なプログラムであり、それは私の仕事は、MPIにブースト-MPIから分散型のメッセージパッシング機能を変換することで、別の人によってブースト-MPIで最初に実装されました。

最初の非常に基本的な質問は次のとおりです。プログラムを2つの部分で実行すると、プロセスがデフォルトで正常に通信できるか、通信を行うために別の構成を指定する必要がありますか?

+0

質問に送信/受信部分を投稿してください。それが原因であるかどうかは不明です。私たちがチェックできるようにもっとコードを入れてください。 –

+0

ソースコード全体をアップロードしました。 – RDlady

答えて

0

このプロセスのハングアップの問題は、mpirunの実行で複数のプログラムや複数のインスタンスを実行することとは関係がないことがわかりました。

私はMPI_Iprobeが動作する方法を誤解しました。これは、プロセスがハング作っていた

while (1) { 
      //std::cout << "rcv loop" << std::endl; 
      serializedMessage.resize(1000); 
      usleep(10000); 
      MPI_Status status; 
      int flag = 0; 

      while(!flag){ 
        MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status); 
      } 
if (flag) { 
     //receive code here 
      } 

} ...

:これは私が前にそれを実装する方法です。プログラムを動作させる正しい実装方法は次のとおりです。

while (1) { 
       //std::cout << "rcv loop" << std::endl; 
       serializedMessage.resize(1000); 
       usleep(10000); 
       MPI_Status status; 
       int flag = 0; 

       MPI_Iprobe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &flag, &status); 

       if (flag==1) { 
        //do something here 
    } 

} 
関連する問題