需要澄清我对Send Types
中给出的isend和issend的理解我的理解是,一旦发送缓冲区空闲,即所有数据都被释放后,isend将返回。另一方面,Issend仅在收到获取/未获取整个数据的确认时返回。这就是它的全部吗?
答案 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_ISEND
或MPI_ISSEND
函数完成对MPI_WAIT*
或MPI_TEST*
的调用的请求时,这两种情况才会成立。