1

異なるクラスター ノードでいくつかのプロセスを開始するだけの MPI プログラムを作成する必要があります。これは私のサンプルコードです。

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]) {
    int rank, size, nodenamesize;
    char nodename[100];

    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Get_processor_name(nodename, &nodenamesize);

    printf("Hello world! I am %d of %d running on %s\n", rank, size, nodename);

    if (rank == 0) {
        system("./Longwait&");
    } else if (rank == 1) {
        system("./AnotherLongWait&");
    }

    MPI_Finalize();
    return 0;
}

プロセスは正常に開始されますが、MPI アプリケーションは終了しません。MPI_Finalize() が呼び出された後も待機します。

このコードの何が問題になっていますか? MPI プログラムが他のアプリケーションを起動するだけで、何も待たないようにするにはどうすればよいですか。

よろしくお願いします、ロボ。

4

1 に答える 1

2

遅延の原因は、I/O リダイレクトを提供するために Open MPI が使用するメカニズムです。ヒント:system("ls -l /proc/self/fd");またはsystem("lsof -c lsof");を使用して、 によって生成された子プロセスで開いているファイル記述子の数を把握しますsystem(3)Longwaitこれらの記述子は両方によって開かれたままAnotherLongWaitになり、MPI ランタイムはそれらが完了するまで待機します。

の 2 つの非常に単純なサンプル バージョンを含む単純な例を次に示しますLongwait

バージョン 1: 1 分間スリープする

#include <unistd.h>

int main (void)
{
    sleep(60);
    return 0;
}

このプログラムを でスポーンする場合、/も終了system("./Longwait&");する前に、最初に終了するまで待つ必要があります。mpirunmpiexec

バージョン 2: スリープする前に最初の 20 個のファイル記述子を盲目的に閉じる

 #include <unistd.h>

 int main (void)
 {
     int i;

     for (i = 0; i < 20; i++)
         close(i);
     sleep(60);
     return 0;
 }

以前のようにこのプログラムを生成すると、mpirun/mpiexec実行可能ファイルは、MPI プログラムが待機せずに終了した直後に終了します。

現在、これは実際の解決策ではありません。開いているファイル記述子をランダムに閉じると、予測できない影響が生じる可能性があります。どの記述子を閉じる必要があるかを見つけることは、簡単でも移植可能でもありません。私は通常、コードで行うことをしないようにアドバイスします。また、Open MPI は、InfiniBand 相互接続 (舞台裏でsystem(3)使用) を使用するシステムでのプロセス分岐を確実にサポートしません。fork(2)

于 2012-06-11T15:53:37.697 に答える