isend和issend有什么区别?

cod*_*epk 15 mpi

需要澄清我对发送类型中给出的isend和issend的理解

我的理解是,一旦发送缓冲区空闲,即所有数据都被释放后,isend将返回.另一方面,Issend仅在收到获取/未获取整个数据的确认时才返回.这就是全部吗?

Sig*_*ndo 20

双方MPI_Isend()MPI_Issend()立即返回,但在这两种情况下,你不能马上使用的发送缓冲区.

认为有之间的差异MPI_Send()MPI_Ssend():

  • MPI_Send() 如果缓冲区太大而无法在本地缓冲,则可以缓冲或者它可以是同步的,并且在这种情况下,它等待完成将数据发送到相应的接收操作.

  • MPI_Ssend() 始终是同步的:它总是等待完成将数据发送到相应的接收操作.

相应的"I" -operations的内部工作非常相似,除了一个事实,即他们都不会阻塞(立即返回):区别只是了MPI库的信号,您可以使用发送用户程序-buffer(即:MPI_Wait()返回或MPI_Test()返回true- 非阻塞发送的所谓发送完成操作):

  • MPI_Isend()可能发生这种情况既可以当数据已经由MPI库拥有的缓冲本地复制,如果下面的"同步门槛",或者当数据被实际移动到同级任务:发送完成操作可以是本地的,如果底层发送操作被缓冲.

  • 使用MPI_Issend()MPI不会在本地缓冲数据,只有在数据实际传输完成后才会返回"无缓冲条件"(并且可能在低级别执行):发送完成操作是非本地的.

MPI标准文件是在这些方面很迂腐.请参见3.7非阻塞通信一节.

  • 1澄清:MPI定义同步发送 - 无论它们是否阻塞 - 将在接收器*已启动*接收消息时完成.具体来说:完成同步确实*不*意味着接收器已完全接收到消息.实际上,MPI实现很常见 - 包括Open MPI,至少在很多情况下 - 允许在a)本地发送所有msg时完成同步发送,b)当它收到某种形式的ACK时从接收器返回,指示接收器已匹配和/或开始接收消息. (4认同)