Как справиться с ситуацией в MPI, где количество сообщений, чтобы получить неизвестно - PullRequest
5 голосов
/ 30 апреля 2011

У меня есть программа MPI, где каждый узел отправляет некоторые значения некоторым другим узлам. Отправители знают, какие узлы отправлять данные, но получатели не знают 1) сколько данных ожидается в их конце и 2) какие ряды собираетесь отправлять на него.

Я могу использовать MPI_ANY_SOURCE для второй части вышеупомянутой проблемы, но я не имею понятия, как получатель узнает, сколько он должен получить. то есть сколько раз я должен вызывать функцию приема в MPI на узле-получателе.

1 Ответ

1 голос
/ 01 мая 2011

Огромным преимуществом односторонней связи в MPI2 является то, что вам не нужно координировать посылки с получателями, так что это определенно будет одним из подходов. С другой стороны, вам все еще нужно знать, сколько данных может оказаться на вашем пути при создании окна для других в MPI_Put. Так что это потенциально проблема.

Но координация двухточечных сообщений также возможна. Похоже, что все отправители знают, сколько сообщений они будут отправлять и кому, вы можете объединить всю эту информацию. Например, скажем, было 4 процессора, и процесс 1 должен был отправить одно сообщение каждому из процессов 0 и 2. Он мог иметь целочисленный массив toSend:

toSend[] = {1,0,1,0}

и так мог каждый из других процессоров. Тогда вы могли бы сделать MPI_Allreduce(...., MPI_SUM,...) из этих массивов, и теперь каждый процессор будет знать общее количество сообщений, которые нужно получить; затем они могли бы опубликовать столько неблокирующих сообщений от MPI_ANY_SOURCE.

Если объем данных на сообщение также неизвестен, это немного сложнее; но вы можете сделать то же самое с количеством данных; создать подходящее буферное пространство; тогда вы могли бы сделать MPI_Bsend() с, а получатели могли бы сделать MPI_Probes и MPI_Recv's.

...