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

Pyt*_*ser 2 mpi

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

Wes*_*and 6

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

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

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

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