【问题标题】:Is `MPI_COMM_WORLD` a bad idea if only pairs of ranks ever communicate?如果只有成对的等级进行通信,那么“MPI_COMM_WORLD”是不是一个坏主意?
【发布时间】:2019-07-31 11:06:55
【问题描述】:

我对 MPI 的经验很少,所以请原谅这个问题的幼稚。

我有一个我认为是一个相对简单的 MPI 程序:需要计算大量独立的任务,并组装成一定的数组。我通过让所有等级与等级 0 对话、请求新条目进行计算并将结果报告回等级 0 来做到这一点。每次通信大约只有数百个字节,并且总是发生在等级 0 和任何一个之间其他等级。在这样的设置中保持MPI_COMM_WORLD 通信器中的所有等级是一个坏主意吗?我应该分成一堆单独的通信器,包括或排名 0 和 1、排名 0 和 2、排名 0 和 3、...、排名 0 和 n?或者,只要所有通信都转到另一个等级,就可以留在MPI_COMM_WORLD

【问题讨论】:

    标签: mpi scalability


    【解决方案1】:

    通讯器是重量级的物体。创建一个新的通信器需要时间并消耗内部 MPI 资源。

    最好为以下情况创建新的传播者:

    • 当应用程序中的不同抽象层需要“安全”时 沟通范围。
    • 当您需要从一个 父沟通者(例如,你有一个重要的操作,只有 需要由MPI_COMM_WORLD 中的一半进程执行)。
    • 当您需要从父通信器重新排序进程时 (例如,您的 MPI 进程具有不同的逻辑顺序 比他们的“原生”MPI_COMM_WORLD 排名)。

    简而言之:仅当您需要一个全新的/安全的通信范围,或者您需要更改现有范围(例如,子集和/或重新排序成员进程)时才创建新的通信器。

    参考:Here

    【讨论】:

    • 我很困惑。不是每个类似发送和接收的操作都需要一个通信器吗?
    • 是否将“在何时使用通信器”替换为“仅在何时创建新的通信器”会让您不那么困惑?
    • @gspr 是的,沟通者是必要的。我说的是创造新的沟通者。对困惑感到抱歉。我已经更新了答案。
    • @GillesGouaillardet:是的,谢谢。不过,我仍然对一件事感到困惑:如果发生只有一个发送者和接收者的发送/接收,那么对于拥有数千名成员的通信器是否会受到惩罚?
    • 理论上这取决于实现。话虽如此,我预计不会受到重大处罚。
    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2010-11-29
    • 1970-01-01
    • 2012-01-21
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多