无法将所有内核与 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 一起使用的主要内容,如果未能解决你的问题,请参考以下文章
将 PrivateDataManager 与 (a)Smack 一起使用时,无法获取所有 BookMarkedRooms。总是只返回最后一个书签
为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?