MPI 从未知数量的行列接收数据
MPI receiving data from an unknown number of ranks
我有一个索引列表,我不知道它们在向量中的对应条目,因为向量分布在各个行列中。我必须将这些指标发送到负责的行列以获取数据。
另一方面,"my" rank 也从未知数量的 ranks 中获取索引列表。 "my" rank 收到列表后,必须将相应的数据发送给这个请求的ranks。
我想我必须混合使用 MPI_Probe
和 MPI_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 的块遍历向量,然后以块的形式发送数据。当然,块越大越好,但每个发送者等级上保存数据所需的内存也越大。
我有一个索引列表,我不知道它们在向量中的对应条目,因为向量分布在各个行列中。我必须将这些指标发送到负责的行列以获取数据。
另一方面,"my" rank 也从未知数量的 ranks 中获取索引列表。 "my" rank 收到列表后,必须将相应的数据发送给这个请求的ranks。
我想我必须混合使用 MPI_Probe
和 MPI_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 的块遍历向量,然后以块的形式发送数据。当然,块越大越好,但每个发送者等级上保存数据所需的内存也越大。