Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to use all cores with mpirun

Tags:

mpi

hpc

openmpi

I'm testing a simple MPI program on my desktop (Ubuntu LTS 16.04/ Intel® Core™ i3-6100U CPU @ 2.30GHz × 4/ gcc 4.8.5 /OpenMPI 3.0.0) and mpirun won't let me use all of the cores on my machine (4). When I run:

$ mpirun -n 4 ./test2

I get the following error:

--------------------------------------------------------------------------
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.
--------------------------------------------------------------------------

But if I run with:

$ mpirun -n 2 ./test2

everything works fine.

I've seen from other answers that I can check the number of processors with

cat /proc/cpuinfo | grep processor | wc -l

and this tells me that I have 4 processors. I'm not interested in oversubscribing, I'd just like to be able to use all my processors. Can anyone help?

like image 989
James Smith Avatar asked Feb 16 '18 22:02

James Smith


2 Answers

Your processor has 4 hyperthreads but only 2 cores (see the specs here).

By default, Open MPI does not run more than one MPI task per core. You can have Open MPI run up to one MPI task per hyperthread with the following option

mpirun --use-hwthread-cpus ...

FWIW

The command you mentioned reports the number of hyperthreads.

A better way to figure out the topology of a machine is via the lstopo command from the hwloc package.

MPI tasks are not bound on cores nor threads on OS X, so if you are running on a Mac, the --oversubscribe -np 4 would lead to the same result.

like image 97
Gilles Gouaillardet Avatar answered Oct 19 '22 03:10

Gilles Gouaillardet


To resolve your problem, you can use the --use-hwthread-cpus command line arguments for mpirun, as already pointed out by Gilles Gouaillardet. In this case, Open MPI will treat the thread provided by hyperthreading as the Open MPI processor. Otherwise, it will treat a CPU core as an Open MPI processor, which is the default behavior. When using --use-hwthread-cpus, it will correctly determine the total number of processors available to you, that is, all processors available on all hosts specified in the Open MPI host file. Therefore, you do not need to specify the "-n" parameter. In addition, when using the --use-hwthread-cpus command line parameter, Open MPI refers to the threads provided by hyperthreading as "hardware threads". With this technique, you will not oversubscribe, and if some Open MPI processor will run on a virtual machine, it will use the correct number of threads assigned to that virtual machine. And if your processor has more than two threads per core, as a Xeon Phi (Knights Mill, Knights Landing, etc.), it will take all four threads per core as an Open MPI processor.

like image 2
Maxim Masiutin Avatar answered Oct 19 '22 04:10

Maxim Masiutin