2014-01-03 4 views
0

Я делаю кучу вызовов MPI_Isend для ряда процессов для распространения некоторых данных. При каждом вызове я сохраняю полученный MPI_Request в массиве. После того, как все вызовы MPI_Isend сделаны, я делаю MPI_Waitall в запросах.Есть ли FIFO для каждого процесса FIFO-гарантия на MPI_Isend?

Порядок сообщений важен, то есть я хочу, чтобы каждый процесс получал сообщения в в том же порядке, который я им отправил. Это связано с тем, что для каждой части данных, которую я отправляю, я также распространяю некоторые метаданные с помощью отдельного вызова MPI_Isend. Я думаю, что это плохая идея, но я не знаю альтернативы. Очевидно, что метаданные должны поступать до данных, поэтому мне нужна гарантия FIFO. Это то, что я делаю?

Мне не нужны разные процессы, получающие данные в другом порядке, меня интересуют только отдельные процессы, получающие данные в правильном порядке. Является ли это документированным где угодно? Я использую реализацию MPICH2.

Я хочу распространять массив двойников с некоторыми связанными с ним данными, но «тег» слишком ограничен.

ответ

1

В MPI вам гарантировано, что все сообщения в одном комбайне/теге/ранге будут получены в том же порядке, в каком они были отправлены.

Например, в этом примере:

if (rank == 0) 
    MPI_Send(buf, 10, MPI_INT, 1, 0, MPI_COMM_WORLD); 
else if (rank == 1) 
    MPI_Recv(buf, 10, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 

всех сообщений, полученных 1-го ранга будет в том же порядке, как они были отправлены из ранга 0. Это также верно для неблокируемых версий (MPI_ISEND/MPI_IRECV).

Это неверно, если вы используете разные теги. Например:

if (rank == 0) { 
    MPI_Send(buf, 10, MPI_INT, 1, 0, MPI_COMM_WORLD); 
    MPI_Send(buf, 10, MPI_INT, 1, 1, MPI_COMM_WORLD); 
} else if (rank == 1) { 
    MPI_Recv(buf, 10, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
    MPI_Recv(buf, 10, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
} 

не обязательно получит сообщение в том же порядке, в котором они были отправлены, потому что они используют разные теги.

Для получения дополнительной информации вы можете ознакомиться с разделом 3.5 раздела MPI-3.0 Standard (стр. 40).

0

AFAIK, если несколько сообщений могут быть сопоставлены вызовом recv, MPI гарантирует заказ сообщениям для каждого отправителя (но порядок у разных отправителей нет), независимо от того, какой тег есть, в зависимости от того, какой режим отправки (отправка режим влияет только на код отправителя).
Общий случай заключается в том, что один процесс (отправитель) продолжает отправлять данные другому процессу (приемнику), поэтому здесь порядок FIFO.

По-видимому, это обеспечивается за коммуникатор (потому что он включает в себя матч от recv). Кажется, у разных коммуникаторов нет никаких гарантов.

Таким образом, ответ Уэсли Блэнд неверен. В его примерах заказ всегда гарантирован FIFO.

Смежные вопросы