MPI 从未知数量的行列接收数据

MPI receiving data from an unknown number of ranks

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

另一方面,"my" rank 也从未知数量的 ranks 中获取索引列表。 "my" rank 收到列表后,必须将相应的数据发送给这个请求的ranks。

我想我必须混合使用 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);
 }

这与我几年前为 parallel I/O 所做的非常相似。

一个选项:

  • 从所有发件人中,获取需要发送给对方的大小rank
  • 发送尺码(如果所有等级都可以发送,则Allgather,否则sends/receives)
  • 做一个(全部)gatherv 来检索每个接收器的大小

您可以使用非阻塞 send/receives 以及 gatherv (MPI3),这可以很好地扩展(取决于硬件)到 500 个核心,用于 8 个发送者。

我们这样做的方法是逐个 MB 的块遍历向量,然后以块的形式发送数据。当然,块越大越好,但每个发送者等级上保存数据所需的内存也越大。