Mpi 远程访问存储器

Mpi 远程访问存储器,mpi,shared-memory,mpi-rma,Mpi,Shared Memory,Mpi Rma,关于MPI 3.0中的远程访问内存,有两个通信调用:MPI_Put和MPI_Get。我使用以下命令将本地数据放入共享内存(为了便于说明,我从中复制了一些语句): MPI_Put后,来自每个处理器的数据应放入共享内存中。然后,我的代码希望使用 if (id != 0) MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, id-1, 0, NUM_ELEMENT, MPI_INT, win); else MPI_

关于MPI 3.0中的远程访问内存,有两个通信调用:MPI_Put和MPI_Get。我使用以下命令将本地数据放入共享内存(为了便于说明,我从中复制了一些语句):

MPI_Put后,来自每个处理器的数据应放入共享内存中。然后,我的代码希望使用

if (id != 0)
      MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, id-1, 0, NUM_ELEMENT, MPI_INT, win);
   else
      MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, num_procs-1, 0, NUM_ELEMENT, MPI_INT, win);
我的问题是:我是否可以运行NUM_元素不同于NUM_元素的案例?这意味着相同的处理器从共享内存中获取的数据数量与它们发送的数据数量不同。另一个问题是,单个处理器获得的数据可能来自不同的处理器。那么,如何在上述MPI_Get调用中指定id-1和num_procs-1的参数呢?我还没有尝试实现这一点,但正在考虑在我的代码中设计MPI实现


非常感谢。

为了清楚起见,我在这里举了一个例子。假设4个处理器将不同数量的数据发送到共享内存。它们在此共享内存中的位置是连续的。他们发送的数据集数量为x1、x2、x3和x4。然后,他们希望从该内存中获得不同数量的数据集,即y1、y2、y3和y4。x1+x2+x3+x4=y1+y2+y3+y4。为了清楚起见,我在这里举了一个例子。为了便于阅读,我在你的问题中举了一个更容易理解的例子。老实说,我还是不太明白你的意思。它的行为类似于共享内存。因此,只要数据在窗口中,就可以获取/放置任意大小的数据。但是你必须考虑同步…我不认为这个问题有一个有价值的答案,但我认为如果你提供关于你的实际用例的更具体的信息,可能会有。
   MPI_Comm_rank(MPI_COMM_WORLD, &id);
   MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
if (id != 0)
      MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, id-1, 0, NUM_ELEMENT, MPI_INT, win);
   else
      MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, num_procs-1, 0, NUM_ELEMENT, MPI_INT, win);