2

我想在集群的每台机器上轻松地独立执行集体通信。假设我有 4 台机器,每台机器有 8 个内核,我的 MPI 程序将运行 32 个 MPI 任务。我想要的是,对于给定的功能:

  • 在每台主机上,只有一个任务执行计算,其他任务在此计算期间不执行任何操作。在我的示例中,4 个 MPI 任务将执行计算,另外 28 个正在等待。
  • 一旦计算完成,每个 MPI 任务将只与本地任务(在同一主机上运行的任务)执行集体通信。

从概念上讲,我知道我必须为每个主机创建一个通信器。我四处搜寻,并没有发现任何明确的做法。我对 MPI 组和沟通者不太满意。这是我的两个问题:

  • 这种行为是否MPI_Get_processor_name足够独特?
  • 更一般地说,你有一段代码这样做吗?
4

3 回答 3

6

规范说MPI_Get_processor_name返回“实际(而不是虚拟)节点的唯一说明符”,所以我认为你可以接受。我猜你会收集所有的主机名,然后分配处理器组来制作它们的通信器;或复制 MPI_COMM_WORLD,将名称转换为整数散列,并使用 mpi_comm_split 对集合进行分区。

您还可以采用 janneb 建议的方法并使用特定于实现的选项来 mpirun 以确保 MPI 实现以这种方式分配任务;OpenMPI 使用 --byslot 来生成这个排序;使用 mpich2 您可以使用 -print-rank-map 查看映射。

但这真的是你想要做的吗?如果其他进程在一个处理器工作时处于空闲状态,这比每个人都冗余地进行计算有什么好处呢?(或者这是非常占用内存或 I/O 的,你担心争用吗?)如果你要做很多这样的事情——处理节点上的并行化与节点外的并行化非常不同——那么您可能需要考虑混合编程模型 - 每个节点运行一个 MPI 任务和 MPI_spawning 子任务或使用 OpenMP 进行节点通信,这两者都是 HPM 所建议的。

于 2010-10-28T12:17:08.487 回答
2

我不认为(受过教育的想法,不是确定的)你将能够完全从你的 MPI 程序中做你想做的事情。

系统对调用的响应MPI_Get_processor_name取决于系统;在您的系统上,它可能会根据需要返回node00, node01, node02node03或者它可能会my_big_computer针对您实际运行的任何处理器返回。前者的可能性更大,但不能保证。

一种策略是启动 32 个进程,如果您可以确定每个进程在哪个节点上运行,则将您的通信器分成 4 个组,每个节点上一个。通过这种方式,您可以根据需要自行管理内部和内部通信。

另一种策略是启动 4 个进程并将它们固定到不同的节点。如何将进程固定到节点(或处理器)将取决于您的 MPI 运行时和您可能拥有的任何作业管理系统,例如 Grid Engine。这可能会涉及设置环境变量——但您没有告诉我们有关您的运行时系统的任何信息,因此我们无法猜测它们可能是什么。然后,您可以让 4 个进程中的每一个动态生成另外 7 个(或 8 个)进程,并将它们固定到与初始进程相同的节点。为此,请阅读交互器主题和运行时系统的文档。

第三种策略(现在有点疯狂)是启动 4 个单独的 MPI 程序(每个程序 8 个进程),在集群的每个节点上启动一个,并在它们执行时加入它们。阅读MPI_Comm_connectMPI_Open_port了解详情。

最后,为了更有趣,您可以考虑混合您的程序,在每个节点上运行一个 MPI 进程,并让每个进程执行一个 OpenMP 共享内存(子)程序。

于 2010-10-28T11:04:08.897 回答
1

Typically your MPI runtime environment can be controlled e.g. by environment variables how tasks are distributed over nodes. The default tends to be sequential allocation, that is, for your example with 32 tasks distributed over 4 8-core machines you'd have

  • machine 1: MPI ranks 0-7
  • machine 2: MPI ranks 8-15
  • machine 3: MPI ranks 16-23
  • machine 4: MPI ranks 24-31

And yes, MPI_Get_processor_name should get you the hostname so you can figure out where the boundaries between hosts are.

于 2010-10-28T10:54:31.220 回答