一位同事最近观察到一些奇怪的行为,我已经能够重现它。我们有一台模拟计算机,由两个Xeon处理器驱动,每个处理器有18个内核,可以使用36个内核。
当我们使用2个进程启动应用程序时,mpi始终绑定在套接字0的核0和1上。因此,如果我们使用2个进程运行4个模拟,则核0和1正在使用CPU执行所有工作 - 每个过程的使用率为25%。
请参阅下面报告的MPI绑定。当我们为每个模拟使用2个以上的进程时,MPI的行为与预期的一样,即当运行4个模拟时,每个进程使用3个进程,然后12个内核正在处理每个进程具有100%的CPU使用率。
[user@apollo3 tmp]$ mpirun -np 2 --report-bindings myApp -parallel > run01.log &
[1] 5374
[user@apollo3 tmp]$ [apollo3:05374] MCW rank 0 bound to socket 0[core 0[hwt 0]]: [B/././././././././././././././././.][./././././././././././././././././.]
[apollo3:05374] MCW rank 1 bound to socket 0[core 1[hwt 0]]: [./B/./././././././././././././././.][./././././././././././././././././.]
[user@apollo3 tmp]$ mpirun -np 2 --report-bindings myApp > run02.log &
[2] 5385
[user@apollo3 tmp]$ [apollo3:05385] MCW rank 0 bound to socket 0[core 0[hwt 0]]: [B/././././././././././././././././.][./././././././././././././././././.]
[apollo3:05385] MCW rank 1 bound to socket 0[core 1[hwt 0]]: [./B/./././././././././././././././.][./././././././././././././././././.]
MPI的这种绑定行为可能是什么原因?
我们在我们的机器上运行OpenMPI 1.10
[user@apollo3 tmp]$ mpirun --version
mpirun (Open MPI) 1.10.0
答案 0 :(得分:0)
长话短说,这不是一个错误,而是一个功能。
mpirun
的各种实例彼此之间没有通信,因此每个MPI作业都认为它在系统上单独运行,因此使用内核0和1。
最简单的选择是,如果您知道将在同一台计算机上运行多个作业,则禁用绑定。
mpirun -bind-to none ...
会做到这一点。
更好的选择是使用资源管理器(例如SLURM,PBS或其他)并确保构建Open MPI以支持它。 资源管理器将为每个作业分配不同的核心集,因此不会有更多的重叠。
最近提出了一个类似的问题,请参阅How to use mpirun to use different CPU cores for different programs?
中的另一个选项