23

我知道MPI_Send()这是一个阻塞调用,它一直等到可以安全地修改应用程序缓冲区以供重用。为了使发送调用同步(应该与接收者握手),我们需要使用MPI_Ssend(). 我想知道两者的区别。假设我需要在进程之间发送固定数量的字节,哪一个应该花费更长的时间?
对我来说,代码在 MPI_Send() 调用中运行良好,但无限期地等待 MPI_Ssend()。可能的原因是什么?

最重要的是,我很确定在使用时在接收过程中接收到数据MPI_Send(),所以这个推断并没有导致在使用时等待握手MPI_Ssend()

或者我可以得出一个结论:MPI_Send()您可以将数据发送到自我进程但不能使用MPI_Ssend()

4

1 回答 1

44

两者之间有一个很小但很重要的区别(您可以在第 3.4 节的MPI 3.0 标准文档中找到它)。使用常规MPI_SEND的 ,当缓冲区可供重用时,实现将返回到应用程序。这可能是在接收进程实际发布接收之前。例如,可能是当一条小消息被复制到内部缓冲区并且不再需要应用程序缓冲区时。但是,对于可能不在内部缓冲的大消息,调用可能不会返回,直到足够的消息已发送到不再需要缓冲区的远程进程。

这之间的区别在于MPI_SSEND后者将始终等到接收已发布到接收端。即使消息很小并且可以在内部缓冲,它仍然会等到消息已经开始在另一端接收。

MPI_SSEND是一种确保两个进程在执行过程中都达到某个点而无需执行的MPI_BARRIER方法,例如。如果您的应用程序在同一个等级之间发送和接收,那么执行任何一个MPI_SENDOR都不安全MPI_SSEND,因为任何一个都可能无限期地阻塞。相反,您应该使用MPI_ISENDandMPI_IRECV以便调用将立即返回,并且可以同时完成实际的发送/接收(在对 的调用中MPI_WAITALL)。

于 2013-07-11T12:41:10.547 回答