Быстрый 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));
По приведенному выше коду у меня есть следующие наблюдения.
При отправке данных больших размеров MPI_ALL_GATHER по всем узлам быстрее, чем этот поворот вправо. То есть каждый обмен своими данными со всеми происходит быстрее, чем просто отправка соседу. Моя процедура MPI_ALL_GATHER выглядит следующим образом.
vector<mat> all_x; boost::mpi::all_gather (this->world,X,all_x);
Как заставить вышеуказанное правое вращение быстрее для больших пакетов данных.