如何使用mpirun为不同的程序使用不同的CPU内核?

时间:2017-12-13 02:29:57

标签: c++ mpi openmpi

我有一个32核的虚拟机。 我正在运行一些模拟,我需要一次使用16个核心。

我使用以下命令在16个核心上运行作业:

  

mpirun -n 16 program_name args > log.out 2>& 1

该程序在16个核心上运行。

现在,如果我想在其余核心上使用不同的参数运行相同的程序,我会使用相同的命令,如

  

mpirun -n 8 program_name diff_args > log_1.out 2>& 1

第二个过程使用之前使用的相同的16个核心。 如何使用mpirun在8个不同的核心上运行此过程,而不是之前的第一个作业使用的16个核心。

我正在使用无头Ubuntu 16.04。

1 个答案:

答案 0 :(得分:2)

Open MPI的启动器支持通过--cpu-set选项限制CPU集。它接受一组逻辑CPU,表示为s0,s1,s2,...形式的列表,其中每个列表条目是一系列CPU n-m的单个逻辑CPU编号。

如果VM中的逻辑CPU连续编号,您需要做的是:

mpirun --cpu-set  0-15 --bind-to core -n 16 program_name args > log.out 2>&1
mpirun --cpu-set 16-23 --bind-to core -n  8 program_name diff_args > log_1.out 2>&1

--bind-to core告诉Open MPI将进程绑定到单独的核心,同时尊重--cpu-set参数中提供的CPU集。

使用诸如lstopo(Open {MPI的hwloc库的一部分)之类的工具来获取系统的拓扑结构可能会有所帮助,这有助于选择正确的CPU数量,例如,防止绑定到超线程,尽管这在虚拟化环境中没那么有意义。

(请注意lstopo使用混乱的命名约定并调用操作系统逻辑CPU physical ,因此请查找(P#n)条目中的数字。lstopo -p隐藏hwloc逻辑数字并防止混淆。)