0

说我有一些 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]);
}
4

1 回答 1

1

基于逻辑运算符的解决方案假定您可以在整数和逻辑之间进行转换而不会丢失任何数据。我认为那很危险。您可以按位执行 AND,确保使用 int/real/whatever 的所有字节。

你可以做两次减少:一次最大和一次减少,看看它们是否给出相同的结果。

您还可以编写自己的归约运算符:对两个整数进行操作,对第一个整数执行最大值,对第二个整数执行最小值。然后测试两者是否相同。

于 2022-02-17T16:55:45.760 回答