我正在尝试使用MPI_SendRecv
在两个进程中发送数据(强制)。通常数据将被写入接收缓冲区,我不想覆盖接收缓冲区中的数据,而是想要添加它收到的数据。
我可以做以下事情。将前一时间步骤中的数据存储到其他阵列,然后在接收后添加。但是我有大量的节点,我不想每次都为它的存储分配内存。 (或覆盖相同的)
我的问题是有没有办法将收到的数据直接添加到缓冲区并使用MPI将其存储在接收的内存中?
这方面的任何帮助都会非常感激。
我确信集体通讯电话(MPI Reduce)无法在此处解决。还有其他命令可以做到吗?
答案 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)
简而言之:不。
总之:你的建议没有意义。如果没有先将其放入本地内存,机器就无法对您收到的值执行任何操作。你需要一个缓冲区来接收最新的值,以及一个单独的总和,你将在每次接收后按缓冲区的内容递增。