2016-12-20 2 views
0

Я использую ту же самую операцию (первый код), описанную здесь [1].Сколько раз операция сокращения, вызванная MPI_Reduce?

MPI_Reduce(local, global, 1, mpi_datatype, mpi_selectop, 0, MPI_COMM_WORLD); 

Я видел, что MPI_Reduce вызывается р-1 число процесса в коммуникаторе, но это неверно для других функций, таких как уменьшить MPI_ALLREDUCE.

1Q - Есть ли шаблон, чтобы узнать, сколько раз созданная операция вызывается MPI_Reduce?

2Q - Есть ли способ уменьшить количество вызовов MPI_Reduce только на один процесс (root), но с входными входами всего процесса?

[1] First k results

ответ

0

Во-первых, я полагаю, вы имеете в виду функцию MPI сокращение пользователя когда вы пишете MPI_Reduce.

1) Не определено, как часто вызывается функция сокращения пользователя. Например, реализация MPI явно разрешена для вызова операции сокращения на куски входных данных. Поэтому вы не должны делать никаких предположений об этом в отношении правильности. Если вы хотите оптимизировать, то измерьте его для своей конкретной ситуации.

2) Если вы настаиваете на том, чтобы вызвать операцию сокращения только на корневой ранг, вы можете использовать MPI_Gather (если позволяет память). MPI_Reduce_Local может помочь вам, но это не коллективное сокращение, только способ позвонить MPI_Op. Это будет намного менее эффективно, потому что вы тратите впустую вычислительную и коммуникационную способность непродовольственных рангов. Эффективно вы переходите от O (log n) к O (n) с точки зрения временной сложности.

Может быть, лучшее решение, если вы можете описать фактическую проблему, которую пытаетесь решить.

+0

Я хочу, чтобы вектор, отсортированный по размеру (k), был привязан к вектору global, но с использованием структуры минимальной кучи (количество размеров процесса), поэтому для каждой итерации первое значение записывается на вывод – realbas

Смежные вопросы