【问题标题】:Multiple MPI communications and performance多 MPI 通信和性能
【发布时间】:2019-09-25 10:51:06
【问题描述】:

我认为通过一个 MPI_Send()/MPI_Recv() 调用来传递一个大小为 100 字节的缓冲区比通过十个 MPI_Send()/MPI_Recv() 调用来传递一个大小为 10 字节的缓冲区要快。但是,如果我们想要传达 100 KB 或 100 MB 或更多而不是 100 个字节,该怎么办?什么时候 10 个字节与 10 个 MPI 调用的通信更快?是否有一般的经验法则可以帮助我们进行此类比较以加快编写代码的速度?

我之所以问这个问题,是因为在某些情况下,程序员必须在一次通信大量数据和通过不止一次通信的总数据量较小之间做出选择。

【问题讨论】:

    标签: performance mpi


    【解决方案1】:

    您可能会认为,对于相同的总音量,多次调用永远不会比一次调用更快。原因很简单,如果 MPI 实现速度更快,则可以简单地将单个调用在内部拆分为多个调用1。一般来说,建议以尽可能最高级别的方式使用 MPI API,即集体而不是 p2p,使用自定义复合数据类型而不是单个消息等。这也确保了程序最便携。

    也就是说,如果您对如何通过低级调整来提高性能有一个具体的想法,您应该在您的特定系统上衡量您的具体实施。毕竟,您的实现可能存在较大消息的特定问题。但是您应该更喜欢通过系统特定的调整(例如实现特定的急切消息阈值)来实现改进,因为这不会污染源代码。

    1: 如果您在考虑中包括数据生成/消耗,可以想象,由于流水线或缓存效应,多次调用会更快。但这很可能可以忽略不计。

    【讨论】:

    • 如果消息不必完全接收即可开始处理,并且您的库实现了进度线程,那么拆分消息可能更有效,以便您可以更早地开始处理它并重叠计算和通信。
    • 这是一个很好的观点。我最初没有考虑流水线,因为问题仅限于标准发送/接收(并且只关注通信,不包括任何计算部分)。但结合 Eager(部分)发送,这是可以想象的效果。
    猜你喜欢
    • 2019-09-15
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多