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

Posted

技术标签:

【中文标题】无法将所有内核与 mpirun 一起使用【英文标题】:Unable to use all cores with mpirun 【发布时间】:2018-07-27 21:13:03 【问题描述】:

我正在我的桌面上测试一个简单的 MPI 程序(Ubuntu LTS 16.04/ Intel® Core™ i3-6100U CPU @ 2.30GHz × 4/ gcc 4.8.5 /OpenMPI 3.0.0)并且 mpirun 不会让我使用我机器上的所有内核 (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 个处理器。我对超额订阅感兴趣,我只想能够使用我所有的处理器。有人可以帮忙吗?

【问题讨论】:

你写了两次相同的mpirun 命令,你能解决这个问题吗? 【参考方案1】:

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

默认情况下,Open MPI 每个核心不会运行多个 MPI 任务。 您可以使用以下选项让 Open MPI 每个超线程最多运行一个 MPI 任务

mpirun --use-hwthread-cpus ...

FWIW

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

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

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

【讨论】:

【参考方案2】:

要解决您的问题,您可以使用mpirun--use-hwthread-cpus 命令行参数,正如Gilles Gouaillardet 已经指出的那样。在这种情况下,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 处理器。

【讨论】:

【参考方案3】:

使用$ 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

每个核心分配两个 MPI 进程

将 PrivateDataManager 与 (a)Smack 一起使用时,无法获取所有 BookMarkedRooms。总是只返回最后一个书签

将所有内核与 python 多处理一起使用

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

WCF 未将所有内核与 Visual Studio 2010 负载测试一起使用

工具栏将与所有内容一起滚动。否则不起作用