mpirun的奇怪行为,总是在启动2个进程时严格绑定到核心0和1

mpirun的奇怪行为,总是在启动2个进程时严格绑定到核心0和1,mpi,openmpi,Mpi,Openmpi,一位同事最近观察到了一些奇怪的行为,我已经能够重现这种行为。我们有一台用于模拟的计算机,它由两个Xeon处理器提供动力,每个处理器有18个内核,我们可以使用36个内核 当我们使用2个进程启动应用程序时,mpi总是绑定在套接字0的核心0和1上。因此,如果我们运行4个模拟,每个模拟使用2个进程,那么内核0和1将在每个进程的CPU使用率为25%的情况下完成所有工作 请参阅下面报告的MPI绑定。当我们为每个模拟使用2个以上的进程时,MPI的行为与预期的一样,即当运行4个模拟时,每个模拟使用3个进程,然后

一位同事最近观察到了一些奇怪的行为,我已经能够重现这种行为。我们有一台用于模拟的计算机,它由两个Xeon处理器提供动力,每个处理器有18个内核,我们可以使用36个内核

当我们使用2个进程启动应用程序时,mpi总是绑定在套接字0的核心0和1上。因此,如果我们运行4个模拟,每个模拟使用2个进程,那么内核0和1将在每个进程的CPU使用率为25%的情况下完成所有工作

请参阅下面报告的MPI绑定。当我们为每个模拟使用2个以上的进程时,MPI的行为与预期的一样,即当运行4个模拟时,每个模拟使用3个进程,然后12个内核与每个进程一起工作,每个进程的CPU使用率为100%

[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的这种绑定行为的原因是什么

我们在机器上运行OpenMPI1.10

[user@apollo3 tmp]$ mpirun --version
mpirun (Open MPI) 1.10.0

长话短说,这不是一个bug,而是一个特性

各种 
mpirun
彼此不通信,因此每个MPI作业都认为它在系统上单独运行,因此使用核心0和1

如果您知道将在同一台机器上运行多个作业,最简单的选项是禁用绑定

mpirun -bind-to none ...
我会成功的

更好的选择是使用资源管理器(如SLURM、PBS或其他),并确保构建了OpenMPI来支持它。 资源管理器将为每个作业分配不同的核心集,因此不再有重叠


最近有人问了一个类似的问题,请参见

上的另一个选项奇怪的是,当使用3个或更多进程时,我的问题不会发生。只有当我使用2时,mpi才会绑定到前两个核心。在所有其他情况下,mpi绑定到空闲的、未占用的内核。另一方面,使用
--bind to none
确实避免了我在问题中描述的问题。但是,我还不明白为什么,默认策略是将2个MPI任务绑定到core,否则绑定到socket。如果您使用3个MPI任务作业,那么套接字0最终将比套接字1拥有更多的任务。@DohnJoe,告诉所有同时使用系统的人将[t]csh的
导出OMPI\U MCA\U hwloc\U base\U binding\U policy=none
(或
设置ENV OMPI\U MCA\U hwloc\U base\U binding\U policy none
.bashrc
.zshrc
.whateverrc
)。这相当于指定
--bind to none
,但通过环境中的MCA参数实现。一旦Open MPI引入自动绑定,我们必须为群集的所有用户实现此功能。@hristoilev您不是在使用资源管理器吗?如果您使用的是(正确配置的)资源管理器和开放式MPI是为支持它而正确构建的,在运行平面MPI时不应该有任何问题。imho在运行混合MPI+OpenMP时禁用绑定只是一个较小的问题,默认情况下我不建议使用它。