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

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

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

Примечание: код написан на фортране 90 с компилятором Intel 2019, и я использую Mpich для Mpi.

КОД 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

КОД 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 не вызывается одинаково в двух кодах, но для меня он должен вести себя одинаково, но я не уверен... Я читал, что Mpi_Comm_Split должен вызываться в той же строке, но как процедуры могут знать, что вызов Mpi_Comm_Split делается то на одной строке, то на другой (мне без разницы)?!

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


person Kiwi GM    schedule 18.02.2020    source источник


Ответы (1)


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

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

person Gilles Gouaillardet    schedule 19.02.2020
comment
Да, конечно, я не показывал операторы переменных, чтобы получить более короткое и читаемое сообщение и сосредоточиться на моем вопросе Mpi_Comm_Split! И спасибо за ответ! Мне показалось очень странным, что вызов Mpi_Comm_Split должен быть в той же строке, но я не был уверен на 100%! - person Kiwi GM; 19.02.2020