Добавить полученные данные в существующий приемный буфер в MPI_SendRecv

Я пытаюсь отправить данные (силы) через 2 процесса, используя MPI_SendRecv. Обычно данные перезаписываются в полученном буфере, я не хочу перезаписывать данные в полученном буфере, вместо этого я хочу добавить полученные данные.

Я могу сделать следующее. Сохраните данные на предыдущем временном шаге в другой массив, а затем добавьте их после получения. Но у меня огромное количество узлов, и я не хочу выделять память для их хранения каждый раз. (или перезаписать то же самое)

Мой вопрос, есть ли способ добавить полученные данные непосредственно в буфер и сохранить их в полученной памяти с помощью MPI?

Любая помощь в этом направлении будет очень благодарна.

Я уверен, что вызовы коллективного общения (MPI Reduce) не могут быть реализованы здесь. Есть ли другие команды, которые могут это сделать?


person lsk1985    schedule 26.08.2010    source источник
comment
Вы имеете в виду добавить как сумму или добавить как добавить?   -  person Jonathan Dursi    schedule 20.03.2013
comment
я думаю, что ссылка на MPI_Reduce указывает на то, что он имеет в виду числовое сложение, а не buffer.push_back.   -  person Jeff Hammond    schedule 20.03.2013


Ответы (2)


Короче говоря: нет, но вы должны быть в состоянии сделать это.

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

Неверно предполагать, что данные должны быть получены до того, как их можно будет накопить. MPI_Accumulate выполняет удаленное накопление односторонним способом. Вы хотите MPI_Sendrecv_accumulate, а не MPI_Sendrecv_replace. Это имеет смысл, и реализация может внутренне работать намного лучше, чем вы, потому что она может буферизовать, например, для каждого пакета.

Для suszterpatt MPI выполняет внутреннюю буферизацию в активном протоколе, а в протоколе рандеву можно настроить конвейер для минимизации буферизации.

Реализация MPI_Recv_accumulate (для простоты, поскольку часть MPI_Send рассматривать не нужно) выглядит так:

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, MPI_Op op, int source, int tag, MPI_Comm comm, MPI_Status *status)
{
 if (eager)
  MPI_Reduce_local(_eager_buffer, buf, count, datatype, op);
 else /* rendezvous */
 {
   malloc _buffer
   while (mycount<count)
   {
     receive part of the incoming data into _buffer
     reduce_local from _buffer into buf
   }
}
person Jeff Hammond    schedule 20.03.2013

Короче: нет.

Короче: ваше предложение не имеет смысла. Машина не может выполнять какие-либо операции с вашим полученным значением, не поместив его где-нибудь в локальную память. Вам понадобится буфер для получения самого нового значения и отдельная сумма, которую вы будете увеличивать на содержимое буфера после каждого приема.

person suszterpatt    schedule 04.09.2010
comment
да, я сделал то же самое, сначала я сохранил значения в памяти во временный массив, а затем выполнил связь, а затем добавил полученные значения в буфер, но тогда я должен делать это независимо после каждой команды отправки/получения и в каждом направления (3 * 2 как для положительного, так и для отрицательного направления), немного дополнительного кода, хотя это то же самое ... большое спасибо за ответ. - person lsk1985; 08.09.2010