我知道MPI_Send()
是一个阻塞调用,它会一直等待,直到可以安全地修改应用程序缓冲区以便重用为止。为了使发送调用同步(应该与接收方握手),我们需要使用MPI_Ssend()
。我想知道这两者之间的区别。假设我需要在进程中发送固定数量的字节,哪个进程需要更长的时间?
对于我来说,代码可以很好地调用MPI_Send(),但是会无限期地等待MPI_Ssend()。可能的原因是什么?
最重要的是,我非常确定在使用MPI_Send()
时,数据是在接收过程中接收到的,所以在使用MPI_Ssend()
时,这种推断不会导致任何有利于等待握手的事情。
或者,我可以得出一个结论:使用MPI_Send()
可以向自身进程发送数据,但不能使用MPI_Ssend()
?
发布于 2013-07-11 20:41:11
两者之间有一个很小但很重要的区别(您可以在3.4节的MPI 3.0 Standard文档中找到它)。对于常规的MPI_SEND
,当缓冲区可供重用时,实现将返回到应用程序。这可能是在接收进程实际发送接收之前。例如,当一条小消息被复制到内部缓冲区中,并且不再需要应用程序缓冲区时,可能会发生这种情况。但是,对于可能未在内部缓冲的大型消息,调用可能不会返回,直到将足够的消息发送到不再需要缓冲区的远程进程。
这与MPI_SSEND
的不同之处在于,后者将始终等待,直到接收端发布了接收。即使消息很小并且可以在内部缓冲,它仍然会等待,直到消息在另一端开始接收。
例如,MPI_SSEND
是一种确保两个进程在执行过程中都达到某个点的方法,而不必执行MPI_BARRIER
。如果您的应用程序在同一级别之间进行发送和接收,则执行MPI_SEND
或MPI_SSEND
都是不安全的,因为这两种操作都可能无限期地阻塞。相反,您应该使用MPI_ISEND
和MPI_IRECV
,以便调用将立即返回,并且可以同时完成实际的发送/接收(在对MPI_WAITALL
的调用中)。
https://stackoverflow.com/questions/17582900
复制相似问题