【问题标题】:How does MPI_Send work when the application buffer size is greater than MPI buffer size?当应用程序缓冲区大小大于 MPI 缓冲区大小时,MPI_Send 如何工作?
【发布时间】:2015-06-28 20:28:59
【问题描述】:

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

【问题讨论】:

    标签: mpi


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的回答!还有一个疑问:当 MPI 遵循集合协议时,它是一次性传输整个缓冲区还是“分段”传输。如果是这种情况,这些碎片的尺寸是多少(可能会有所不同,但取决于哪些参数)?...
    • 它可以是任何东西。它会根据您发送的消息数量、可用内存等发生很大变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2013-04-12
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多