【问题标题】:Some questionts about MPI send modes关于 MPI 发送模式的一些问题
【发布时间】:2016-09-01 17:12:01
【问题描述】:

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

  1. 如果 MPI_Send 未初始化适当的 MPI_|i|recv 且消息大小不太大且未超出缓冲区大小,则 MPI_Send 使用一些缓冲区(否则,MPI_Send 将等待适当的接收)。我知道,这是真的(这里描述的这种情况:Deadlock with MPI)。
  2. MPI_Bsend 仅在未初始化适当的接收时才使用缓冲区(表示为 MPI_Buffer_attach 函数)。 是真的吗?
  3. MPI_Bsend 的缓冲区与 MPI_send 的缓冲区相同吗?
  4. MPI_Ssend 从不使用缓冲区。 是真的吗? 或 MPI_Ssend 的行为类似于 MPI_Send(缓冲区使用,如果消息大小未超过缓冲区大小)?

如果对我的问题的回答“这不是真的”,你能不能给我详细的回答和解释?

【问题讨论】:

  • 你能清楚地重申你的问题,尤其是第一个问题吗?
  • 你的问题在目前的状态下很难理解,但初步的答案是:1.它是依赖于实现的; 2. 不真实; 3. 不真实; 4. 同步发送永远不会被缓冲。
  • 同步发送可以在目标进程上缓冲,作为一种减少延迟的方法,如果接收者相对于发送者晚了。哎呀,实现也可以合法地在发送过程中缓冲同步发送,这看起来很愚蠢。一个有意义的情况是在发送非连续类型时,使用只能处理连续缓冲区的网络。所以,序列化成一个缓冲区,然后在接收者匹配之前不要完成操作。

标签: mpi


【解决方案1】:

MPI_Send 的精确行为可能会因实施而异。此外,一些实现允许用户调整阈值大小。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 2011-07-30
    • 1970-01-01
    • 2018-08-30
    • 2012-03-13
    • 1970-01-01
    • 2016-09-07
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多