如果发送数据的大小大于MPI缓冲区大小,MPI_Send()
如何将数据传递给接收进程?例如,假设我想在单个发送消息中发送10个字节的数据(即,我的应用程序缓冲区的大小为10B),但MPI缓冲区的固定大小为6B。在这种情况下,MPI_Send()
如何发送数据?它首先转移6B然后转移剩余的4B吗?或者只传输6B?
答案 0 :(得分:4)
MPI消息中涉及一些不同类型的缓冲区,因此我想清楚说明它们各自的作用。
应用程序缓冲区 - 这些缓冲区由您的应用程序分配和管理。您的数据存储在这些数据中,您使用这些数据进行计算,将这些数据传递给MPI,告诉它在哪里发送或接收数据。它们的大小或大于您的数据。
内部缓冲区 - 这些缓冲区是MPI的内部缓冲区,甚至可能存在也可能不存在。 MPI标准中没有关于这些缓冲区或它们应该如何行动,它们应该有多大等等。但是,你可以做出一些合理的假设。
MPI_SEND
,通常会发生这种情况。呼叫将立即返回,但数据可能已经或可能没有实际发送到接收进程。接收端有类似的缓冲区,因此如果在应用程序提供可以存储数据的应用程序缓冲区之前到达一条小消息,则可以将其丢弃到这些较小的内部缓冲区之一,直到指定了最终目标。这通常称为 eager protocol 。MPI_SEND
的调用将不会返回,直到使用缓冲区完成MPI库,并且您的应用程序可以安全地再次修改数据。