Проверить равенство значения во всех рангах MPI

Скажем, у меня есть int . Я хочу проверить, получают ли все ранги MPI одинаковое значение для . Какой хороший способ добиться этого с помощью коллективов MPI?

Самое простое, что я мог придумать, это транслировать Rank0 x, сделай сравнение, и все уменьши-логично-и результат сравнения. Для этого требуются две коллективные операции.

      ...
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 я получил следующий ответ. И я думаю, что это довольно изящный трюк!

Шаблон, который я видел в нескольких местах, состоит в том, чтобы свести пару p = {-x,x} с MPI_MIN или MPI_MAX. Если в полученной паре 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]);
}

1 ответ

Решения, основанные на логических операторах, предполагают, что вы можете преобразовывать целые числа в логические без потери данных. Я думаю, это опасно. Вы можете сделать побитовое И, чтобы убедиться, что вы используете все байты вашего int/real/whatever.

Вы можете сделать два сокращения: одно максимальное и одно минимальное, и посмотреть, дают ли они тот же результат.

Вы также можете написать свой собственный оператор редукции: работать с двумя целыми числами и делать максимум для первого и минимум для второго. Затем проверьте, совпадают ли они.

Другие вопросы по тегам