Является ли поведение MPI-связи ранга с самим собой четко определенным?
Что произойдет, если вы используете один из методов связи MPI, чтобы иметь звание, связанное с самим собой? Есть ли четко определенное поведение (например, гарантированное для успеха или неудачи) или зависит от случайных/других неконтролируемых влияний, будет ли программа продолжена или нет?
Примером может служить код динамики жидкости, в котором каждый ранг определяет, какие ячейки сетки необходимо отправить в соседние ряды, чтобы создать необходимое гало для вычислительного трафарета. Если симуляция запускается только на одном ранге, будет неблокировать отправку/получение ранга 0 с самой собой (отправка информации о 0-осях).
Ответы
Ответ 1
В то время как вы можете избежать самообслуживания в соответствии с ответом Suszterpatt, самообслуживание будет работать и является частью стандарта MPI. Существует даже предустановленный удобный коммуникатор MPI_COMM_SELF
. Пока вызовы отправки/получения не вызывают блокировки (например, используются неблокирующие вызовы), отправка в режим самообслуживания прекрасна. Конечно, буферы отправки и получения не должны перекрываться.
Обратите внимание, что с помощью OpenMPI вам нужно включить self
BTL.
Источник: MPI 1.1 Раздел 3.2.4
Источник = назначение разрешено, то есть процесс может отправлять сообщение самому себе. (Тем не менее, это опасно делать с описанными выше блокирующими процессами отправки и получения, поскольку это может привести к тупиковой ситуации. См. Раздел 3.5. Семантика связи "точка-точка".)
Ответ 2
В стандартном режиме send (т.е. MPI_Send()
), до реализации MPI необходимо определить, следует ли буферировать сообщение или нет. Разумно предположить, что любая реализация, или, по крайней мере, популярные, распознает отправку на себя и решит буферизовать сообщение. Затем выполнение продолжит выполнение, и после того, как будет получен соответствующий совпадение, сообщение будет считано из буфера. Если вы хотите быть абсолютно уверенным, вы можете использовать MPI_Bsend()
, но тогда вы можете управлять буфером через MPI_Buffer_attach()
и MPI_Buffer_detach()
.
Однако идеальным решением вашей конкретной проблемы является использование MPI_PROC_NULL
в аргументе source/destination вызовов отправки/получения, что приведет к тому, что Send and Recv откажется от любой связи и вернется как можно скорее.