我知道MPI_Send()
是一个阻塞调用,它等待修改应用程序缓冲区以便重用是安全的。为了使发送调用同步(应该与接收者握手),我们需要使用MPI_Ssend()
。
我想知道两者之间的区别。假设我需要在进程中发送固定数量的字节,哪一个应该花费更长的时间?
对我来说,代码适用于MPI_Send()调用,但无限期地等待MPI_Ssend()。
可能的原因是什么?
最重要的是,我非常确定在使用MPI_Send()
时接收过程中是否收到了数据,因此这种推断无助于在使用MPI_Ssend()
时等待握手
或者我可以得出结论:使用MPI_Send()
您可以将数据发送到自我流程但不能使用MPI_Ssend()
?
答案 0 :(得分:34)
两者之间存在一个小但重要的区别(您可以在第3.4节的MPI Standard文档中找到它)。使用常规MPI_SEND
,当缓冲区可用于重用时,实现将返回到应用程序。这个可以在接收过程实际发布接收之前。例如,可能是当一条小消息被复制到内部缓冲区并且不再需要应用程序缓冲区时。但是,对于可能未在内部缓冲的大型消息,在将足够的消息发送到远程进程并且不再需要缓冲区之前,调用可能不会返回。
此与MPI_SSEND
之间的区别在于后者将始终等待接收已在接收端发布。即使消息很小并且可以在内部缓冲,它仍然会等到消息开始在另一端收到。
MPI_SSEND
是一种确保两个进程在执行中都达到某个点而无需执行MPI_BARRIER
的方法。如果您的应用程序在同一级别发送和接收,则执行MPI_SEND
或MPI_SSEND
是不安全的,因为任何一个都可以无限期地阻止。相反,您应该使用MPI_ISEND
和MPI_IRECV
,以便呼叫立即返回,并且实际的发送/接收可以同时完成(在MPI_WAITALL
的呼叫中)。