正如我们所知,在发送操作期间有一个叫做MPI发送缓冲区的东西。 以下代码:
MPI_Isend(data, ..., req);
...
MPI_Wait(req, &status)
在data
和MPI_Isend
之间使用MPI_Wait
是否安全?
这意味着,MPI_Isend
会使用data
作为内部发送缓冲区吗?
此外,如果我不再使用data
,我是否可以指示MPI使用data
作为发送缓冲区,而不是浪费时间来复制data
?
MPI_Bsend
,但我不认为在这种情况下可以节省内存和时间。
答案 0 :(得分:2)
在data
和MPI_Isend
之间使用MPI_Wait
绝对不能保存。
在MPI_Isend
和MPI_Wait
之间,您实际上并不知道何时data
可以重复使用。只有在MPI_Wait
之后,您才能确定已发送data
并且您可以重复使用它。
如果您不再使用data
,则应在程序结束时致电MPI_Wait
。
答案 1 :(得分:2)
MPI提供两种操作:阻止和非阻止。两者之间的区别在于重用传递给MPI函数的数据缓冲区是安全的。
当MPI_Send
之类的阻止调用返回时,MPI库不再需要缓冲区,可以安全地重复使用。另一方面,非阻塞调用仅启动相应的操作并让它以异步方式继续。只有成功调用MPI_Wait
之类的例程或MPI_Test
之后的测试结果之后,才能安全地重用缓冲区。
关于库如何利用用户缓冲区,这是非常特定于实现的。出于性能原因,通常将较短的消息复制到内部(对于MPI库)缓冲区。较长的消息通常直接从用户缓冲区读取并发送到网络,因此MPI正在使用缓冲区,直到整个消息被发送为止。