当我们在群集上使用命令mpirun -np 4 a.out
启动MPI程序时,那么
MPI运行时系统如何在CPU中分配进程?
我的意思是,假设它在集群中找到一个空闲的四核CPU,它会运行该CPU上的所有4个进程,还是会找到4个CPU并运行4个进程,每个CPU有1个进程?
这取决于MPI的具体实现吗?
我是否应该为MPI为我选择的特定配置(一个CPU上的4个进程或4个CPU上每个CPU的1个进程)烦恼
答案 0 :(得分:4)
是的,这取决于MPI的实施,是的,这很重要。例如,如果您希望每个MPI任务能够使用一个内存节点,并且您发现自己在一个节点上加载4个任务而在其他节点上没有任何内容,那么您将遇到严重的问题。类似地,如果您运行4个8核节点,并且运行4 mpi任务,每个8个OpenMP线程,那么对于4个节点中的每个节点使用1个任务和8个线程,或者4个任务和32个线程之间存在很大差异在一个节点上,而在其他节点上没有任何内容。
x86类型硬件上最常见的MPI实现是基于OpenMPI或MPICH2。 OpenMPI将在进入下一个节点之前填满一个节点;你可以改变那种行为,例如,给它“--bynode”选项,它将一个任务分配给一个节点,下一个任务分配给下一个,等等,然后根据需要再次回绕到第一个节点。 (OpenMPI还有--bysocket和--bycore用于更精细的控制,以及非常有用的--display-map选项,它可以准确显示正在进行的操作)。
使用基于mpich2的MPI,您可以为它提供“循环”的-rr选项,它将在节点之间循环(例如,OpenMPI的--bynode行为)。
在任何一种情况下,在linux类型的系统上,你总是可以运行例如'mpirun -np 4 hostname'作为一种快速而又脏的方法来找出你的mpirun命令将启动进程的主机。