我有一个索引列表,我不知道它们在向量中的对应条目,因为向量分布在各个等级之间。我必须将这些索引发送到负责的行列以获取数据。
另一方面,“我的”排名也从未知数量的排名中获取索引列表。收到列表后,“我的”等级必须将相应的数据发送到该请求等级。
我认为我必须使用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);
}
答案 0 :(得分:1)
这与几年前我为parallel I/O做的事情很相似。
一个选项:
您可以使用无阻塞发送/接收以及collectv(MPI3),并且可以很好地扩展(取决于硬件)至8个发送者的500个内核。
我们这样做的方法是逐个遍历几个MB的向量,然后分块发送数据。当然,块越大,越好,但每个发件人行所需的存储容量也越多。