【问题标题】:Classify node processes together with MPI and FORTRAN将节点进程与 MPI 和 FORTRAN 一起分类
【发布时间】:2013-08-10 09:51:15
【问题描述】:

我正在尝试使用 MPI 和 Fortran 实现将位于同一节点上的进程与组分开。 MPI 有可以识别的例程吗?

我的想法是通过它们的主机名来分隔这些进程,这在我正在使用的机器的节点上是相同的。但我不知道它是否适用于所有集群。

【问题讨论】:

    标签: multiprocessing mpi nodes hostname cpu-cores


    【解决方案1】:

    您可能想查看 MPI_COMM_SPLIT_TYPE。它将允许您根据作为参数传入的split_type 拆分现有通信器:

    int MPI_Comm_split_type(MPI_Comm comm, int split_type, int key,
                            MPI_Info info, MPI_Comm *newcomm)
    

    目前,唯一的 split_type 是MPI_COMM_TYPE_SHARED,在标准中定义为:

    这种类型将通信器拆分为子通信器,每个子通信器 可以创建共享内存区域。

    这通常与您所要求的相同,但您必须在您的机器上仔细检查它是否属实。

    您需要知道的另一件事是,这是 MPI-3 中的一个新功能,因此它可能不适用于所有 MPI 实现。我知道它适用于MPICH 及其衍生产品。 AFAIK,它在 Open MPI 的最新版本中不可用。因此,请确保您拥有真正支持它的 MPI 版本。

    【讨论】:

    • 韦斯利,谢谢。遗憾的是,这不适用于 Open MPI。虽然,让我举个例子,看看我是否理解这种拆分 type_ 的工作原理。假设我在 4 个 8 核节点上有 32 个进程。我的意图是基于同一节点上的共享内存进程创建 4 组 8 个内核。我可以使用 MPI_Comm_split_type。例如,使用这个我不能创建 8 个组,每组 4 个(在每个节点中放置 2 个组),可以吗?
    • 是的,你可以这样做。如果要创建 8 个组,每组 4 个,其中每个组位于节点的本地,则需要使用 key 参数,以便一半的进程贡献一个密钥,另一半贡献一个不同的密钥。这是现有调用 MPI_COMM_SPLIT 的行为,因此应该有很多教程供您学习。您只需要为新类型添加添加一点。
    • OpenMPI 设置环境变量 OMPI_COMM_WORLD_LOCAL_RANK 和 OMPI_COMM_WORLD_LOCAL_SIZE,您可以使用它们来找出有多少进程共享一个节点(“本地大小”)。
    • 我很确定你现在也可以在 Open MPI 中使用这个功能了。
    • 您可以将它与 Open MPI 1.8.x 一起使用。自 2013 年以来情况有所改善:)
    【解决方案2】:

    我已经为环境不提供 MPI 3.0 的系统实现了类似的拆分功能,并且它在多个集群上运行良好。它使用MPI_GET_PROCESSOR_NAME 并依赖于大多数集群 MPI 实现返回节点的 FQDN 作为结果的事实 - 使用 Open MPI 和 Intel MPI(基于 MPICH,因此其他 MPICH 衍生产品预期会有类似的行为)进行测试)。在伪代码中它是这样工作的:

    rank := MPI_COMM_RANK(communicator)
    prev_rank := rank - 1; IF (prev_rank < 0) prev_rank := MPI_PROC_NULL
    next_rank := rank + 1; IF (next_rank >= num_procs) next_rank := MPI_PROC_NULL
    
    proc_name := MPI_GET_PROCESSOR_NAME
    
    list := MPI_RECV(from prev_rank)
    IF (list does not contain proc_name) THEN
       list := list + proc_name
    END IF
    
    colour := index of proc_name in list
    key := rank
    
    MPI_SEND(list to next_rank)
    
    MPI_COMM_SPLIT(communicator, colour, key, newcomm)
    

    这段代码基本上构建了一个唯一的 MPI 处理器名称(主机名)列表,每个进程使用它的 MPI 处理器名称在这个列表中的位置作为通常拆分功能的颜色。在我的算法的 C 实现中,列表只是一个字符串 - 以零字节作为分隔符的所有项目的串联。在 Fortran 中,可以使用主机名中通常不允许使用的任何符号,例如;。然后字符串作为MPI_CHAR (C) 或MPI_CHARACTER (Fortran) 的数组简单地传递。

    【讨论】:

    • 这个机制适用于我遇到的所有机器,除了 Blue Gene/Q。在那里,处理器名称包括节点内的核心编号。您可以像这样构造自己的处理器名称:bitbucket.org/cactuscode/cactusutils/src/…>
    • 在 BG/Q 上,进程无法在内核之间迁移,因此在处理器名称中包含内核 ID 非常有意义。克雷呢?我已经有一段时间没有机会使用它了。
    • 我用过的 Crays 表现得像 Linux。
    猜你喜欢
    • 2015-03-22
    • 2012-10-09
    • 2014-01-06
    • 2013-01-02
    • 2013-08-14
    • 2015-02-18
    • 2015-06-09
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多