-1

私は MPI を試していますが、コマンド ラインで mpirun を使用して実行すると、このエラーが発生し続けました。

----------------------------------------------------------------------------------------------
mpirun noticed that the job aborted, but has no info as to the process
that caused that situation.
----------------------------------------------------------------------------------------------

理由はわかりませんが、他の mpi プログラムは問題なく動作します。

これが私のコードです。

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

int func(int num){
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (num == 0){
        num = 5;
        MPI_Bcast(&num, 1, MPI_INT, rank, MPI_COMM_WORLD);
    }
    return num;
}

int main(int argc, char **argv){
    int rank, size;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    printf("On processor %d, func returns %d\n", rank, func(rank));
    MPI_Finalize();
    return 0;
}

プログラムはまだ同じエラーを出しています。if ステートメント内の MPI_Bcast は有効ではありませんか? ルートでないときにブロードキャストを試みても動作しますか?

4

2 に答える 2

3

このコードは意味がありません。MPI_Bcastつまり、操作が正常に完了するためには、提供されたコミュニケーター (この場合)のすべてのランクがそれを呼び出す必要があります。これは、指定された情報源があり、指定されたランクのプロセスであることを意味しますしたがって、すべてのランクが を呼び出さなければならないという要件に加えて、すべてのランクがrootに対して同じランクを提供する必要もあります。MPI_COMM_WORLDMPI_BcastMPI_Bcast

プログラムは、への引数が であるMPI_Bcast場合にのみ呼び出します。これは、ランクでのみ発生します。他のすべてのランクでは、呼び出しは行われず、単にライブラリをファイナライズして終了します。これは、使用できなくなったプロセスにメッセージを送信しようとするため、最終的には失敗し、最終的にエラーが発生します(標準では早期のローカル完了が許可されているため、「最終的に」、特にあなたの場合のような小さなメッセージでは、送信はバッファリングされます)。デフォルトでは、MPI はエラー コードを返す代わりに、ジョブを中止することでエラーを処理します。numfunc00funcMPI_BcastMPI_Bcast

条件内から MPI 集合関数を呼び出すことを妨げるものは何もありませんが、最終的にすべてのランクが集合呼び出しを行うように注意する必要があります。

あなたの正しいバージョンは次のようfuncになります。

int func(int num) {
    if (num == 0) {
        num = 5;
    }
    MPI_Bcast(&num, 1, MPI_INT, 0, MPI_COMM_WORLD);
    return num;
}

「条件内からの呼び出し」では、次のようになります。

int func(int num) {
    int rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0) {
        num = 5;
        MPI_Bcast(&num, 1, MPI_INT, 0, MPI_COMM_WORLD);
    }
    else
        MPI_Bcast(&num, 1, MPI_INT, 0, MPI_COMM_WORLD);
    return num;
}

(しかし、それは明らかに不必要です)

于 2013-01-25T13:19:24.153 に答える
3

MPI_Bcast参照ドキュメントで見られるの署名は ですint MPI_Bcast(void* buffer, int count, MPI_Datatype datatype, int root, MPI_Comm comm)。ただし、引数を 4 つしか渡していないため、最初または 2 番目の引数を忘れているようです。

あなたの場合は何ですかnum、そしてあなたのバッファは何ですか? これに対する答えはおそらくあなたの質問を解決するでしょうが、あなたのコードがコンパイルされる理由もわかりません. num放送したいものがある場合は、うまくいくか試しMPI_Bcast(& num, 1, MPI_INT, rank, MPI_COMM_WORLD)てください。

別の非常に深刻な独立した問題があります。スタックにいくつかあり、初期化する前にint rank;これを渡します。MPI_Bcast誰が送っていますか?root の場合、 を渡す0か、 で適切に初期化することもできますint rank = 0;

インスタンスがランダムに送信または受信するため、未定の値rankはほぼ確実にジョブが中止される理由です。

于 2013-01-24T22:42:01.053 に答える