MPI_Send() 和 MPI_Ssend() 之间的区别?

Posted

技术标签:

【中文标题】MPI_Send() 和 MPI_Ssend() 之间的区别?【英文标题】:difference between MPI_Send() and MPI_Ssend()? 【发布时间】:2013-07-09 02:33:18 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

最重要的是,我很确定在使用 MPI_Send() 时接收过程中正在接收数据,因此这种推断不会导致在使用 MPI_Ssend( ) .我的代码在 MPI_Send() 上运行良好,但在 MPI_Ssend() 上无限期等待。你能想到任何可能的原因吗? 这完全取决于您的代码。如果由于某种原因您的代码在没有从 MPI_SEND 进展的情况下无法到达对 MPI_RECV 的匹配调用,这可能会导致死锁,但如果没有看到代码就无法判断。 ***.com/questions/17820445/…你能回答吗?

以上是关于MPI_Send() 和 MPI_Ssend() 之间的区别?的主要内容,如果未能解决你的问题,请参考以下文章

MPI学习3MPI并行程序设计模式:不同通信模式MPI并行程序的设计

使用 MPI_Send 和 MPI_Recv 未正确接收矩阵

使用 MPI_Send 和 MPI_Recv 实现 MPI_Scatter 的问题

MPI_SEND 占用大量虚拟内存

探测 MPI_Bcast 或 MPI_Send

为啥 MPI_SEND 在我的 for 循环中不起作用?如果明确说明它工作正常