Быстрый mpi вправо повернуть большие данные

Я хочу перемещать данные вправо по кругу один раз, используя MPI. То есть, если у вас 4 узла, 1->2, 2->3, 3->4, 4->1. Я использую MPI Boost и следующий код для этого.

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. Как заставить вышеуказанное правое вращение быстрее для больших пакетов данных.

0 ответов

Другие вопросы по тегам