2015-12-06 3 views
0

В отличие от обычной операции Sendrecv, я понимаю, что _replace использует одинаковое расположение памяти, количество и тип данных.Sendrecv_replace избыточно?

После некоторых чтений я обнаружил, что он должен предотвращать перекрытие буфера, но не может Sendrecv также служить той же цели?

Может ли кто-нибудь объяснить, что происходит с данными после операции?

Типичные примеры использования было бы действительно полезно

Спасибо

ответ

3

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, который выполняет эквивалент вышеуказанного псевдокода внутри и правильно обрабатывает несмежные типы.

Мне сложно думать об общем использовании такого обмена. В большинстве случаев, например, для обмена ореолом достаточно обычной операции приема-приема с несвязанными буферами.

Смежные вопросы