gpt4 book ai didi

c - MPI_Allgather 产生不一致的结果

转载 作者:行者123 更新时间:2023-11-30 18:03:27 26 4
gpt4 key购买 nike

我在一个大型软件的一部分中遇到了 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();然而,到目前为止,我还不明白这部分代码。

大家有什么想法吗?

-- 编辑:更新了问题以反射(reflect)我们实际上需要保留一个也与 dt 相关联的标志 -- 这意味着 @suszterpatt 建议对于我最初的问题来说非常有用,但是事实上对此不起作用(我不认为)。

最佳答案

最近对 mpi-default-dev 的更新似乎已经解决了这个问题——当我弄清楚哪些更改可能解决了这个问题时,我将发布更多详细信息。

关于c - MPI_Allgather 产生不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com