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

将接收到的数据添加到MPI_SendRecv中的现有接收缓冲区,mpi,parallel-processing,Mpi,Parallel Processing,我正在尝试使用MPI\u SendRecv跨两个进程发送数据(强制)。通常,数据会在接收的缓冲区中被重写,我不想覆盖接收的缓冲区中的数据,而是想添加它接收到的数据 我可以做到以下几点。将上一时间步中的数据存储到不同的数组中,然后在接收后添加数据。但是我有大量的节点,我不想每次都为它的存储分配内存。(或覆盖相同内容) 我的问题是,有没有一种方法可以直接将接收到的数据添加到缓冲区,并使用MPI将其存储在接收到的内存中 在这方面的任何帮助都会非常感激 我确信集体通信呼叫(MPI Reduce)不能在这

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

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

我的问题是,有没有一种方法可以直接将接收到的数据添加到缓冲区,并使用MPI将其存储在接收到的内存中

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

我确信集体通信呼叫(MPI Reduce)不能在这里解决。还有其他命令可以执行此操作吗?

简而言之:没有

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

简言之:否


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

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

长话短说:你的建议很有意义,MPI论坛目前正在考虑新的功能,这些功能基本上可以满足你的需求

建议必须先收到数据,然后才能累积数据是不正确的。MPI_累加以单边方式执行远程累加。您希望MPI_Sendrecv_累积,而不是MPI_Sendrecv_替换。这非常有意义,而且实现在内部可以比您做得更好,因为它可以基于每个数据包进行缓冲

对于suszterpatt,在eager协议和rendezvous协议中的MPI内部缓冲区可以设置一个管道以最小化缓冲

MPI_Recv_accumulate的实现(为简单起见,不需要考虑MPI_发送部分)如下所示:

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
   }
}
int-MPI\u-Recv(void*buf、int-count、MPI\u数据类型Datatype、MPI\u Op Op、int-source、int-tag、MPI\u-Comm-Comm、MPI\u-Status*Status)
{
如果(渴望)
MPI_Reduce_local(_eager_buffer,buf,count,datatype,op);
else/*集合点*/
{
malloc\u缓冲区

while(mycount简言之:不,但您应该能够做到这一点

长话短说:你的建议很有意义,MPI论坛目前正在考虑新的功能,这些功能基本上可以满足你的需求

建议必须先接收数据,然后才能进行累积是不正确的。MPI_Accumulate以单边方式进行远程累积。您希望MPI_Sendrecv_Accumulate而不是MPI_Sendrecv_replace。这非常有意义,而且实现在内部可以做得比您好得多,因为它可以在per-p上进行缓冲例如,阿克特基础

对于suszterpatt,在eager协议和rendezvous协议中的MPI内部缓冲区可以设置一个管道以最小化缓冲

MPI_Recv_accumulate的实现(为简单起见,不需要考虑MPI_发送部分)如下所示:

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
   }
}
int-MPI\u-Recv(void*buf、int-count、MPI\u数据类型Datatype、MPI\u Op Op、int-source、int-tag、MPI\u-Comm-Comm、MPI\u-Status*Status)
{
如果(渴望)
MPI_Reduce_local(_eager_buffer,buf,count,datatype,op);
else/*集合点*/
{
malloc\u缓冲区

虽然(MyCount是的,我也这样做了,首先我将内存中的值存储到临时数组中,然后进行通信,然后将接收到的值添加到缓冲区中,但在每个发送/接收命令之后以及在每个方向上,我都必须独立进行(pos和neg方向都是3*2),虽然是一样的,但还是有一点额外的代码…非常感谢您的响应。是的,我也这么做了,首先我将值存储在内存中的临时数组中,然后进行通信,然后将接收到的值添加到缓冲区中,但在每个发送/接收命令之后,我必须在每个方向上独立执行(正反方向均为3*2),虽然它是一样的,但还是有一点额外的代码…非常感谢您的回复。您是指添加like sum,还是添加like append?我认为对MPI_Reduce的引用表明他指的是数字相加,而不是缓冲区。push_back。您是指添加like sum,还是添加like append?我认为对MPI_Reduce的引用表明他是rEFERR为数字加法,而不是buffer.push_。