Проверить равенство значения во всех рангах 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.
Вы можете сделать два сокращения: одно максимальное и одно минимальное, и посмотреть, дают ли они тот же результат.
Вы также можете написать свой собственный оператор редукции: работать с двумя целыми числами и делать максимум для первого и минимум для второго. Затем проверьте, совпадают ли они.