我正在我的桌面上测试一个简单的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个处理器。我不对超额订阅感兴趣,我只是希望能够使用我的所有处理器。有人可以帮忙吗?
答案 0 :(得分:8)
您的处理器有4个超线程但只有2个核心(请参阅规范here)。
默认情况下,Open MPI不会为每个核心运行多个MPI任务。 使用以下选项
,每个超线程可以使Open MPI最多运行一个MPI任务mpirun --use-hwthread-cpus ...
FWIW
您提到的命令会报告超线程的数量。
通过lstopo
包中的hwloc
命令找出计算机拓扑结构的更好方法。
MPI任务未绑定在OS X上的内核和线程上,因此如果您在Mac上运行,--oversubscribe -np 4
将导致相同的结果。
答案 1 :(得分:0)
使用$ lscpu
number of cores per socket * number of sockets
会为您提供物理内核的数量(可以用于mpi的内核),其中sockets per core * number of sockets * threads per core
将为您提供多个逻辑内核(你可以使用命令$ cat /proc/cpuinfo | grep processor | wc -l
)
答案 2 :(得分:0)
要解决您的问题,您可以使用 --use-hwthread-cpus
的 mpirun
命令行参数。在这种情况下,Open MPI 会将超线程提供的线程视为 Open MPI 处理器。否则,它会将 CPU 内核视为 Open MPI 处理器,这是默认行为。使用 --use-hwthread-cpus
时,它将正确确定您可用的处理器总数,即 Open MPI 主机文件中指定的所有主机上可用的所有处理器。因此,您不需要指定“-n”参数。此外,在使用 --use-hwthread-cpus
命令行参数时,Open MPI 将超线程提供的线程称为“硬件线程”。使用此技术,您将不会超额订阅,并且如果某个 Open MPI 处理器将在虚拟机上运行,它将使用分配给该虚拟机的正确线程数。如果您的处理器每个内核有两个以上的线程,作为 Xeon Phi (Knights Landing),它会将每个内核的所有四个线程作为 Open MPI 处理器。