Check equality of a value in all MPI ranks

277 Views Asked by At

Say I have some int x. I want to check if all MPI ranks get the same value for x. What's a good way to achieve this using MPI collectives?

The simplest I could think of is, broadcast rank0's x, do the comparison, and allreduce-logical-and the comparison result. This requires two collective operations.

...
x = ...
x_bcast = comm.bcast(x, root=0)
all_equal = comm.allreduce(x==x_bcast, op=MPI.LAND)
if not all_equal:
   raise Exception()
...

Is there a better way to do this?

UPDATE:

From the OpenMPI user list, I received the following response. And I think it's quite a nifty trick!

A pattern I have seen in several places is to allreduce the pair p = {-x,x} with MPI_MIN or MPI_MAX. If in the resulting pair p[0] == -p[1], then everyone has the same value. If not, at least one rank had a different value. Example:

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]);
}
1

There are 1 best solutions below

3
On

Solutions based on logical operators assume that you can convert between integers and logicals without any data loss. I think that's dangerous. You could do a bitwise AND where you make sure you use all the bytes of your int/real/whatever.

You could do two reductions: one max and one min, and see if they give the same result.

You could also write your own reduction operator: operate on two ints, and do a max on the first, min on the second. Then test if the two are the same.