Сокращены ли открытые MPI? - PullRequest
1 голос
/ 22 декабря 2011

Я смотрю на код здесь, который я делаю для практики.

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/main.html

Я запутался в показанной здесь части.

MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI::DOUBLE, MPI::SUM, 0); 
if (rank == 0) 
    cout << "pi is approximately " << pi 
         << ", Error is " << fabs(pi - PI25DT) 
         << endl; 

Мой вопрос заключается в том, знает ли функция mpi lower, когда все другие процессы (в данном случае программы с рангом 1-3) завершены и что ее результат завершен?

Ответы [ 2 ]

6 голосов
/ 22 декабря 2011

Все вызовы коллективной связи (уменьшение, сбор, разброс и т. Д.) Блокируются.

4 голосов
/ 29 декабря 2011

@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) верна.

...