@g.inozemtsev правильно.Коллективные вызовы MPI, в том числе в Open MPI, являются «блокирующими» в смысле слова MPI, что означает, что вы можете использовать буфер при возврате вызова.В такой операции, как MPI_REDUCE, это означает, что корневой процесс будет иметь ответ в своем буфере, когда вернется.Кроме того, это означает, что некорневые процессы в MPI_REDUCE могут безопасно перезаписывать свой буфер при возврате MPI_REDUCE (что обычно означает, что их часть в сокращении завершена).
Однако обратите внимание, что, как упоминалось выше, возвратиз коллективной операции, такой как MPI_REDUCE в одном процессе, не имеет отношения к возврату той же коллективной операции в одноранговом процессе.Единственное исключение из этого правила - MPI_BARRIER, потому что барьер определен как явная синхронизация, тогда как все другие коллективные операции MPI-2.2 не обязательно должны явно синхронизироваться.
В качестве конкретного примера, скажем, что все не-root-процессы вызывают MPI_REDUCE в момент X. Корень наконец вызывает MPI_REDUCE в момент X + N (для этого примера предположим, что N большое).В зависимости от реализации некорневые процессы могут возвращаться намного раньше, чем X + N, или могут блокироваться до X + N (+ M).Стандарт MPI намеренно неясен в этом вопросе, чтобы позволить реализациям MPI делать то, что они хотят / нуждаются (что также может быть продиктовано потреблением / доступностью ресурсов).
Следовательно, точка @ g.inozemtsev «Вы не можете полагаться на синхронизацию» (за исключением MPI_BARRIER) верна.