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

标签 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 个内核。

我正在使用 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/

相关文章:

c++ - 使用 MPI Scatter 分配数字 - 错误

c++ - ctags 没有索引类成员函数

c++ - C++运算符重载错误:在只读对象中分配成员“”

c - C 中的结构序列化并通过 MPI 传输

c - 在 C 中使用 MPI_Type_Vector 和 MPI_Gather

c++ - 信号 : Segmentation fault (11) when using Openmpi

c++ - 深度图像上的表面法线

c++计算编译时间常数,同时防止整数常数溢出

c - 我是否需要为 MPI::Isend 提供相应的 MPI::Irecv?

c++ - 将 OpenMPI 或 MPICH 与 Boost MPI 一起使用 Win 和 Linux 机器