isend和issend有什么区别?

时间:2014-02-02 16:26:04

标签: mpi

需要澄清我对Send Types

中给出的isend和issend的理解

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

2 个答案:

答案 0 :(得分:18)

MPI_Isend()MPI_Issend()都会立即返回,但在这两种情况下都无法立即使用发送缓冲区。

想一想MPI_Send()MPI_Ssend()之间存在的差异:

  • MPI_Send()可以缓冲,如果缓冲区也可以同步 大到本地缓冲,在这种情况下,它等待完成发送 数据到相应的接收操作。

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

相应的“I”操作的内部工作非常相似,除了它们都不阻塞(立即返回)的事实:差异只是 MPI库信号时对于可以使用发送缓冲区的用户程序(即:MPI_Wait()返回或MPI_Test()返回true - 非阻塞发送的所谓发送完成操作):

    带有MPI_Isend()
  • 当数据已在MPI库拥有的缓冲区中本地复制,如果低于“同步阈值”,或者数据实际已移至兄弟任务:发送完成操作可以是本地的,以防底层发送操作被缓冲。

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

MPI standard document在这些方面非常迂腐。请参见3.7非阻塞通信。

答案 1 :(得分:0)

正确。显然,只有当您通过MPI_ISENDMPI_ISSEND函数完成对MPI_WAIT*MPI_TEST*的调用的请求时,这两种情况才会成立。