说我有一些 int x
。我想检查所有 MPI 等级是否获得相同的x
. 使用 MPI 集体实现这一目标的好方法是什么?
我能想到的最简单的是,广播 rank0's x
,进行比较,然后 allreduce-logical- 以及比较结果。这需要两个集体操作。
...
x = ...
x_bcast = comm.bcast(x, root=0)
all_equal = comm.allreduce(x==x_bcast, op=MPI.LAND)
if not all_equal:
raise Exception()
...
有一个更好的方法吗?
更新:
从 OpenMPI 用户列表中,我收到了以下响应。我认为这是一个相当不错的把戏!
我在几个地方看到的一个模式是用 MPI_MIN 或 MPI_MAX 来减少对 p = {-x,x}。如果在结果对中 p[0] == -p[1],那么每个人都有相同的值。如果不是,至少一个等级有不同的价值。例子:
bool is_same(int x) {
int p[2];
p[0] = -x;
p[1] = x;
MPI_Allreduce(MPI_IN_PLACE, p, 2, MPI_INT, MPI_MIN, MPI_COMM_WORLD);
return (p[0] == -p[1]);
}