通常、MPI_Bcast を呼び出すときは、ルートを決定する必要があります。しかし今、誰がメッセージをブロードキャストするかを気にしないアプリケーションがあります。これは、メッセージをブロードキャストするノードがランダムであることを意味しますが、メッセージがブロードキャストされると、グローバル変数は一貫している必要があります。私の理解では、MPI_Bcast は集合関数であるため、すべてのノードが呼び出す必要がありますが、順序が異なる場合があります。つまり、誰が最初に MPI_Bcast に到着し、誰がメッセージを他の人にブロードキャストするかということです。次のコードを 3 つのノードで実行しました。ノード 1 (rank==1) が最初に MPI_Bcast に到達すると、local_count 値 (1) が他のノードに送信され、すべてのノードが同じ local_count で global_count を更新すると思います。私の予想される結果の 1 つは (出力順序は関係ありません)
ノード 0、グローバル カウントは 1
ノード 1、グローバル カウントは 1 です。
ノード 2、グローバル カウントは 1
ただし、実際の結果は常に (出力順序は関係ありません):
ノード 1、グローバル カウントは 1
ノード 0、グローバル カウントは 0
ノード 2、グローバル カウントは 2
この結果は、MPI_Bcast を使用しないコードとまったく同じです。MPI_Bcast または私のコードの理解に何か問題がありますか。ありがとう。
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int rank, size;
int local_count, global_count;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
global_count = 0;
local_count = rank;
MPI_Bcast(&local_count, 1, MPI_INT, rank, MPI_COMM_WORLD);
global_count += local_count;
printf("node %d, global count is: %d\n", rank, global_count);
MPI_Finalize();
}
コードは単純化されたケースです。私のアプリケーションでは、MPI_Bcast の前にいくつかの計算があり、誰が最初に計算を終了するかわかりません。ノードが MPI_Bcast ポイントに来るたびに、ノードは自身の計算結果ローカル変数をブロードキャストする必要があり、すべてのノードはグローバル変数を更新します。したがって、すべてのノードがメッセージをブロードキャストする必要がありますが、順序はわかりません。このアイデアをどのように実装しますか?