MPI_SENDRECV_REPLACE
Думают о качестве функции удобства. MPI_SENDRECV
требует, чтобы оба буфера были непересекающимися - он не может работать с перекрывающимися буферами. Это означает необходимость в отдельном буфере приема, даже когда то, что действительно нужно достичь, - это обмен содержимым буфера отправки с другим рангом. Для осуществления такого обмена с помощью MPI_SENDRECV
, можно было бы сделать что-то подобное (в псевдокоде):
populate data buffer "data"
allocate receive buffer "recv"
call MPI_SENDRECV(data, count, type, recv, count, type)
copy "recv" over "data"
deallocate "recv"
Это может стать утомительным, особенно, если это необходимо в нескольких местах по всей программе и, что более важно, если тип данных несмежный (т. е. столбец матрицы в C/C++). Решение состоит в том, чтобы использовать MPI_SENDRECV_REPLACE
, который выполняет эквивалент вышеуказанного псевдокода внутри и правильно обрабатывает несмежные типы.
Мне сложно думать об общем использовании такого обмена. В большинстве случаев, например, для обмена ореолом достаточно обычной операции приема-приема с несвязанными буферами.