非常に大きなソフトウェアの一部で MPI_Allgather に問題があります。
次の関数は、ノードごとに異なる double および関連フラグを渡されます。この関数は、グローバルに最小の double を見つけ、すべてのノードを対応する値に設定することになっています。
void set_dt_to_global_min (double *dt, int *flag) {
int ierr, size;
ierr = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (size == 1)
return;
typedef struct DT_FLAG_ {
double dt;
int flag;
} DT_FLAG;
DT_FLAG local;
DT_FLAG *gathered = (DT_FLAG *) malloc(size * sizeof(*gathered));
local.dt = *dt;
local.flag = *flag;
MPI_Allgather(&local, sizeof(DT_FLAG), MPI_BYTE, gathered, sizeof(DT_FLAG), MPI_BYTE, MPI_COMM_WORLD);
int i, imin;
for (imin = 0, i = 1; i < size; ++i) {
if (gathered[imin].dt > gathered[i].dt) {
imin = i;
}
}
*dt = gathered[imin].dt;
*flag = gathered[imin].flag;
free(gathered);
}
現在、これを 6 つのノードで実行していますが、ノード 5 (dt の値が最小) でのみ次のエラーが発生することがわかりました。
- の真の値
gathered[0]
はgathered[2]
- の真の値
gathered[1]
はgathered[3]
MPI_Comm_Split(); への呼び出しが潜在的にあるため、これはおそらく MPI_COMM_WORLD と関係があると思いました。ただし、まだコードのその部分を理解していません。
誰にもアイデアはありますか?
-- 編集: 関連付けられているフラグを実際に保持する必要があることを反映するように質問を更新しましたdt
-- これは、@suszterpatt の提案が私の最初の質問には最適ですが、実際には機能しないことを意味します (私は考えていません)このため。