我有一个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。
答案 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
逻辑数字并防止混淆。)