как справиться с ситуацией в mpi, когда количество получаемых сообщений неизвестно

#mpi

#mpi

Вопрос:

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

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

Комментарии:

1. Я думаю, что использование MPI_Put может помочь мне решить мою проблему, потому что таким образом мне не нужно беспокоиться о части приема ..!! Есть комментарии?

Ответ №1:

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

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

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

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

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

Комментарии:

1. Для моей проблемы существует ограничение на объем данных, поэтому односторонняя связь для меня достаточно хороша. Я продолжу с этим и реализую это. кстати, второй подход тоже звучит неплохо, и я переключусь на него в случае возникновения каких-либо проблем. спасибо Джонатану за помощь .. 🙂