2017-09-22 48 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,我的工作就是傳遞函數從boost-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 
    } 

}