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

C++ 如何使用mpirun为不同的程序使用不同的CPU核?,c++,mpi,openmpi,C++,Mpi,Openmpi,我有一个32核的虚拟机。 我正在运行一些模拟,一次需要使用16个内核 我使用以下命令在16核上运行作业: mpirun-n 16程序名称参数>注销2>&1 该程序在16个核上运行 现在,如果我想用不同的参数在其余的内核上运行相同的程序,我会使用相同的命令,比如 mpirun-n 8程序名差异参数>日志1.out 2>&1 第二个过程使用与先前使用的相同的16个内核。 如何使用mpirun在8个不同的内核上运行此进程,而不是第一个作业使用的前16个内核 我使用的是无头Ubuntu 16.04。Op

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

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

mpirun-n 16程序名称参数>注销2>&1

该程序在16个核上运行

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

mpirun-n 8程序名差异参数>日志1.out 2>&1

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


我使用的是无头Ubuntu 16.04。

OpenMPI的启动器支持通过
--CPU set
选项限制CPU设置。它接受一组逻辑CPU,表示为
s0、s1、s2、…
形式的列表,其中每个列表条目都是一系列CPU
n-m
的单个逻辑CPU号

如果虚拟机中的逻辑CPU是连续编号的,则必须执行以下操作:

mpirun--cpu集0-15--bind to core-n 16 program\u name args>log.out 2>&1
mpirun--cpu集16-23--绑定到核心-n8程序\u name diff\u args>log\u 1.out 2>&1
--bind to core
告诉Open MPI将进程绑定到单独的核心,同时遵守
--CPU set
参数中提供的CPU集

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


(请注意,
lstopo
使用了令人困惑的命名约定,并将操作系统逻辑CPU称为物理CPU,因此请在
(p#n)
条目中查找数字。
lstopo-p
隐藏
hwloc
逻辑数字并防止混淆。)

您确定您有32个真正的内核,而不仅仅是16个以上的超线程吗?否则,您的操作系统的调度程序将负责此操作。您使用的是哪个版本的OpenMPI?最近的版本绑定到NUMA域(例如,大多数情况下是套接字),因此看起来有点奇怪。如果您
mpirun-np 16 grep cpu\u allowed\u list/proc/self/status
,该怎么办?@HenriMenke是的,我有32个实核,而不是16个超线程。@GillesGouaillardet包版本是
1.10.2
。我还为16和32个值运行了上述命令,
cpu\u allowed\u列表:
给出了所有不同的值,其中,就好像我为32个以上的值运行一样,它将值指定为
0-31
1.10.2
现在已经过时。一个简单的选项是
mpirun-bind to none…
以禁用绑定(并由操作系统决定)