Является ли поведение 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 откажется от любой связи и вернется как можно скорее.