MPI буферизованный отправка / получение заказа - PullRequest
3 голосов
/ 08 января 2010

Я использую MPI (с фортраном, но вопрос более специфичен для стандарта MPI, чем любой другой язык), и, в частности, использую буферизованные функции отправки / получения isend и irecv.Теперь, если мы представим следующий сценарий:

Процесс 0:

isend(stuff1, ...)
isend(stuff2, ...)

Процесс 1:

wait 10 seconds
irecv(in1, ...)
irecv(in2, ...)

Сообщения доставляются в Процесс 1 в том порядке, в котором они былиотправлено, т.е. могу ли я быть уверен, что in1 == stuff1 и in2 == stuff2 , если используемый тег одинаков во всех случаях ?

Ответы [ 2 ]

7 голосов
/ 08 января 2010

Да, сообщения принимаются в порядке их отправки. Стандарт описывается как сообщения без обгонов. См. Стандартный раздел MPI для получения более подробной информации, вот выдержка:

Сообщения заказа не обгоняют: если отправитель отправляет два сообщения подряд в один и тот же пункт назначения, и оба соответствуют одному и тому же получению, то эта операция не может получить второе сообщение, если первое еще ожидает обработки. Если получатель отправляет два приема подряд, и оба соответствуют одному и тому же сообщению, то вторая операция приема не может быть удовлетворена этим сообщением, если первое еще ожидает. Это требование облегчает сопоставление отправок и приемов. Это гарантирует, что код передачи сообщений является детерминированным, если процессы являются однопоточными, а подстановочный знак MPI_ANY_SOURCE не используется при получении. (Некоторые из вызовов, описанных позже, такие как MPI_CANCEL или MPI_WAITANY, являются дополнительными источниками недетерминизма.)

1 голос
/ 22 февраля 2010

Да и нет.

могу ли я быть уверен, что in1 == stuff1 и in2 == stuff2, если используемый тег одинаковы во всех случаях?

Да. Существует определенная корреляция 1: 1 между send и recv, которая получит правильный ввод в правильный буфер recv. Такое поведение гарантируется стандартом и обеспечивается всеми реализациями MPI.

Нет. Точный порядок внутренней последовательности сообщений и точный порядок, в котором заполняются буферы на стороне получателя, является чем-то вроде черного ящика ... особенно, когда используются сообщения в стиле RDMA с несколькими буферами в полете (например, InfiniBand).

Если ваш код использует несколько потоков и проверяет буфер для определения полноты (например, ожидая переключения бита) вместо использования MPI_Test или MPI_Wait, то возможно, что сообщения могут поступать не по порядку (но в правильный буфер).

Если ваш код зависит от заполнения in1 = stuff1 ДО ДОПОЛНЕНИЯ in2 = stuff2 на стороне получателя, и для обоих сообщений существует один ранг отправки, то использование MPI_Issend (неблокирующая, синхронная отправка) гарантирует сообщения передаются по порядку. Если вам нужно гарантировать порядок заполнения буфера для нескольких recv из нескольких рангов отправки, то между каждым revc требуется какой-то блокирующий вызов (например, MPI_Recv, MPI_Barrier, MPI_Wait и т. Д.).

...