按主机分组MPI任务

按主机分组MPI任务,mpi,communicator,Mpi,Communicator,我想在集群的每台机器上轻松地独立执行集体通信。假设我有4台机器,每台机器上有8个内核,我的MPI程序将运行32个MPI任务。我想要的是,对于给定的函数: 在每台主机上,只有一个任务执行计算,其他任务在此计算期间不执行任何操作。在我的示例中,4个MPI任务将进行计算,其他28个任务正在等待 计算完成后,每个主机上的每个MPI任务将只执行与本地任务(在同一主机上运行的任务)的集体通信 从概念上讲,我理解我必须为每个主机创建一个通信器。我到处找了找,没有发现任何明确的证据。我对MPI小组和沟通者不

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

  • 在每台主机上,只有一个任务执行计算,其他任务在此计算期间不执行任何操作。在我的示例中,4个MPI任务将进行计算,其他28个任务正在等待
  • 计算完成后,每个主机上的每个MPI任务将只执行与本地任务(在同一主机上运行的任务)的集体通信
从概念上讲,我理解我必须为每个主机创建一个通信器。我到处找了找,没有发现任何明确的证据。我对MPI小组和沟通者不是很满意。以下是我的两个问题:

  • MPI\u Get\u processor\u name对于这种行为是否足够独特
  • 更一般地说,您是否有这样做的代码

通常,您的MPI运行时环境可以通过环境变量(例如任务在节点上的分布方式)进行控制。默认情况下倾向于顺序分配,也就是说,在您的示例中,32个任务分布在4台8核机器上

  • 机器1:MPI排名0-7
  • 机器2:MPI排名8-15
  • 机器3:MPI排名16-23
  • 机器4:MPI排名24-31
是的,MPI_Get_processor_name应该为您提供主机名,这样您就可以找出主机之间的边界。

我认为(受过教育的想法,不是确定的)您不能完全在MPI程序中完成您想要的任务

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

一种策略是启动32个进程,如果您可以确定每个进程在哪个节点上运行,则将通信器划分为4个组,每个节点上一个。通过这种方式,您可以按照自己的意愿管理内部和内部通信

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

第三种策略(现在有点疯狂)是启动4个独立的MPI程序(每个进程8个),在集群的每个节点上启动一个,并在执行时加入它们。有关详细信息,请阅读有关MPI\u通信连接和MPI\u开放端口的信息


最后,对于额外的乐趣,您可以考虑混合程序,在每个节点上运行一个MPI进程,并使每个进程执行OpenMP共享内存(子)程序。

< P>规范说:<代码> MPIGETGETPrimor OrthNo.<代码>返回“实际(相对于虚拟)节点的唯一说明符”,所以我想你不会介意的。我想你应该收集所有的主机名,然后分配处理器组,让它们进行通信;或dup MPI_COMM_WORLD,将名称转换为整数散列,并使用MPI_COMM_split对集合进行分区

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


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

MPI\u Comm\u split对我来说似乎是最好的解决方案。我正在测试它,但我想知道OpenMPI如何处理它。如果通信器中的任务都属于同一主机,OpenMPI是否足够智能,可以仅使用共享内存执行Bcast?是否可以将策略分配给通信器或bcast?关于最后一个问题:为什么这样更好?我正在做一个大型HPC项目的一小部分。混合方法MPI+OpenMP已经过测试,但我正在使用的版本是纯MPI。在此阶段,1个核心=1个MPI任务。在程序中的某个时刻,MPI任务调用Lapack函数。所有内核对相同的数据执行相同的功能。其思想是在每个主机上执行此功能,但仅通过1个MPI任务,使用此功能的并行实现。我只是希望(Lapack\u fc/nb\u core+Bcast\u time)