我想使用MPI以循环方式将数据移动到右侧。也就是说,如果您有4个节点,则1> 2,2-> 3,3-> 4,4-> 1。我正在使用boost mpi并使用以下代码来执行此操作。
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));
在上面的代码中,我有以下观察结果。
发送更大的数据大小时,所有节点上的MPI_ALL_GATHER比右旋转更快。也就是说,每个人与每个人交换数据的速度都快于向邻居发送数据的速度。我的MPI_ALL_GATHER例程如下。
vector<mat> all_x;
boost::mpi::all_gather (this->world,X,all_x);
如何使更高的数据包更快地旋转。