MPI从未知数量的等级接收数据

时间:2018-12-03 11:33:03

标签: c++ mpi

我有一个索引列表,我不知道它们在向量中的对应条目,因为向量分布在各个等级之间。我必须将这些索引发送到负责的行列以获取数据。

另一方面,“我的”排名也从未知数量的排名中获取索引列表。收到列表后,“我的”等级必须将相应的数据发送到该请求等级。

我认为我必须使用MPI_ProbeMPI_Gather的混合物。但是目前,我还看不到如何接收数量未知的列表。

我认为它看起来必须像这样,但是我如何才能从更大的未知数量的排名中接收数据呢?还是我必须遍历所有可能的职位,才能给我带来一些好处?

 MPI_Status status;
 int nbytes; 
 std::vector<Size> indices;
 MPI_Probe(MPI_ANY_SOURCE,MPI_ANY_TAG, comm, &status);
 MPI_Get_count(&status,MPI_UINT64_T, &nbytes);

 if(nbytes!=MPI_UNDEFINED){
     indices.reserve(nbytes);
     MPI_Recv(&indices[0],nbytes,MPI_UINT64_T,status.SOURCE,status.TAG,comm,&status);
 }

1 个答案:

答案 0 :(得分:1)

这与几年前我为parallel I/O做的事情很相似。

一个选项:

  • 从所有发件人中,获取您需要发送给彼此的邮件大小
  • 发送尺寸(如果所有职级都是发件人,则聚集,否则发送/接收)
  • 执行一个(所有)gatherv,它将检索每个接收器上的大小

您可以使用无阻塞发送/接收以及collectv(MPI3),并且可以很好地扩展(取决于硬件)至8个发送者的500个内核。

我们这样做的方法是逐个遍历几个MB的向量,然后分块发送数据。当然,块越大,越好,但每个发件人行所需的存储容量也越多。