Вызов функции MPI_Comm_Split - PullRequest
       28

Вызов функции MPI_Comm_Split

2 голосов
/ 18 февраля 2020

Мой вопрос, вероятно, глупый, но я все же задам его, чтобы быть уверенным!

Вопрос: Ожидаете ли вы, что два приведенных ниже кода будут работать одинаково, используя MPI_Comm_Split для построения 1 субкоммуникатора? (например, допустим, я запускаю код с 6 процессами с рангом от 0 до 5)

NB: Код в Fortran 90 с компилятором Intel 2019, и я использую Mpich для Mpi.

CODE 1

call Mpi_Init(ierror)
call Mpi_Comm_Rank(mpi_comm_world,rank,ierror)

if (rank > 2) then
    call Mpi_Comm_Split(mpi_comm_world,0,rank,new_comm,ierror)
else
    call Mpi_Comm_Split(mpi_comm_world,mpi_undefined,rank,new_comm,ierror)
endif

CODE 2

call Mpi_Init(ierror)
call Mpi_Comm_Rank(mpi_comm_world,rank,ierror)

if (rank > 2) then
    color = 0
else
    color = mpi_undefined
endif

call Mpi_Comm_Split(mpi_comm_world,color,rank,new_comm,ierror)

Mpi_Comm_Split не вызывается То же самое в 2 кодах, но для меня, он должен вести себя одинаково, но я не уверен ... Я читал, что Mpi_Comm_Split должен вызываться в той же строке, но как Procs может знать, что вызов Mpi_Comm_Split выполняется в та или иная строка (для меня это не имеет никакого смысла)?!

NB: С Mpich и intel fortran я проверил это, и оба работали над разделением коммуникатора, но я боюсь поведения разных компиляторов Mpi ...

1 Ответ

1 голос
/ 19 февраля 2020

Если вы правильно указали color, оба кода эквивалентны.

MPI_Comm_split() - это коллективная операция, и, следовательно, она должна вызываться всеми рангами родительского коммуникатора. Это не требует, чтобы вызов выполнялся по той же строке кода.

...