Короче говоря: нет, но вы должны быть в состоянии сделать это.
Вкратце: ваше предложение имеет большой смысл, и MPI Forum в настоящее время рассматривает новые функции, которые позволят получить практически то, что вы хотите.
Неверно предполагать, что данные должны быть получены до того, как они могут быть накоплены. MPI_Accumulate выполняет удаленное накопление в одностороннем порядке. Вы хотите MPI_Sendrecv_accumulate, а не MPI_Sendrecv_replace. Это имеет смысл, и внутренняя реализация может работать намного лучше, чем вы, потому что она может буферизоваться, например, для каждого пакета.
Для suszterpatt внутренние буферы MPI в протоколе eager и в протоколе рандеву могут настроить конвейер для минимизации буферизации.
Реализация MPI_Recv_accumulate (для простоты, так как часть MPI_Send не должна рассматриваться) выглядит следующим образом:
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, MPI_Op op, int source, int tag, MPI_Comm comm, MPI_Status *status)
{
if (eager)
MPI_Reduce_local(_eager_buffer, buf, count, datatype, op);
else /* rendezvous */
{
malloc _buffer
while (mycount<count)
{
receive part of the incoming data into _buffer
reduce_local from _buffer into buf
}
}