【问题标题】:MPI : getting number of nodes (not processes) in a communicatorMPI:获取通信器中的节点数(不是进程)
【发布时间】:2012-01-08 23:36:48
【问题描述】:

我正在 SMP 超级计算机上使用 MPI 程序。我想确定哪些进程共享同一个节点,例如通过设置一个整数键,该键在同一个节点上的所有进程中都相等,并且从一个节点到另一个节点不同。然后,目标是使用此密钥拆分通信器,并让子通信器仅收集同一节点中的进程。

所以函数看起来像

int identify_node(MPI_Comm* comm); // returns a key characterizing a node

假设一个简单的进程分布,如 node_1 上的 0、1、2、3、node_2 上的 4、5、6、7 等。这是一个简单的公式问题,但我想达到相同的结果不假设分布。

我知道如何使用 MPI_Get_processor_name 来做到这一点:通过计算名称的哈希值并假设没有两个名称会得到相同的哈希值(我不喜欢这样,因为如果有一天我有两个名称具有相同的哈希值,这将很难跟踪问题),或者使用某种跨进程的协议算法(哪个?我还不知道)。

您将如何做到这一点(如果可能,高效)?

马修

【问题讨论】:

    标签: c mpi communicator


    【解决方案1】:

    你说得对,对分布的假设是不明智的,因为排名重新排序实际上是一种新兴的技术,它以牺牲规律性为代价来提高性能。

    MPI_Get_processor_name 的返回值的一个好的散列算法应该是相当安全的,但如果你想仔细检查,你总是可以使用 MPI_Gatherv 收集每个组中的实际名称并直接比较它们。

    this question 似乎解决了同样的问题。

    【讨论】:

    • 谢谢,你提到的问题确实很接近。我想我会按照您的建议做:获取处理器名称的哈希值,然后使用 MPI_Gatherv 执行第二次检查。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2022-08-23
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2015-03-22
    相关资源
    最近更新 更多