首页 > 解决方案 > 如何停止 mpirun 将多个作业分配给同一个核心而不接触其他核心

问题描述

我是 mpirun 的新手,我遇到了一个小问题。我有 n 个作业,我只想在我的机器的 2 个内核上运行,所以我打开 n 个终端窗口并 mpirun -np 2 [program] 在每个终端窗口中使用常用的,但不是使用 2*n 个内核,而是只使用其中的一小部分,并且应用程序非常慢,这让我相信 mpirun 正在将多个作业堆叠在同一个内核上,而不会触及同一个 CPU 上的其他内核,这使得作业速度慢得令人难以忍受,并且总体上降低了工作流程的效率......

我尝试 --bind-to core 在每次调用中使用该选项,但这似乎并没有改变 mpirun 的行为...

什么可能导致这种行为,我该如何解决它,以便在没有足够的核心来满足需求之前它不会在相同的核心上堆叠作业?

非常感谢!

标签: parallel-processingmpi

解决方案


Open MPI 的默认行为是--bind-to core在运行 2 个 MPI 任务作业时。

这里的问题是,从终端启动的 MPI 作业是独立的,它们都将任务 0 固定在 cpu 0 上,并将任务 1 固定在 cpu 1 上,因此它们最终会分时共享前两个内核。

一个较小的坏处是--bind-to none阻止 Open MPI 绑定 MPI 任务,并让 Linux 调度程序使用所有可用的内核。您可以确保在任何给定时间运行的 MPI 任务不超过内核(否则您将返回时间共享)。

正确的解决方法是使用诸如 SLURM 之类的作业调度程序,这将确保任何给定核心在任何给定时间运行的 MPI 任务不超过一个。

手动解决方案是将每个 MPI 作业手动限制为两个核心

$ taskset -c 0,1 mpirun -np 2 a.out
$ taskset -c 2,3 mpirun -np 2 a.out
...

但是,两个工作之间不共享任何核心仍然取决于您。


推荐阅读