3

使用 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));

在上面的代码中,我有以下观察。

  1. 在发送更大的数据大小时,所有节点上的 MPI_ALL_GATHER 比右轮换更快。也就是说,每个人与每个人交换他们的数据比仅仅发送给它的邻居更快。我的 MPI_ALL_GATHER 例程如下。

    vector<mat> all_x;  
    boost::mpi::all_gather (this->world,X,all_x);
    
  2. 对于较大的数据包,如何使上面的右旋转更快。

4

0 回答 0