我在大型软件的一部分中遇到了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_WORLD有关,因为可能会调用MPI_Comm_Split();但是,到目前为止,我还不了解代码的这一部分。
有人有想法么?
-编辑:更新了问题,以反映我们实际上需要保留也与
dt
关联的标志-这意味着@suszterpatt建议非常适合我的第一个问题,但实际上无法正常工作(我不会认为)。 最佳答案
mpi-default-dev
的最新更新似乎已解决了该问题-当我可以确定可能已解决的更改时,我将发布更多详细信息。