2015-12-06 162 views
0

与普通的Sendrecv操作相反,我明白_replace使用相同的内存位置,计数和数据类型。Sendrecv_replace冗余?

经过一番阅读,我发现它应该防止缓冲区重叠,但不能Sendrecv也服务于相同的目的?

任何人都可以解释操作后的数据是怎么回事?

典型的示例将是很有益

感谢您的MPI_SENDRECV_REPLACE

回答

3

觉得作为一个方便的功能。 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,它在内部执行与上述伪代码等效的操作,并正确处理非连续类型。

我很难想到这种交换的常见用例。在大多数情况下,例如对于光环交换,通常的发送 - 接收操作具有不相交的缓冲区就足够了。