当应用程序缓冲区大小大于MPI缓冲区大小时,MPI_Send如何工作?

时间:2015-04-21 15:12:33

标签: mpi

如果发送数据的大小大于MPI缓冲区大小,MPI_Send()如何将数据传递给接收进程?例如,假设我想在单个发送消息中发送10个字节的数据(即,我的应用程序缓冲区的大小为10B),但MPI缓冲区的固定大小为6B。在这种情况下,MPI_Send()如何发送数据?它首先转移6B然后转移剩余的4B吗?或者只传输6B?

1 个答案:

答案 0 :(得分:4)

MPI消息中涉及一些不同类型的缓冲区,因此我想清楚说明它们各自的作用。

  1. 应用程序缓冲区 - 这些缓冲区由您的应用程序分配和管理。您的数据存储在这些数据中,您使用这些数据进行计算,将这些数据传递给MPI,告诉它在哪里发送或接收数据。它们的大小或大于您的数据。

  2. 内部缓冲区 - 这些缓冲区是MPI的内部缓冲区,甚至可能存在也可能不存在。 MPI标准中没有关于这些缓冲区或它们应该如何行动,它们应该有多大等等。但是,你可以做出一些合理的假设。

    • 通常会有一些内部缓冲区用于加速数据传输,尤其是小型邮件。如果您的消息足够小,可以将其复制到此缓冲区中以便稍后进行排队等待传输。如果您执行非常小的MPI_SEND,通常会发生这种情况。呼叫将立即返回,但数据可能已经或可能没有实际发送到接收进程。接收端有类似的缓冲区,因此如果在应用程序提供可以存储数据的应用程序缓冲区之前到达一条小消息,则可以将其丢弃到这些较小的内部缓冲区之一,直到指定了最终目标。这通常称为 eager protocol
    • 有时,内部缓冲区要么全部用完,要么太小,无法将邮件复制到其中。在这种情况下,MPI会回退到会合协议。在这种情况下,MPI通常根本不使用内部缓冲区,但保留对应用程序缓冲区的控制并直接从那里发送数据。如果发生这种情况,您对MPI_SEND的调用将不会返回,直到使用缓冲区完成MPI库,并且您的应用程序可以安全地再次修改数据。
  3. 特殊缓冲区 - 还有其他类型的缓冲区可以提供特殊服务,例如网卡上可以加速数据传输的缓冲区。这些行为的方式通常特定于您正在使用的网络类型。