1

私は、Open MPI を使用した並列プログラミングの世界で最初の一歩を踏み出しています。私が達成しようとしているのは、2 つのプロセス (これは mpirun -n 2 ... で達成できます) でアプリケーションを開始し、これらの両方から最初のプロセスを作成して、それ自体の別のインスタンスを生成することです。C++ でのスケッチは次のとおりです。

// 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;
}

問題なくコンパイルされますが、上記のコードの問題は、Spawn 関数から返されないように見えることです。これは、プロセスが実際には生成されていないことを意味します。上記のコードの何が問題で、動作させるには何を修正する必要がありますか?

よろしくお願いいたします。

4

1 に答える 1

4

MPI_Comm_spawnはイントラコミュニケータを介して集合的ですが、ランク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から完全に削除されます。

于 2012-05-13T08:48:54.973 に答える