Добавить полученные данные в существующий приемный буфер в MPI_SendRecv - PullRequest
1 голос
/ 26 августа 2010

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 20 марта 2013

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

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

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

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

Реализация 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
   }
}
1 голос
/ 05 сентября 2010

Короче говоря: нет.

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

...