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



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

MPI消息中涉及到几种不同类型的缓冲区,所以我想弄清楚它们各自的作用。

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

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

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

最新更新