MPI — Как избежать использования двух буферов при неблокирующей отправке & amp; Получать?

У меня есть сценарий использования, когда мне нужно передать Array of Structures (AoS) среди группы процессоров круговым («кольцевым») способом.
Я делаю это в настоящее время, используя неблокирующую отправку и получение, и используя два вспомогательных буфера на стороне отправителя и получателя соответственно.

Поскольку данные, которые я передаю, чрезвычайно велики (~ 60 ГБ до разбиения), выделение двух буферов мне кажется неэффективным. Мой вопрос — есть ли лучший способ сделать это, избегая «двух буферов»? (Возможно, просто использовать один буфер каким-то образом ?, чтобы я мог уменьшить требования к памяти).

Примерно моя процедура общения выглядит так:

//Pack AoS into send buffer (which is a vector<char>)
char *msg_ptr = &(msg_send_buf_.front());
for (auto& param : local_primal_params_) {
param.pack_to(msg_ptr);
msg_ptr += PARAM_BYTENUM;
}

//Perform non-blocking send receive
{
MPI_Request send_request;
MPI_Status send_stat, recv_stat;
MPI_Isend(&(msg_send_buf_.front()), local_primal_params_.size() * PARAM_BYTENUM, MPI_CHAR,
send_to, 0,
MPI_COMM_WORLD, &send_request);
MPI_Recv(&(msg_recv_buf_.front()), local_primal_params_.size() * PARAM_BYTENUM, MPI_CHAR,
recv_from, 0,
MPI_COMM_WORLD, &recv_stat);
MPI_Wait(&send_request, &send_stat);
}

//Unpack receive buffer back into AoS on receiver side
{
char *msg_ptr = &(msg_recv_buf_.front());
for (auto& param : local_primal_params_) {
param.unpack_from(msg_ptr);
msg_ptr += PARAM_BYTENUM;
}
}

Любые рекомендации будут очень полезны.

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]