Math-Linux.com

Knowledge base dedicated to Linux and applied mathematics.

Home > Linux > Tip of the day > Speedup GNU make build and compilation process

Speedup GNU make build and compilation process

All the versions of this article: [English] [français]

Building/compiling libraries or projects frequently with GNU make takes long time. To speed up these builds you can use make -jN where N is the number of parallel builds. For example:

make -j4

will make 4 parallel builds.

Hardware considerations

Of course, you can’t do something like

make -j256

This is the best way to get your computer hangs !!!
You must check your hardware CPU informations. How many processors (cores) you have (including multi-threading):

NB_CORES=$(grep -c '^processor' /proc/cpuinfo)

You can also use dmidecode :

dmidecode -t processor | grep "Core Count"
Core Count: 8
Core Count: 8

here you got two processors (2 times Core Count) with 8 cores. You can also use
lspcu command:

lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              7
CPU MHz:               1998.000
BogoMIPS:              4999.98
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              3072K
NUMA node0 CPU(s):     0-3

System considerations

Once you get your number of cores, we must keep a responsive system. We use -l options of make
-l [load], —load-average[=load]
Specifies that no new jobs (commands) should be started if there are others jobs running and the load average is at least load

To get a full saturation of the processors without hanging your system, export
the following environment variable MAKEFLAGS:

NB_CORES=$(grep -c '^processor' /proc/cpuinfo)
export MAKEFLAGS="-j$((NB_CORES+1)) -l${NB_CORES}"
make

Or:

NB_CORES=$(grep -c '^processor' /proc/cpuinfo)
make -j$((NB_CORES+1)) -l${NB_CORES}

It means here that the load average does not exceed number of cores.

Persistent settings

To get these settings persistent, just add in your .bashrc or .bash_profile:

NB_CORES=$(grep -c '^processor' /proc/cpuinfo)
export MAKEFLAGS="-j$((NB_CORES+1)) -l${NB_CORES}"

At last a commandline example

I you dont want particular settings , just use commandline:

make -j9 -l8

Remarks

You can usually get away with having twice as many jobs as you do CPUs if you have a decent amount of RAM. If your CPU supports hyper-threading then you can often get by with twice as many again. That’s 128 jobs if you have a 32 dual core machine with hyper-threading! (Thanks to Andrew Stormont for his contribution)

Any message or comments?

comments powered by Disqus