快速mpi右旋转大数据
一旦使用MPI,我想以循环方式将数据向右移动。也就是说,如果有4个节点,1->2,2->3,3->4,4->1。我正在使用boostmpi,并使用以下代码来实现它快速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
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));
关于上述代码,我有以下观察
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()
行的情况下再试一次吗?