关于MPI发送模式的一些疑问

时间:2016-09-01 17:12:02

标签: mpi

我试图了解MPI发送模式的具体情况(send,bsend,ssend,rsend),我还有下一个问题:

  1. MPI_Send使用一些缓冲区,如果没有初始化适当的MPI_ | i | recv并且消息大小不是太大而且没有超过缓冲区大小(否则,MPI_Send将等待适当的recv)。我知道,这是真的(这里描述的情况:Deadlock with MPI)。
  2. MPI_Bsend仅在未初始化的适当recv时使用缓冲区(表示为MPI_Buffer_attach函数)。 这是真的吗?
  3. MPI_Bsend的缓冲区与MPI_send的缓冲区相同吗?
  4. MPI_Ssend从不使用缓冲区。 这是真的吗? 或MPI_Ssend的行为,如MPI_Send(缓冲区使用,如果邮件大小未超过缓冲区大小)?
  5. 如果对我的问题给出答案"它不是真的",你能不能给我详细的答案和解释?

1 个答案:

答案 0 :(得分:0)

MPI_Send精确行为可能会根据实施情况而有所变化。此外,某些实现允许用户调整阈值大小。

查看MPI's Send Modes以获取一些详细信息。如果要确保程序可移植到其他MPI实现,请参阅MPI标准(第3.4节:通信模式)。对于标准模式(MPI_Send),这是标准所说的内容(截至MPI 3.1)。

  

第3.2.1节中描述的发送呼叫使用标准通信模式。在此模式下,由MPI决定是否缓存外发消息。 MPI可以缓冲传出消息。在这种情况下,发送调用可以在调用匹配的接收之前完成。另一方面,出于性能原因,缓冲区空间可能不可用,或者MPI可能选择不缓冲传出消息。在这种情况下,发送呼叫将不会完成,直到匹配的接收已发布,并且数据已移至   接收机。

     

因此,无论匹配接收是否具有,都可以开始标准模式的发送   已发布。它可以在发布匹配的接收之前完成。发送标准模式   非本地:成功完成发送操作可能取决于发生的情况   匹配的接收。

您遇到的主要误解是,如果接收方进程未调用MPI_Send,您认为MPI_Recv使用缓冲。实际上,它通常取决于邮件大小,无论是否已调用匹配的接收

如果使用缓冲,则在将数据复制到临时缓冲区后释放用户的发送缓冲区。然后,无论是否已发出相应的接收,程序都可以继续执行。