2012-05-13 27 views
1

我正在開始使用Open MPI進行並行編程的第一步。我試圖實現的是啓動一個具有兩個進程的應用程序(這可以通過mpirun -n 2 ...來實現),並且從這兩個進程創建第一個進程都產生了它自己的另一個實例。這裏是在C++中的草圖:MPI,通過其中一個進程催生一個孩子

// mpi_spawn_cpp2.cc 
#include "mpi.h" 
#include <iostream> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int rank, size; 
    int errcode; 
    MPI::Intercomm intercomm; 

    MPI::Init(argc, argv); 

    rank = MPI::COMM_WORLD.Get_rank(); 
    size = MPI::COMM_WORLD.Get_size(); 
    cout << "world size: " << size << endl; 

    if (rank == 0) { 
     intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode); 
     cout << "intercomm size: " << intercomm.Get_size() << endl; 
    } 

    MPI::Finalize(); 
    return 0; 
} 

雖然完美編譯與上面的代碼的問題是,它似乎沒有從菌種功能,這意味着該方法是在實際上並非衍生返回。上面的代碼出現了什麼問題?爲了使其工作起來,應該糾正哪些問題?

非常感謝您的幫助。

回答

4

MPI_Comm_spawn在intracommunicator上是集體的,但你只從0級調用它,這就是爲什麼它掛起。試試這個:

intercomm = MPI::COMM_WORLD.Spawn("./mpi_spawn_cpp2", MPI::ARGV_NULL, 1, MPI::INFO_NULL, 0, &errcode); 
if (rank == 0) { 
    cout << "intercomm size: " << intercomm.Get_size() << endl; 
} 

一個忠告。由於這是您在MPI中的第一步,因此我建議您學習C綁定。 C++綁定在當前的MPI標準版本2.2中已棄用,並將從即將推出的版本3.0中完全刪除。

相關問題