将接收的数据添加到MPI_SendRecv中的现有接收缓冲区

时间:2010-08-26 13:27:32

标签: mpi parallel-processing

我正在尝试使用MPI_SendRecv在两个进程中发送数据(强制)。通常数据将被写入接收缓冲区,我不想覆盖接收缓冲区中的数据,而是想要添加它收到的数据。

我可以做以下事情。将前一时间步骤中的数据存储到其他阵列,然后在接收后添加。但是我有大量的节点,我不想每次都为它的存储分配内存。 (或覆盖相同的)

我的问题是有没有办法将收到的数据直接添加到缓冲区并使用MPI将其存储在接收的内存中?

这方面的任何帮助都会非常感激。

我确信集体通讯电话(MPI Reduce)无法在此处解决。还有其他命令可以做到吗?

2 个答案:

答案 0 :(得分:3)

简而言之:不,但你应该能够做到这一点。

很长时间:您的建议很有意义,MPI论坛目前正在考虑能够实现您想要的新功能。

建议必须先接收数据才能累积数据是不正确的。 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 :(得分:1)

简而言之:不。

总之:你的建议没有意义。如果没有先将其放入本地内存,机器就无法对您收到的值执行任何操作。你需要一个缓冲区来接收最新的值,以及一个单独的总和,你将在每次接收后按缓冲区的内容递增。