无法将所有内核与 mpirun 一起使用

Unable to use all cores with mpirun

我正在桌面上测试一个简单的 MPI 程序 (Ubuntu LTS 16.04/ Intel® Core™ i3-6100U CPU @ 2.30GHz × 4/ gcc 4.8.5 /OpenMPI 3.0 .0) 和 mpi运行 不会让我使用我机器上的所有内核 (4)。当我 运行:

$ mpirun -n 4 ./test2

我收到以下错误:

--------------------------------------------------------------------------
There are not enough slots available in the system to satisfy the 4 slots
that were requested by the application:
  ./test2

Either request fewer slots for your application, or make more slots available
for use.
--------------------------------------------------------------------------

但是如果我 运行 有:

$ mpirun -n 2 ./test2

一切正常。

我从其他答案中看到我可以使用

检查处理器的数量
cat /proc/cpuinfo | grep processor | wc -l

这告诉我我有 4 个处理器。我 对超额订阅感兴趣,我只是希望能够使用我所有的处理器。有人可以帮忙吗?

您的处理器有 4 个超线程但只有 2 个内核(参见规格 here)。

默认情况下,Open MPI 每个内核不会 运行 超过一个 MPI 任务。 使用以下选项

,每个超线程最多可以让 Open MPI 运行 执行一个 MPI 任务
mpirun --use-hwthread-cpus ...

FWIW

您提到的命令报告了超线程数。

找出机器拓扑结构的更好方法是通过 hwloc 包中的 lstopo 命令。

MPI 任务不绑定在核心上,也不绑定在 OS X 上的线程上,因此如果您 运行ning 在 Mac 上,--oversubscribe -np 4 将导致同样的结果。

使用 $ lscpu number of cores per socket * number of sockets 会给你物理内核的数量(你可以用于 mpi 的内核),而 number of cores per socket * number of sockets * threads per core 会给你逻辑内核的数量(使用命令 $ cat /proc/cpuinfo | grep processor | wc -l)

获得的一个

要解决您的问题,您可以对 mpirun 使用 --use-hwthread-cpus 命令行参数,正如 已经指出的那样。在这种情况下,Open MPI 会将超线程提供的线程视为 Open MPI 处理器。否则,它将 CPU 核心视为 Open MPI 处理器,这是默认行为。当使用 --use-hwthread-cpus 时,它会正确地确定您可用的处理器总数,即 Open MPI 主机文件中指定的所有主机上可用的所有处理器。因此,您不需要指定“-n”参数。另外,当使用--use-hwthread-cpus命令行参数时,Open MPI将超线程提供的线程称为“硬件线程”。使用这种技术,您不会超额订阅,如果某些 Open MPI 处理器将 运行 在虚拟机上使用,它将使用分配给该虚拟机的正确线程数。如果您的处理器每个内核有两个以上的线程,作为 Xeon Phi(Knights Mill、Knights Landing 等),它将作为 Open MPI 处理器在每个内核上使用所有四个线程。