如何在不触及其他内核的情况下停止 mpirun 将多个作业分配给相同的内核

How to stop mpirun allocating multiple jobs to the same cores without touching other cores

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

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

的行为

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

非常感谢!

当 运行 2 MPI 任务作业时,Open MPI 的默认行为是 --bind-to core

这里的问题是,从终端启动的 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
...

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