Я использую ту же операцию (первый код), описанную здесь [1].
MPI_Reduce(local, global, 1, mpi_datatype, mpi_selectop, 0, MPI_COMM_WORLD);
Я видел, что MPI_Reduce вызывается числом процесса p-1 в коммуникаторе, но это неверно для других функций сокращения, таких как MPI_Allreduce.
1Q — Есть ли шаблон, чтобы узнать, сколько раз созданная операция вызывается MPI_Reduce?
2Q — Есть ли способ уменьшить количество вызовов MPI_Reduce только к одному процессу (корню), но с входными записями всего процесса?
Во-первых, я предполагаю, что вы имеете в виду Функция сокращения пользователя MPI когда ты пишешь MPI_Reduce
.
1) Не определено, как часто вызывается функция сокращения пользователя. Например, в реализации MPI явно разрешено вызывать операцию сокращения для порций входных данных. Поэтому вы не должны делать какие-либо предположения об этом в отношении правильности. Если вы хотите оптимизировать, то измерьте это для вашей конкретной ситуации.
2) Если вы настаиваете на том, чтобы вызывать операцию сокращения только для корневого ранга, вы можете использовать MPI_Gather
(если позволяет память). MPI_Reduce_Local
может помочь вам немного, но это не коллективное сокращение, только способ назвать MPI_Op
, Это будет намного менее эффективно, потому что вы тратите впустую вычислительные и коммуникационные возможности непродовольственных чинов. Фактически вы переходите от O (log n) к O (n) с точки зрения сложности времени.
Возможно, будет лучшее решение, если вы сможете описать реальную проблему, которую пытаетесь решить.
Других решений пока нет …