Огромным преимуществом односторонней связи в 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.