【问题标题】:Add recevied data to existing receive buffer in MPI_SendRecv将接收到的数据添加到 MPI_SendRecv 中的现有接收缓冲区
【发布时间】:2011-04-04 06:44:23
【问题描述】:

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

我可以做到以下几点。将上一个时间步的数据存入不同的数组,接收后添加。但是我有大量的节点,我不想在每个时间步都为其存储分配内存。 (或覆盖相同)

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

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

我确信集体沟通电话 (MPI Reduce) 无法在此处解决。有没有其他命令可以做到这一点?

【问题讨论】:

  • 你的意思是相加,还是相加?
  • 我认为对 MPI_Reduce 的引用表明他指的是数字加法而不是 buffer.push_back。

标签: mpi parallel-processing


【解决方案1】:

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

长话短说:您的建议很有道理,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
   }
}

【讨论】:

    【解决方案2】:

    简而言之:没有。

    长话短说:您的建议没有任何意义。如果不先将接收到的值放入某个地方的本地内存,机器就无法对它执行任何操作。您需要一个缓冲区来接收最新值,以及一个单独的总和,每次接收后您将根据缓冲区的内容递增。

    【讨论】:

    • 是的,我也是这样做的,首先我将内存中的值存储到临时数组中,然后进行通信,然后将接收到的值添加到缓冲区中,但之后我必须独立完成每个发送/接收命令和每个方向(3 * 2 用于 pos 和 neg 方向),虽然它是相同的,但还有一点额外的代码......非常感谢您的响应。
    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多