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