快速mpi右旋转大数据

快速mpi右旋转大数据,mpi,openmpi,boost-mpi,Mpi,Openmpi,Boost Mpi,一旦使用MPI,我想以循环方式将数据向右移动。也就是说,如果有4个节点,1->2,2->3,3->4,4->1。我正在使用boostmpi,并使用以下代码来实现它 mat new_W(this->W.n_rows,this->W.n_cols); int p_send = MPI_RANK + 1 >= MPI_SIZE ? 0 : MPI_RANK + 1; int p_recv = MPI_RANK - 1 < 0 ? MPI_SIZE - 1 : MPI_RANK

一旦使用MPI,我想以循环方式将数据向右移动。也就是说,如果有4个节点,1->2,2->3,3->4,4->1。我正在使用boostmpi,并使用以下代码来实现它

mat new_W(this->W.n_rows,this->W.n_cols);
int p_send = MPI_RANK + 1 >= MPI_SIZE ? 0 : MPI_RANK + 1;
int p_recv = MPI_RANK - 1 < 0 ? MPI_SIZE - 1 : MPI_RANK - 1;
vector<boost::mpi::request> reqs;
reqs.push_back(this->world.isend(p_send, MAT_TAG, this->W));
reqs.push_back(this->world.irecv(p_recv, MAT_TAG, new_W));    
boost::mpi::wait_all(ALL(reqs));
matnew\u W(this->W.n\u行,this->W.n\u列);
int p\u send=MPI\u秩+1>=MPI\u大小?0:MPI_排名+1;
INTP_recv=MPI_秩-1<0?MPI_大小-1:MPI_排名-1;
矢量需求;
请求推回(此->世界.isend(p\u发送,MAT\u标记,此->W));
要求向后推(此->world.irecv(p_recv,MAT_标签,new_W));
boost::mpi::wait_all(all(requs));
关于上述代码,我有以下观察

  • 在发送较大数据量时,MPI_ALL_聚集在所有节点上的速度比此右转速度快。也就是说,每个人与每个人交换数据的速度都比只发送给邻居快。我的MPI_ALL_GATHER例程如下所示

    vector<mat> all_x;  
    boost::mpi::all_gather (this->world,X,all_x);
    
    vector all_x;
    boost::mpi::所有集合(这个->世界,X,所有集合);
    
  • 如何使上面的右旋转速度更快,以获得更大的数据包


  • 你能分享一下你是如何调用MPI\u Allgather的吗?具体来说,您使用的是
    MPI\u Allgather()
    还是
    boost::MPI::Allgather()
    以及如何传递矩阵数据结构。您的问题很可能与序列化开销有关。@Patrick:我已将上述问题编辑为包含boost::mpi::all gather调用。什么是大的?我使用标准OpenMPI在Fortran中实现了这一点,每个进程大约有2000个元素,解除阻塞
    isend
    /
    irecv
    all_gather
    更快。每个进程有5000万个元素,
    all\u-gather
    所需的时间大约要长4-5倍。我从未使用过boost::mpi,因此我不知道它在内部的行为。但是,在进行P2P MPI通信时,一个好的做法是在发布相应的发送请求之前发布接收请求(这是为了尽可能避免意外消息,因为MPI库需要更长的时间来处理这些消息)。您介意在交换
    isend()
    irecv()
    行的情况下再试一次吗?