Sendrecv_replace多余?
Sendrecv_replace redundant?
与正常的 Sendrecv 操作相比,我了解到 _replace 使用相同的内存位置、计数和数据类型。
经过一些阅读,我发现它应该可以防止缓冲区重叠,但是 Sendrecv 不能也起到同样的作用吗?
谁能解释一下操作后的数据是怎么回事?
典型用法示例会很有帮助
谢谢
将 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
,它在内部执行与上述伪代码等效的操作,并正确处理非连续类型。
我很难想出这种交换的常见用例。在大多数情况下,例如对于 halo 交换,通常使用不相交缓冲区的发送-接收操作就足够了。
与正常的 Sendrecv 操作相比,我了解到 _replace 使用相同的内存位置、计数和数据类型。
经过一些阅读,我发现它应该可以防止缓冲区重叠,但是 Sendrecv 不能也起到同样的作用吗?
谁能解释一下操作后的数据是怎么回事?
典型用法示例会很有帮助
谢谢
将 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
,它在内部执行与上述伪代码等效的操作,并正确处理非连续类型。
我很难想出这种交换的常见用例。在大多数情况下,例如对于 halo 交换,通常使用不相交缓冲区的发送-接收操作就足够了。