我有一个 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 个内核。
我正在使用 headless Ubuntu 16.04。
最佳答案
Open MPI 的启动器支持通过 --cpu-set
选项限制 CPU 集。它接受一组逻辑 CPU,表示为 s0,s1,s2,...
形式的列表,其中每个列表条目是 CPU 范围内的单个逻辑 CPU 编号 n-m
.
假设你的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 将进程绑定(bind)到每个单独的内核,同时尊重 --cpu-set
参数中提供的 CPU 集。
使用诸如 lstopo
(Open MPI 的 hwloc
库的一部分)之类的工具可能有助于获取系统的拓扑结构,这有助于选择正确的 CPU 编号,例如,防止绑定(bind)到超线程,尽管这在虚拟化环境中意义不大。
(请注意,lstopo
使用令人困惑的命名约定并将操作系统逻辑 CPU 物理 称为操作系统逻辑 CPU,因此请在 (P#n)
条目。lstopo -p
隐藏 hwloc
逻辑数字并防止混淆。)
关于c++ - 如何使用mpirun为不同的程序使用不同的CPU内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47784610/