I know MPI_Send()
是一个阻塞调用,它会等待直到可以安全地修改应用程序缓冲区以供重用。为了使发送调用同步(应该与接收者握手),我们需要使用MPI_Ssend()
。
我想知道两者之间的区别。假设我需要在进程之间发送固定数量的字节,哪一个应该花费更长的时间?
对于我来说,代码在 MPI_Send() 调用中运行良好,但无限期地等待 MPI_Ssend()。
可能的原因是什么?
最重要的是,我很确定使用时接收进程正在接收数据MPI_Send()
,所以这个推论不会导致使用时等待握手MPI_Ssend()
.
或者我可以得出结论:MPI_Send()
您可以将数据发送到自我进程,但不能使用MPI_Ssend()
?
两者之间有一个微小但重要的区别(您可以在MPI 3.0 标准 http://mpi-forum.org/docs/mpi-3.0/mpi30-report.pdf#section.3.4文件第 3.4 节)。与定期MPI_SEND
,当缓冲区可供重用时,实现将返回给应用程序。这could在接收进程实际发布接收之前。例如,可能是当一条小消息被复制到内部缓冲区并且不再需要应用程序缓冲区时。但是,对于可能无法在内部缓冲的大型消息,调用可能不会返回,直到足够的消息已发送到远程进程而不再需要缓冲区为止。
这和之间的区别MPI_SSEND
是后者将always等待直到接收已在接收端发布。即使消息很小并且可以在内部缓冲,它仍然会等待直到另一端开始接收消息。
MPI_SSEND
是一种确保两个进程都在执行过程中达到某个点而无需执行任何操作的方法MPI_BARRIER
, 例如。如果您的应用程序在同一级别发送和接收数据,则执行任一操作都不安全MPI_SEND
OR MPI_SSEND
,作为任一could无限期地阻止。相反,你应该使用MPI_ISEND
and MPI_IRECV
这样调用将立即返回,并且可以同时完成实际的发送/接收(在调用MPI_WAITALL
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)