Re: [OMPI users] Check equality of a value in all MPI ranks

2022-02-17 Thread Niranda Perera via users
Thanks Joseph! I think that's a nifty trick! :-)

On Thu, Feb 17, 2022 at 4:57 PM Joseph Schuchart via users <
users@lists.open-mpi.org> wrote:

> Hi Niranda,
>
> 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]);
> }
> ```
>
> HTH,
> Joseph
>
> On 2/17/22 16:40, Niranda Perera via users wrote:
> > Hi all,
> >
> > 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-LAND the comparison result. This requires
> > two collective operations.
> > ```python
> > ...
> > x = ... # each rank may produce different values for 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?
> >
> >
> > --
> > Niranda Perera
> > https://niranda.dev/
> > @n1r44 
> >
>
>

-- 
Niranda Perera
https://niranda.dev/
@n1r44 


Re: [OMPI users] Check equality of a value in all MPI ranks

2022-02-17 Thread Joseph Schuchart via users

Hi Niranda,

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

HTH,
Joseph

On 2/17/22 16:40, Niranda Perera via users wrote:

Hi all,

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-LAND the comparison result. This requires 
two collective operations.

```python
...
x = ... # each rank may produce different values for 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?


--
Niranda Perera
https://niranda.dev/
@n1r44