Подразумеваемая синхронизация с MPI_BCAST для отправителя и получателя? - PullRequest
6 голосов
/ 11 июля 2011

При вызове MPI_BCAST имеется ли какая-либо подразумеваемая синхронизация? Например, если процесс отправителя должен был добраться до MPI_BCAST до того, как другие могли бы выполнить BCAST, а затем продолжить без каких-либо подтверждений? Некоторые недавние тесты с кодом вроде:

program test
include 'mpif.h'

integer ierr, tid, tmp

call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, tid, ierr)

tmp = tid

if(tid.eq.0) then
  call MPI_BCAST(tmp,1,MPI_INTEGER,MPI_ROOT,MPI_COMM_WORLD, ierr)
else

endif

write(*,*) tid,'done'
call MPI_FINALIZE(ierr)

end

показывает, что с двумя потоками они оба достигают завершения, несмотря на то, что только отправитель делает вызов MPI_BCAST.

Выход:

1 done           0
0 done           0

Может ли это быть проблемой с установкой MPI, с которой я работаю (MPICH), или это стандартное поведение для MPI?

Ответы [ 2 ]

1 голос
/ 19 октября 2015

Могу засвидетельствовать, что MPI_Bcast блокирует НЕ , по крайней мере, для корневого (отправляющего) процесса. Вы должны позвонить MPI_Barrier сразу после этого, если вы хотите быть уверены, что ваша программа блокируется. Я знаю это, потому что недавно я случайно вызвал MPI_Bcast для корневого процесса только (а не коллективно), и выполнение программы продолжалось как обычно, намного позже, когда СЛЕДУЮЩИЙ не связанный вызов MPI_Bcast, в котором старый буфер был получен в новые разные буферы. Это несоответствие в типе данных / длине буфера приводило к появлению мусорных данных, и мне потребовалось некоторое время, чтобы найти эту ошибку.

1 голос
/ 11 июля 2011

Bcast - это коллективный вызов и как таковые блоки.Точнее, он блокируется до тех пор, пока все процессы в указанном коммуникаторе не сделают соответствующий вызов Bcast, после чего происходит обмен данными и продолжается выполнение.

Ваш код слишком упрощен для целей отладки.Можете ли вы опубликовать рабочий минимальный пример, который демонстрирует проблему?

...