自动设置多核机器的作业(-j)标志?

Kar*_*ine 59 parallel-processing makefile build-script

我在一台拥有大量核心的机器上有一个Makefile,但是-jX在编译我的项目时我似乎总是忘记编写它需要的时间比它应该的长.

有没有什么方法可以-j通过环境变量或其他一些持久性配置文件设置标志,以便make在这台机器上自动并行执行多个作业?

Sam*_*ler 39

我假设你正在使用Linux.这是来自我的~/.bashrc

# parallel make
export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
alias pmake='time nice make -j$NUMCPUS --load-average=$NUMCPUS'
Run Code Online (Sandbox Code Playgroud)

样品用法

samm@host src> echo $NUMCPUS
8
samm@host src> pmake
Run Code Online (Sandbox Code Playgroud)

成为time nice make -j8 --load-average=8.

为了回答你关于这个问题的具体问题Makefile,我觉得在我的Makefiles中散布这个逻辑是不切实际的.把它放到顶级Makefile也不是一个很好的解决方案,因为我经常从子目录构建并希望并行构建它们.但是,如果您有一个相当平坦的源层次结构,它可能适合您.

  • 您还可以使用`nproc`命令获得cpus的数量. (3认同)

Jer*_*ock 34

MAKEFLAGS环境变量似乎可以传递属于每次make运行的标志(至少对于GNU make).我自己并没有太多运气,但可能会使用-l而不是-j自动运行适合您可用核心数量的多个作业.


jco*_*and 28

正如Jeremiah Willcock所说,使用MAKEFLAGS,但这里是如何做到的:

export MAKEFLAGS="-j $(grep -c ^processor /proc/cpuinfo)"
Run Code Online (Sandbox Code Playgroud)

或者您可以像这样设置一个固定值:

export MAKEFLAGS="-j 8"
Run Code Online (Sandbox Code Playgroud)

如果你真的想要提高性能,你应该ccache通过添加如下内容来使用Makefile:

CCACHE_EXISTS := $(shell ccache -V)
ifdef CCACHE_EXISTS
    CC := ccache $(CC)
    CXX := ccache $(CXX)
endif
Run Code Online (Sandbox Code Playgroud)

  • 不适用于osx(以及windows) (2认同)

Bl0*_*und 17

我通常在我的bash脚本中执行以下操作:

make -j$(nproc)
Run Code Online (Sandbox Code Playgroud)


Sda*_*ons 6

您可以在Makefile中添加一行,类似于以下内容:

NUMJOBS=${NUMJOBS:-" -j4 "}
Run Code Online (Sandbox Code Playgroud)

然后${NUMJOBS}在规则中添加一行,或将其添加到另一个Makefilevar(如MAKEFLAGS)中.这将使用NUMJOBS envvar(如果存在); 如果没有,自动使用-j4.您可以根据自己的喜好调整或重命名.

(注:就个人而言,我更喜欢默认的是-j1"",尤其是如果它要分发给其他人,因为虽然我有多个内核还,我编译在许多不同的平台,并经常忘记DIS -able的-jX设置. )


svl*_*sov 6

别名不会在脚本内扩展.最好创建一个单独的make脚本并将其放入其中一个$PATH目录中:

#!/bin/sh

if [ -f /proc/cpuinfo ]; then
    CPUS=`grep processor /proc/cpuinfo | wc -l`
else
    CPUS=1
fi
/usr/bin/make -j`expr $CPUS + 1` "$@"
Run Code Online (Sandbox Code Playgroud)