与普通的Sendrecv操作相比,我知道_replace使用相同的内存位置,计数和数据类型。
经过一些阅读后,我发现它应该可以防止缓冲区重叠,但是Sendrecv也不能用于同样的目的吗?
任何人都可以解释一下手术后的数据是怎么回事吗?
典型的用法示例非常有用
谢谢
答案 0 :(得分: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
,它在内部执行上述伪代码的等价物并处理正确的非连续类型。
我很难想到这种交流的常见用例。在大多数情况下,例如对于光环交换,通常使用不相交缓冲区的发送 - 接收操作就足够了。